diff --git a/RCM/Config.cs b/RCM/Config.cs index beda2f5..3089e36 100644 --- a/RCM/Config.cs +++ b/RCM/Config.cs @@ -11,9 +11,8 @@ using System.Windows.Forms; namespace RCM { public static class Config { - private static readonly char[] _equals = new char[] { '=' }; - private static readonly char[] _brackets = new char[] { '[', ']' }; - private static readonly string _fileName = "RCM.conf"; + private static readonly string _dirName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RCM"); + private static readonly string _fileName = Path.Combine(_dirName, "RCM.conf"); private static Icon _emptyIcon; public static ImageList IconList { get; } = new ImageList() { ColorDepth = ColorDepth.Depth32Bit, ImageSize = new Size(20, 20) }; @@ -76,6 +75,9 @@ namespace RCM { JArray json = new JArray(DataSources.Select(dataSource => ConfigSerializer.ObjToJson(dataSource)) .Union(ConfigSections.Values.Select(configSection => ConfigSerializer.ObjToJson(configSection))) .Union(_uknownSections)); + if (!Directory.Exists(_dirName)) { + Directory.CreateDirectory(_dirName); + } File.WriteAllText(_fileName, ConfigSerializer.JsonToString(json)); } } diff --git a/RCM/ConfigForm.Designer.cs b/RCM/ConfigForm.Designer.cs index e87dfde..102c2e5 100644 --- a/RCM/ConfigForm.Designer.cs +++ b/RCM/ConfigForm.Designer.cs @@ -23,6 +23,7 @@ /// the contents of this method with the code editor. /// private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigForm)); this.treeView = new System.Windows.Forms.TreeView(); this.tabControl = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); @@ -103,7 +104,7 @@ this.panelDataSource.Location = new System.Drawing.Point(10, 53); this.panelDataSource.Name = "panelDataSource"; this.panelDataSource.Size = new System.Drawing.Size(307, 373); - this.panelDataSource.TabIndex = 19; + this.panelDataSource.TabIndex = 2; // // buttonSave // @@ -112,7 +113,7 @@ this.buttonSave.Location = new System.Drawing.Point(131, 432); this.buttonSave.Name = "buttonSave"; this.buttonSave.Size = new System.Drawing.Size(175, 23); - this.buttonSave.TabIndex = 18; + this.buttonSave.TabIndex = 3; this.buttonSave.Text = "Save changes"; this.buttonSave.UseVisualStyleBackColor = true; this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); @@ -123,7 +124,7 @@ this.textBoxTitle.Location = new System.Drawing.Point(130, 9); this.textBoxTitle.Name = "textBoxTitle"; this.textBoxTitle.Size = new System.Drawing.Size(175, 20); - this.textBoxTitle.TabIndex = 17; + this.textBoxTitle.TabIndex = 1; // // labelTitle // @@ -140,6 +141,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(574, 496); this.Controls.Add(this.tabControl); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "ConfigForm"; this.Text = "Configuration - Remote Connection Manager"; this.tabControl.ResumeLayout(false); diff --git a/RCM/ConfigForm.cs b/RCM/ConfigForm.cs index c18fb9e..a379f82 100644 --- a/RCM/ConfigForm.cs +++ b/RCM/ConfigForm.cs @@ -1,11 +1,4 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace RCM { @@ -24,7 +17,6 @@ namespace RCM { treeView.ImageList = Config.IconList; treeView.ContextMenuStrip = GetNewDataSourceContextMenu(); foreach (IDataSource dataSource in Config.DataSources) { - string dataSourceType = dataSource.GetType().FullName; treeView.Nodes.Add(CreateTreeNodeFromDataSource(dataSource)); SortTreeAndSelectNode(null); } @@ -39,7 +31,7 @@ namespace RCM { #region TreeView display private TreeNode CreateTreeNodeFromDataSource(IDataSource dataSource) { string imageKey = dataSource.GetType().FullName; - return new TreeNode(dataSource.Title) { Tag = dataSource, ImageKey = imageKey, SelectedImageKey = imageKey, ContextMenuStrip = GetContextMenu(dataSource) }; + return new TreeNode(dataSource.Title) { Tag = dataSource, ImageKey = imageKey, SelectedImageKey = imageKey, ContextMenuStrip = GetContextMenu() }; } private void SortTreeAndSelectNode(TreeNode node) { @@ -107,7 +99,8 @@ namespace RCM { IDataSource dataSource = (IDataSource)e.Node.Tag; dataSource.Title = e.Label; Config.Save(); - BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6 + // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6 + BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); } private void ButtonSave_Click(object sender, EventArgs e) { @@ -117,6 +110,7 @@ namespace RCM { dataSource.Title = selectedNode.Text = textBoxTitle.Text; Config.Save(); SortTreeAndSelectNode(selectedNode); + MessageBox.Show("Data source changes saved", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void NewDataSourceContextMenuItem_Click(object sender, EventArgs e) { @@ -159,7 +153,7 @@ namespace RCM { ContextMenuStrip menu = new ContextMenuStrip(); ToolStripMenuItem menuItem = new ToolStripMenuItem("New item"); foreach (Type type in Config.DataSourceTypes) { - ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type }; + ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type, Image = Config.IconList.Images[type.FullName] }; item.Click += NewDataSourceContextMenuItem_Click; menuItem.DropDownItems.Add(item); } @@ -167,7 +161,7 @@ namespace RCM { return menu; } - private ContextMenuStrip GetContextMenu(IDataSource dataSource) { + private ContextMenuStrip GetContextMenu() { ContextMenuStrip menu = new ContextMenuStrip(); ToolStripMenuItem duplicateItem = new ToolStripMenuItem("Duplicate item"); duplicateItem.Click += DuplicateDataSourceContextMenuItem_Click; diff --git a/RCM/ConfigForm.resx b/RCM/ConfigForm.resx index 1af7de1..f6c64fb 100644 --- a/RCM/ConfigForm.resx +++ b/RCM/ConfigForm.resx @@ -117,4 +117,467 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA + BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ + AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm + AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA + AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP////////// + /////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA + AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA + AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI + //////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI + eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP + /wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA + AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP + /wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA + AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP + /wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA + AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP + /wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA + AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP + //////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA + AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA + AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA + AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/ + AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA + AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH + AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/ + ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf + AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP// + ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP// + AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP// + ////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA + AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/ + cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA + AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA + AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/ + AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3 + AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA + AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A + AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/ + /gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA + BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA + wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA//// + ////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI + iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA + AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn + cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA + AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA// + wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA + AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA + AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH + AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w + AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn + AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA + AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d + HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY + WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1 + tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA + AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/ + ////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7///////////////// + ////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU + AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f + AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n + BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH + ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP////////////// + //////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk + JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA + GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA + AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA + BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA + BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd//// + GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA + AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY + ////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA + BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK/// + /xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE + AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj + JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL + AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/ + AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA + AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH + AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/ + ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf + AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP// + ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB + AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09 + PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG + hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF + BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp + KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE + ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF + BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp + KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA + KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk + AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK + JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA + CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA + AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA + AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA + AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d + HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF + ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV + BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/ + /4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA + BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA + AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK + SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj + owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq + KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA + AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl + JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q + FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA + AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp + CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP + EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG + AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA + AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA + DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA + wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp + KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho + aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo + 6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA + AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA + AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA + AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA + AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA + AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j + AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA + AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL + S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA + AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+ + /v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL + S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx + sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+ + /v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA + AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA + AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA + AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA + AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA + AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA + AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA + AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL + S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v// + //+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER + Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8 + /P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3 + 9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA + AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA + ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky + sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P + j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA + AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF + xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA + AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho + aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ + Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3 + 9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7 + +/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3 + 9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA + AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA + AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA + ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL + S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL + S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA + AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3 + 9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ + Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL + S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy + sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA + ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA + AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA + AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+ + /v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA + AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA + AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA + AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA + ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/ + AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA + AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA + AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/ + //8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA + AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA + AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH + h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2 + dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA + AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA + ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA + AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O + Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA + AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA + AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG + hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG + hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2 + 9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA + 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 + + \ No newline at end of file diff --git a/RCM/ConfigFormTab.cs b/RCM/ConfigFormTab.cs index 9b3d8d1..49a127f 100644 --- a/RCM/ConfigFormTab.cs +++ b/RCM/ConfigFormTab.cs @@ -1,11 +1,4 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace RCM { @@ -22,6 +15,7 @@ namespace RCM { private void ButtonSave_Click(object sender, EventArgs e) { _configSection.UpdateFromControl(); Config.Save(); + MessageBox.Show(string.Format("{0} changes saved", _configSection.GetType().GetDisplayName()), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } diff --git a/RCM/ConfigSerializer.cs b/RCM/ConfigSerializer.cs index 854df2f..f99b672 100644 --- a/RCM/ConfigSerializer.cs +++ b/RCM/ConfigSerializer.cs @@ -24,7 +24,7 @@ namespace RCM { public static string JsonToString(JToken json) { var stringWriter = new StringWriter(); - var jsonWriter = new JsonTextWriter(stringWriter) { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }; + var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented }; new JsonSerializer().Serialize(jsonWriter, json); return stringWriter.ToString(); } @@ -50,7 +50,7 @@ namespace RCM { Array.Copy(cipherbytes, salt, 16); Array.Copy(cipherbytes, 16, iv, 0, 16); using (AesManaged aes = new AesManaged() { KeySize = 128 }) - using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 1024)) + using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 16)) using (ICryptoTransform decryptor = aes.CreateDecryptor(pbkdf2.GetBytes(16), iv)) using (MemoryStream memoryStream = new MemoryStream()) using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write)) @@ -62,7 +62,7 @@ namespace RCM { } public static object DecryptObject(byte[] cipherbytes, string password) { - return StringToObj(Encoding.ASCII.GetString(Decrypt(cipherbytes, password))); + return StringToObj(Encoding.Unicode.GetString(Decrypt(cipherbytes, password))); } public static byte[] Encrypt(byte[] plaintext, string password) { @@ -71,7 +71,7 @@ namespace RCM { } using (AesManaged aes = new AesManaged() { KeySize = 128 }) { aes.GenerateIV(); - using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, 16, 1024)) + using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, 16, 16)) using (ICryptoTransform encryptor = aes.CreateEncryptor(pbkdf2.GetBytes(16), aes.IV)) using (MemoryStream memoryStream = new MemoryStream()) using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) @@ -84,7 +84,7 @@ namespace RCM { } public static byte[] EncryptObject(object obj, string password) { - return Encrypt(Encoding.ASCII.GetBytes(ObjToString(obj)), password); + return Encrypt(Encoding.Unicode.GetBytes(ObjToString(obj)), password); } } } diff --git a/RCM/DataSource/MySQL/MySQLControl.Designer.cs b/RCM/DataSource/MySQL/MySQLControl.Designer.cs index a266287..ff35212 100644 --- a/RCM/DataSource/MySQL/MySQLControl.Designer.cs +++ b/RCM/DataSource/MySQL/MySQLControl.Designer.cs @@ -103,7 +103,7 @@ this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 104); this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword"; this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22); - this.buttonUnmaskEncPassword.TabIndex = 17; + this.buttonUnmaskEncPassword.TabIndex = 7; this.buttonUnmaskEncPassword.Text = "●"; this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true; this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click); @@ -113,7 +113,7 @@ this.textBoxEncPassword.Location = new System.Drawing.Point(120, 105); this.textBoxEncPassword.Name = "textBoxEncPassword"; this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20); - this.textBoxEncPassword.TabIndex = 16; + this.textBoxEncPassword.TabIndex = 6; this.textBoxEncPassword.UseSystemPasswordChar = true; // // textBoxDatabase @@ -121,7 +121,7 @@ this.textBoxDatabase.Location = new System.Drawing.Point(120, 79); this.textBoxDatabase.Name = "textBoxDatabase"; this.textBoxDatabase.Size = new System.Drawing.Size(175, 20); - this.textBoxDatabase.TabIndex = 15; + this.textBoxDatabase.TabIndex = 5; // // label1 // @@ -146,7 +146,7 @@ this.buttonTestConnection.Location = new System.Drawing.Point(120, 132); this.buttonTestConnection.Name = "buttonTestConnection"; this.buttonTestConnection.Size = new System.Drawing.Size(175, 23); - this.buttonTestConnection.TabIndex = 20; + this.buttonTestConnection.TabIndex = 8; this.buttonTestConnection.Text = "Test connection"; this.buttonTestConnection.UseVisualStyleBackColor = true; this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click); @@ -156,7 +156,7 @@ this.buttonCreateSchema.Location = new System.Drawing.Point(120, 161); this.buttonCreateSchema.Name = "buttonCreateSchema"; this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23); - this.buttonCreateSchema.TabIndex = 21; + this.buttonCreateSchema.TabIndex = 9; this.buttonCreateSchema.Text = "Create schema"; this.buttonCreateSchema.UseVisualStyleBackColor = true; this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click); diff --git a/RCM/DataSource/MySQL/MySQLControl.resx b/RCM/DataSource/MySQL/MySQLControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RCM/DataSource/MySQL/MySQLControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RCM/DataSource/SQLite/SQLiteControl.Designer.cs b/RCM/DataSource/SQLite/SQLiteControl.Designer.cs index 664563d..74f0da4 100644 --- a/RCM/DataSource/SQLite/SQLiteControl.Designer.cs +++ b/RCM/DataSource/SQLite/SQLiteControl.Designer.cs @@ -39,7 +39,7 @@ this.buttonSelectDatabase.Location = new System.Drawing.Point(273, -1); this.buttonSelectDatabase.Name = "buttonSelectDatabase"; this.buttonSelectDatabase.Size = new System.Drawing.Size(22, 22); - this.buttonSelectDatabase.TabIndex = 4; + this.buttonSelectDatabase.TabIndex = 2; this.buttonSelectDatabase.Text = "⋯"; this.buttonSelectDatabase.UseVisualStyleBackColor = true; this.buttonSelectDatabase.Click += new System.EventHandler(this.ButtonSelectDatabase_Click); @@ -49,7 +49,7 @@ this.buttonUnmaskEncPassword.Location = new System.Drawing.Point(273, 25); this.buttonUnmaskEncPassword.Name = "buttonUnmaskEncPassword"; this.buttonUnmaskEncPassword.Size = new System.Drawing.Size(22, 22); - this.buttonUnmaskEncPassword.TabIndex = 17; + this.buttonUnmaskEncPassword.TabIndex = 4; this.buttonUnmaskEncPassword.Text = "●"; this.buttonUnmaskEncPassword.UseVisualStyleBackColor = true; this.buttonUnmaskEncPassword.Click += new System.EventHandler(this.ButtonUnmaskEncPassword_Click); @@ -59,7 +59,7 @@ this.textBoxEncPassword.Location = new System.Drawing.Point(120, 26); this.textBoxEncPassword.Name = "textBoxEncPassword"; this.textBoxEncPassword.Size = new System.Drawing.Size(147, 20); - this.textBoxEncPassword.TabIndex = 16; + this.textBoxEncPassword.TabIndex = 3; this.textBoxEncPassword.UseSystemPasswordChar = true; // // textBoxDatabase @@ -67,7 +67,7 @@ this.textBoxDatabase.Location = new System.Drawing.Point(120, 0); this.textBoxDatabase.Name = "textBoxDatabase"; this.textBoxDatabase.Size = new System.Drawing.Size(147, 20); - this.textBoxDatabase.TabIndex = 15; + this.textBoxDatabase.TabIndex = 1; // // labelEncPassword // @@ -92,7 +92,7 @@ this.buttonTestConnection.Location = new System.Drawing.Point(120, 53); this.buttonTestConnection.Name = "buttonTestConnection"; this.buttonTestConnection.Size = new System.Drawing.Size(175, 23); - this.buttonTestConnection.TabIndex = 20; + this.buttonTestConnection.TabIndex = 5; this.buttonTestConnection.Text = "Test connection"; this.buttonTestConnection.UseVisualStyleBackColor = true; this.buttonTestConnection.Click += new System.EventHandler(this.ButtonTestConnection_Click); @@ -102,7 +102,7 @@ this.buttonCreateSchema.Location = new System.Drawing.Point(120, 82); this.buttonCreateSchema.Name = "buttonCreateSchema"; this.buttonCreateSchema.Size = new System.Drawing.Size(175, 23); - this.buttonCreateSchema.TabIndex = 21; + this.buttonCreateSchema.TabIndex = 6; this.buttonCreateSchema.Text = "Create schema"; this.buttonCreateSchema.UseVisualStyleBackColor = true; this.buttonCreateSchema.Click += new System.EventHandler(this.ButtonCreateSchema_Click); diff --git a/RCM/DataSource/SQLite/SQLiteControl.resx b/RCM/DataSource/SQLite/SQLiteControl.resx new file mode 100644 index 0000000..5e7f0a6 --- /dev/null +++ b/RCM/DataSource/SQLite/SQLiteControl.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/RCM/DisplayName.cs b/RCM/DisplayName.cs index 6e03a83..11854f5 100644 --- a/RCM/DisplayName.cs +++ b/RCM/DisplayName.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; namespace RCM { public class DisplayName : Attribute { diff --git a/RCM/Group.cs b/RCM/Group.cs index 56fcb10..4de27d0 100644 --- a/RCM/Group.cs +++ b/RCM/Group.cs @@ -1,11 +1,10 @@ -using Newtonsoft.Json; -using System; +using System; using System.Windows.Forms; namespace RCM { [Serializable] [DisplayName("Group")] - public class Group : IRecord { // TODO: Prvni v poradi new items + public class Group : IRecord { public Guid Id { get; set; } public string Title { get; set; } public Guid GroupId { get; set; } diff --git a/RCM/IConfigSection.cs b/RCM/IConfigSection.cs index 592458d..30c4bbd 100644 --- a/RCM/IConfigSection.cs +++ b/RCM/IConfigSection.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Windows.Forms; +using System.Windows.Forms; namespace RCM { public interface IConfigSection { diff --git a/RCM/IRecord.cs b/RCM/IRecord.cs index 65aed6f..10c115d 100644 --- a/RCM/IRecord.cs +++ b/RCM/IRecord.cs @@ -6,8 +6,6 @@ namespace RCM { Guid Id { get; set; } string Title { get; set; } Guid GroupId { get; set; } - // DateTime LastUpdate { get; set; } - IAction[] GetActions(); UserControl GetControl(); void UpdateFromControl(); diff --git a/RCM/MainForm.Designer.cs b/RCM/MainForm.Designer.cs index cb4117d..3df8b5a 100644 --- a/RCM/MainForm.Designer.cs +++ b/RCM/MainForm.Designer.cs @@ -29,6 +29,7 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.treeView = new System.Windows.Forms.TreeView(); this.splitContainer = new System.Windows.Forms.SplitContainer(); this.buttonConfig = new System.Windows.Forms.Button(); @@ -42,12 +43,17 @@ this.timerDataSourceRefresh = new System.Windows.Forms.Timer(this.components); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolStripStatusLastRefresh = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusFailedFlag = new System.Windows.Forms.ToolStripStatusLabel(); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.contextMenuNotifyIcon = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuShowMainForm = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuCloseMainForm = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); this.statusStrip.SuspendLayout(); + this.contextMenuNotifyIcon.SuspendLayout(); this.SuspendLayout(); // // treeView @@ -62,7 +68,7 @@ this.treeView.Location = new System.Drawing.Point(3, 30); this.treeView.Name = "treeView"; this.treeView.Size = new System.Drawing.Size(244, 440); - this.treeView.TabIndex = 0; + this.treeView.TabIndex = 3; this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.TreeView_AfterLabelEdit); this.treeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterCollapse); this.treeView.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterExpand); @@ -105,7 +111,7 @@ this.buttonConfig.Location = new System.Drawing.Point(3, 1); this.buttonConfig.Name = "buttonConfig"; this.buttonConfig.Size = new System.Drawing.Size(24, 24); - this.buttonConfig.TabIndex = 2; + this.buttonConfig.TabIndex = 1; this.buttonConfig.UseVisualStyleBackColor = true; this.buttonConfig.Click += new System.EventHandler(this.ButtonConfig_Click); // @@ -118,7 +124,7 @@ this.comboBoxDatabase.Location = new System.Drawing.Point(33, 3); this.comboBoxDatabase.Name = "comboBoxDatabase"; this.comboBoxDatabase.Size = new System.Drawing.Size(214, 21); - this.comboBoxDatabase.TabIndex = 1; + this.comboBoxDatabase.TabIndex = 2; this.comboBoxDatabase.SelectedIndexChanged += new System.EventHandler(this.ComboBoxDatabase_SelectedIndexChanged); // // panelRecord @@ -129,7 +135,7 @@ this.panelRecord.Location = new System.Drawing.Point(11, 82); this.panelRecord.Name = "panelRecord"; this.panelRecord.Size = new System.Drawing.Size(306, 350); - this.panelRecord.TabIndex = 15; + this.panelRecord.TabIndex = 3; // // buttonSave // @@ -138,7 +144,7 @@ this.buttonSave.Location = new System.Drawing.Point(131, 438); this.buttonSave.Name = "buttonSave"; this.buttonSave.Size = new System.Drawing.Size(175, 23); - this.buttonSave.TabIndex = 14; + this.buttonSave.TabIndex = 4; this.buttonSave.Text = "Save changes"; this.buttonSave.UseVisualStyleBackColor = true; this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click); @@ -160,7 +166,7 @@ this.comboBoxGroup.Location = new System.Drawing.Point(131, 39); this.comboBoxGroup.Name = "comboBoxGroup"; this.comboBoxGroup.Size = new System.Drawing.Size(175, 21); - this.comboBoxGroup.TabIndex = 12; + this.comboBoxGroup.TabIndex = 2; // // textBoxTitle // @@ -181,14 +187,14 @@ // // timerDataSourceRefresh // - this.timerDataSourceRefresh.Interval = 30000; + this.timerDataSourceRefresh.Interval = 120000; this.timerDataSourceRefresh.Tick += new System.EventHandler(this.TimerDataSourceRefresh_Tick); // // statusStrip // this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripStatusLabel, - this.toolStripStatusLastRefresh}); + this.toolStripStatusFailedFlag}); this.statusStrip.Location = new System.Drawing.Point(0, 474); this.statusStrip.Name = "statusStrip"; this.statusStrip.Size = new System.Drawing.Size(574, 22); @@ -197,15 +203,47 @@ // // toolStripStatusLabel // + this.toolStripStatusLabel.ForeColor = System.Drawing.SystemColors.ControlDark; this.toolStripStatusLabel.Name = "toolStripStatusLabel"; - this.toolStripStatusLabel.Size = new System.Drawing.Size(134, 17); - this.toolStripStatusLabel.Text = "Last data source refresh:"; + this.toolStripStatusLabel.Size = new System.Drawing.Size(166, 17); + this.toolStripStatusLabel.Text = "Last data source refresh: never"; // - // toolStripStatusLastRefresh + // toolStripStatusFailedFlag // - this.toolStripStatusLastRefresh.Name = "toolStripStatusLastRefresh"; - this.toolStripStatusLastRefresh.Size = new System.Drawing.Size(36, 17); - this.toolStripStatusLastRefresh.Text = "never"; + this.toolStripStatusFailedFlag.ForeColor = System.Drawing.SystemColors.ControlDark; + this.toolStripStatusFailedFlag.Name = "toolStripStatusFailedFlag"; + this.toolStripStatusFailedFlag.Size = new System.Drawing.Size(136, 17); + this.toolStripStatusFailedFlag.Text = "(data source not loaded)"; + // + // notifyIcon + // + this.notifyIcon.ContextMenuStrip = this.contextMenuNotifyIcon; + this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); + this.notifyIcon.Text = "Remote Connection Manager"; + this.notifyIcon.Visible = true; + this.notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseClick); + // + // contextMenuNotifyIcon + // + this.contextMenuNotifyIcon.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuShowMainForm, + this.toolStripMenuCloseMainForm}); + this.contextMenuNotifyIcon.Name = "contextMenuNotifyIcon"; + this.contextMenuNotifyIcon.Size = new System.Drawing.Size(179, 48); + // + // toolStripMenuShowMainForm + // + this.toolStripMenuShowMainForm.Name = "toolStripMenuShowMainForm"; + this.toolStripMenuShowMainForm.Size = new System.Drawing.Size(178, 22); + this.toolStripMenuShowMainForm.Text = "Show main window"; + this.toolStripMenuShowMainForm.Click += new System.EventHandler(this.ToolStripMenuShowMainForm_Click); + // + // toolStripMenuCloseMainForm + // + this.toolStripMenuCloseMainForm.Name = "toolStripMenuCloseMainForm"; + this.toolStripMenuCloseMainForm.Size = new System.Drawing.Size(178, 22); + this.toolStripMenuCloseMainForm.Text = "Exit application"; + this.toolStripMenuCloseMainForm.Click += new System.EventHandler(this.ToolStripMenuCloseMainForm_Click); // // MainForm // @@ -214,8 +252,11 @@ this.ClientSize = new System.Drawing.Size(574, 496); this.Controls.Add(this.statusStrip); this.Controls.Add(this.splitContainer); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "MainForm"; this.Text = "Remote Connection Manager"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.Resize += new System.EventHandler(this.MainForm_Resize); this.splitContainer.Panel1.ResumeLayout(false); this.splitContainer.Panel2.ResumeLayout(false); this.splitContainer.Panel2.PerformLayout(); @@ -223,6 +264,7 @@ this.splitContainer.ResumeLayout(false); this.statusStrip.ResumeLayout(false); this.statusStrip.PerformLayout(); + this.contextMenuNotifyIcon.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -243,7 +285,11 @@ private System.Windows.Forms.Button buttonConfig; private System.Windows.Forms.StatusStrip statusStrip; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel; - private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLastRefresh; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusFailedFlag; + private System.Windows.Forms.NotifyIcon notifyIcon; + private System.Windows.Forms.ContextMenuStrip contextMenuNotifyIcon; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuShowMainForm; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuCloseMainForm; } } diff --git a/RCM/MainForm.cs b/RCM/MainForm.cs index 9b3f854..79aa6c9 100644 --- a/RCM/MainForm.cs +++ b/RCM/MainForm.cs @@ -3,12 +3,14 @@ using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Linq; -using System.Collections.Specialized; namespace RCM { public partial class MainForm : Form { #region Form - protected override CreateParams CreateParams { // Workaround for control flickering reduction + private bool allowClose = false; + + protected override CreateParams CreateParams { + // Workaround for control flickering reduction get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED @@ -24,6 +26,31 @@ namespace RCM { LoadDataSources(0); } + private void MainForm_Resize(object sender, EventArgs e) { + if (WindowState == FormWindowState.Minimized) { + ShowInTaskbar = false; + return; + } + Config.Save(); + } + + private void NotifyIcon_MouseClick(object sender, MouseEventArgs e) { + if (e.Button == MouseButtons.Left) { + WindowState = FormWindowState.Normal; + ShowInTaskbar = true; + } + } + + private void ToolStripMenuShowMainForm_Click(object sender, EventArgs e) { + WindowState = FormWindowState.Normal; + ShowInTaskbar = true; + } + + private void ToolStripMenuCloseMainForm_Click(object sender, EventArgs e) { + allowClose = true; + Close(); + } + private void LoadDataSources(int selectedIndex) { comboBoxDatabase.Items.Clear(); comboBoxDatabase.Items.AddRange(Config.DataSources.ToArray()); @@ -43,9 +70,18 @@ namespace RCM { configForm.Dispose(); LoadDataSources(selectedIndex); } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { + if (e.CloseReason == CloseReason.UserClosing && !allowClose) { + e.Cancel = true; + WindowState = FormWindowState.Minimized; + } + } #endregion #region ComboBox & DataSource + private IDataSource previouslySelectedDataSource = null; + private void RebuildGroupCombobox(IRecord record) { List groupPaths = new List() { new GroupPath(null) }; groupPaths.AddRange(RebuildGroupCombobox(treeView.Nodes)); @@ -65,31 +101,66 @@ namespace RCM { return groupPaths; } - private void ReloadDataSource() { - RebuildTreeView(); - timerDataSourceRefresh.Stop(); - timerDataSourceRefresh.Start(); + private void ShowDataSourceException(string failedAction, Exception ex) { + IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem; + string message = String.Format("{0}\n\nData source \"{1}\" exception:\n{2}\n{3}", failedAction, dataSource.Title, ex.GetType().ToString(), ex.Message); + MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } - private void ComboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e) => ReloadDataSource(); + private void ComboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e) { + if (comboBoxDatabase.SelectedIndex == -1) { + return; + } + try { + treeView.Enabled = true; + ReloadTreeView(true); + previouslySelectedDataSource = (IDataSource)comboBoxDatabase.SelectedItem; + treeView.SelectedNode = null; + ChangeSelectedRecord(); + } catch (Exception ex) { + ShowDataSourceException("Failed to load data source.", ex); + if (previouslySelectedDataSource == null) { + treeView.Enabled = false; + treeView.Nodes.Clear(); + comboBoxDatabase.SelectedIndex = -1; + toolStripStatusLabel.Text = "Last data source refresh: never"; + toolStripStatusFailedFlag.Text = "(data source not loaded)"; + } else { + comboBoxDatabase.SelectedItem = previouslySelectedDataSource; + } + } + } - private void RefreshContextMenuItem_Click(object sender, EventArgs e) => ReloadDataSource(); + private void RefreshContextMenuItem_Click(object sender, EventArgs e) { + try { + ReloadTreeView(true); + } catch (Exception ex) { + ShowDataSourceException("Failed to refresh data source.", ex); + toolStripStatusFailedFlag.Text = "(failed to refresh since then)"; + } + } private void TimerDataSourceRefresh_Tick(object sender, EventArgs e) { - RebuildTreeView(); + try { + ReloadTreeView(); + } catch (Exception ex) { + if (toolStripStatusFailedFlag.Text == String.Empty) { + ShowDataSourceException("Failed to refresh data source.", ex); + toolStripStatusFailedFlag.Text = "(failed to refresh since then)"; + } + } } #endregion #region TreeView display - /* test */ - private void RebuildTreeView() { + private void ReloadTreeView(bool restartTimer = false) { // Select all records from database IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem; Dictionary dataSourceRecords = dataSource.SelectAll(); Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id; - // Flatten tree nodes + // Flatten existing tree nodes List flattenedTreeList = new List(); int lastProcessPosition = 0; flattenedTreeList.AddRange(treeView.Nodes.Cast()); @@ -99,11 +170,13 @@ namespace RCM { Dictionary flattenedTree = flattenedTreeList.ToDictionary(n => ((IRecord)n.Tag).Id, n => n); // Iterate over existing nodes + HashSet removeFromFlattenedTree = new HashSet(); foreach (TreeNode node in flattenedTree.Values) { IRecord record = (IRecord)node.Tag; // Delete node if record no longer present in database if (!dataSourceRecords.ContainsKey(record.Id)) { node.Remove(); + removeFromFlattenedTree.Add(record.Id); continue; } // Update existing record if it has changed since the last refresh @@ -123,17 +196,17 @@ namespace RCM { // Remove processed record dataSourceRecords.Remove(record.Id); } + // Remove deleted records from flattened tree + foreach (Guid removedId in removeFromFlattenedTree) { + flattenedTree.Remove(removedId); + } // Create nodes from unprocessed (new) records foreach (IRecord record in dataSourceRecords.Values) { - TreeNode node = CreateTreeNodeFromRecord(record); - if (dataSource.ExpandedNodes.Contains(record.Id)) { - node.Expand(); - } - flattenedTree.Add(record.Id, node); + flattenedTree.Add(record.Id, CreateTreeNodeFromRecord(record)); } - // Assign nodes to tree structure + // Assign nodes to tree structure (all nodes have to exist first) foreach (IRecord record in dataSourceRecords.Values) { TreeNode node = flattenedTree[record.Id]; if (record.GroupId == Guid.Empty) { @@ -142,48 +215,41 @@ namespace RCM { flattenedTree[record.GroupId].Nodes.Add(node); } } - - TreeNode selectedNode = flattenedTree.ContainsKey(selectedGuid) ? flattenedTree[selectedGuid] : null; - SortTreeAndSelectNode(selectedNode); - toolStripStatusLastRefresh.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - } - /* test end */ - - /*private void RebuildTreeView() { - IDataSource dataSource = (IDataSource)comboBoxDatabase.SelectedItem; - Dictionary nodes = new Dictionary(); - - try { - foreach (IRecord record in dataSource.SelectAll()) { - nodes.Add(record.Id, CreateTreeNodeFromRecord(record)); - } - } catch { - MessageBox.Show("Failed to retieve records from data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - Guid selectedGuid = treeView.SelectedNode == null ? Guid.Empty : ((IRecord)treeView.SelectedNode.Tag).Id; - TreeNode selectedNode = null; - treeView.Nodes.Clear(); - foreach (TreeNode node in nodes.Values) { - IRecord record = (IRecord)node.Tag; - if (record.GroupId == Guid.Empty) { - treeView.Nodes.Add(node); - } else { - nodes[record.GroupId].Nodes.Add(node); - } - if (record.Id == selectedGuid) { - selectedNode = node; - } - } - SortTreeAndSelectNode(selectedNode); - foreach (TreeNode node in nodes.Values) { - if (dataSource.ExpandedNodes.Contains(((IRecord)node.Tag).Id)) { + // Expand nodes (all nodes have to be placed in tree first) + foreach (IRecord record in dataSourceRecords.Values) { + if (dataSource.ExpandedNodes.Contains(record.Id)) { + TreeNode node = flattenedTree[record.Id]; node.Expand(); } } - toolStripStatusLastRefresh.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - }*/ + + // Remove controls if selected node has been deleted + if (!flattenedTree.ContainsKey(selectedGuid)) { + SortTreeAndSelectNode(null); + } + + // Restart timer + toolStripStatusLabel.Text = String.Format("Last data source refresh: {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm")); + toolStripStatusFailedFlag.Text = String.Empty; + if (restartTimer) { + timerDataSourceRefresh.Stop(); + timerDataSourceRefresh.Start(); + } + + // Delete expanded nodes which no longer exist + HashSet removeFromExpandedNodes = new HashSet(); + foreach (Guid recordId in dataSource.ExpandedNodes) { + if (!flattenedTree.ContainsKey(recordId)) { + removeFromExpandedNodes.Add(recordId); + } + } + foreach (Guid recordId in removeFromExpandedNodes) { + dataSource.ExpandedNodes.Remove(recordId); + } + + // Save expanded nodes + Config.Save(); + } private TreeNode CreateTreeNodeFromRecord(IRecord record) { string imageKey = record.GetType().FullName; @@ -191,6 +257,9 @@ namespace RCM { } private void SortTreeAndSelectNode(TreeNode node) { + /*if (node == null) { + return; + }*/ treeView.Sort(); if (treeView.SelectedNode == node) { ChangeSelectedRecord(); @@ -253,7 +322,11 @@ namespace RCM { } private void TreeView_KeyDown(object sender, KeyEventArgs e) { - if (e.KeyCode == Keys.Delete) { + if (e.KeyCode == Keys.Return) { + if (treeView.SelectedNode != null) { + RunDefaultNodeAction(treeView.SelectedNode); + } + } else if (e.KeyCode == Keys.Delete) { if (treeView.SelectedNode != null) { DeleteSelectedNode(); } @@ -262,18 +335,22 @@ namespace RCM { treeView.SelectedNode.BeginEdit(); } } else if (e.KeyCode == Keys.F5) { - ReloadDataSource(); + ReloadTreeView(true); } } - private void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { - IAction[] actions = ((IRecord)e.Node.Tag).GetActions(); + private void RunDefaultNodeAction(TreeNode node) { + IAction[] actions = ((IRecord)node.Tag).GetActions(); if (actions.Length == 0) { return; } actions[0].Run(); } + private void TreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { + RunDefaultNodeAction(e.Node); + } + private void ChangeSelectedRecord() { bool isSelected = treeView.SelectedNode != null; textBoxTitle.Enabled = isSelected; @@ -291,6 +368,8 @@ namespace RCM { } if (treeView.SelectedNode != null) { IRecord record = (IRecord)treeView.SelectedNode.Tag; + // Prevent refresh of currently selected node (which is possibly being edited) + //if (record.Id == panelRecord. textBoxTitle.Text = record.Title; RebuildGroupCombobox(record); panelRecord.Controls.Add(record.GetControl()); @@ -315,9 +394,10 @@ namespace RCM { record.Title = e.Label; try { ((IDataSource)comboBoxDatabase.SelectedItem).Update(record); - BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6 + // Workaround for treeView.Sort() triggering relabel on every sorted node. See note in https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.afterlabeledit?view=netframework-4.6 + BeginInvoke(new AfterLabelEditWorkaround(SortTreeAndSelectNode), new object[] { e.Node }); } catch { - MessageBox.Show("Failed to update record in data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Failed to update record in data source.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { e.CancelEdit = true; @@ -335,7 +415,7 @@ namespace RCM { try { ((IDataSource)comboBoxDatabase.SelectedItem).Update(record); } catch { - MessageBox.Show("Failed to update record in data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Failed to update record in data source.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (groupChanged) { @@ -359,8 +439,8 @@ namespace RCM { try { TreeNode node = InsertNewRecord(record, parentNode); SortTreeAndSelectNode(node); - } catch { - MessageBox.Show("Failed to insert record into data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } catch (Exception ex) { + ShowDataSourceException("Failed to insert record into data source.", ex); } } @@ -368,8 +448,8 @@ namespace RCM { try { TreeNode node = DuplicateRecord(treeView.SelectedNode, treeView.SelectedNode.Parent); SortTreeAndSelectNode(node); - } catch { - MessageBox.Show("Failed to insert record into data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } catch (Exception ex) { + ShowDataSourceException("Failed to insert record into data source.", ex); } } @@ -405,8 +485,8 @@ namespace RCM { if (MessageBox.Show(message, "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { try { ((IDataSource)comboBoxDatabase.SelectedItem).Delete(record); - } catch { - MessageBox.Show("Failed to remove record from data source", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } catch (Exception ex) { + ShowDataSourceException("Failed to remove record from data source.", ex); return; } treeView.SelectedNode.Remove(); @@ -421,8 +501,18 @@ namespace RCM { private ContextMenuStrip GetNewRecordContextMenu() { ContextMenuStrip menu = new ContextMenuStrip(); ToolStripMenuItem menuItemNew = new ToolStripMenuItem("New item"); + // Add group as the first type + Type groupType = typeof(Group); + ToolStripMenuItem groupItem = new ToolStripMenuItem(groupType.GetDisplayName()) { Tag = groupType, Image = Config.IconList.Images[groupType.FullName] }; + groupItem.Click += NewRecordContextMenuItem_Click; + menuItemNew.DropDownItems.Add(groupItem); + menuItemNew.DropDownItems.Add(new ToolStripSeparator()); + // Add all the rest foreach (Type type in Config.RecordTypes) { - ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type }; + if (type == groupType) { + continue; + } + ToolStripMenuItem item = new ToolStripMenuItem(type.GetDisplayName()) { Tag = type, Image = Config.IconList.Images[type.FullName] }; item.Click += NewRecordContextMenuItem_Click; menuItemNew.DropDownItems.Add(item); } @@ -459,5 +549,13 @@ namespace RCM { ((IAction)((ToolStripMenuItem)sender).Tag).Run(); } #endregion + + /*private void button1_Click(object sender, EventArgs e) { + List records = Importer.GetRecordsFromRDM(); + IDataSource dataSource = ((IDataSource)comboBoxDatabase.SelectedItem); + foreach (IRecord record in records) { + dataSource.Insert(record); + } + }*/ } } diff --git a/RCM/MainForm.resx b/RCM/MainForm.resx index 30722eb..5ffbb11 100644 --- a/RCM/MainForm.resx +++ b/RCM/MainForm.resx @@ -123,7 +123,938 @@ 201, 17 + + 310, 17 + + + 416, 17 + + + + + AAABAAsAMDAQAAEABABoBgAAtgAAACAgEAABAAQA6AIAAB4HAAAYGBAAAQAEAOgBAAAGCgAAEBAQAAEA + BAAoAQAA7gsAADAwAAABAAgAqA4AABYNAAAgIAAAAQAIAKgIAAC+GwAAGBgAAAEACADIBgAAZiQAABAQ + AAABAAgAaAUAAC4rAAAwMAAAAQAgAKglAACWMAAAICAAAAEAIACoEAAAPlYAABAQAAABACAAaAQAAOZm + AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAHAAAAAAAAAA + AAAAcAcHBxYWFhYWFhYWEAcAAAAAAAAAAAAAAI//////////////+AYAAAAAAAAAAAAAcP////////// + /////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA + AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA + AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI + //////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI + eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP + /wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA + AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP + /wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA + AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP + /wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA + AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP + /wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA + AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP + //////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA + AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA + AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA + AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/ + AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA + AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH + AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/ + ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf + AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP// + ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP// + AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP// + ////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA + AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/ + cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA + AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA + AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/ + AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3 + AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA + AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A + AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/ + /gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA + BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA + wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA//// + ////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI + iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA + AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn + cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA + AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA// + wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA + AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA + AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH + AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w + AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn + AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA + AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d + HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY + WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1 + tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA + AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/ + ////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7///////////////// + ////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU + AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f + AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n + BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH + ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP////////////// + //////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk + JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA + GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA + AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA + BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA + BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd//// + GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA + AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY + ////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA + BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK/// + /xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE + AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj + JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL + AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/ + AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA + AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH + AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/ + ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf + AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP// + ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB + AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09 + PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG + hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF + BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp + KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE + ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF + BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp + KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA + KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk + AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK + JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA + CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA + AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA + AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA + AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d + HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF + ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV + BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/ + /4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA + BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA + AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK + SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj + owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq + KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA + AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl + JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q + FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA + AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp + CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP + EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG + AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA + AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA + DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA + wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp + KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho + aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo + 6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA + AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA + AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA + AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA + AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA + AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j + AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA + AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL + S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA + AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+ + /v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL + S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx + sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+ + /v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA + AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA + AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA + AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA + AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA + AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA + AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA + AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL + S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v// + //+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER + Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8 + /P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3 + 9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA + AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA + ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky + sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P + j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA + AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF + xf4TExP+AAAA/gAAAMEAAAAnAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA2wAA + AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMwAAADMAAAAzAAAAMsAAADKAAAAvwAAAJ8AAABaAAAAFQAAAAAAAAAAAAAADAAAAH0AAAD2AAAA/mho + aP76+vr+/v7+//7+/v7FxcX+EhIS/wAAAP0AAACNAAAABAAAADYAAAD9CAgI//f39//+/v7/9PT0/wkJ + Cf8AAAD2AAAALwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAwAAAB/AAAA+gAAAP9nZ2f/+vr6///////+/v7/u7u7/wAAAP8AAADOAAAADgAAADYAAAD9CAgI/vf3 + 9//+/v7+9PT0/gkJCf8AAADzAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAOEAAAD+XV1d//v7 + +/7+/v7+/v7+/8vLy/4VFRX+AAAA/gAAAMkAAAAyAAAAAQAAAAAAAAAAAAAAAAAAADYAAAD9CAgI/vf3 + 9//+/v7+9PT0/gkJCf8AAAD7AAAAjAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA + AGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABpAAAAXQAAAEAAAAAbAAAAXAAA + AP1DQ0P++fn5//7+/v7+/v7+zMzM/xQUFP4AAAD+AAAA0gAAADIAAAABAAAAAAAAAAAAAAAAAAAAAAAA + ADYAAAD9CAgI//f39//+/v7/9PT0/wkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL + S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL + S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA + AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3 + 9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ + Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL + S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy + sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA + ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA + AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA + AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+ + /v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA + AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA + AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA + AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA + ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/ + AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA + AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA + AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/ + //8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA + AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA + AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH + h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2 + dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA + AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA + ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA + AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O + Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA + AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA + AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG + hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG + hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2 + 9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA + 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 + /////wEAAAAAAAAAAAAAcBiIiIiIj/iIiIiIhgcAAAAAAAAAAAAAAAAAAAAAf/cAAAAAAAAAAAAAAAAA + AAAAAHcHAHAAf/cABwBwABAAAAAAAAAAAAAAAAAAAABwf/cHAAAHAABwAAAAAAAAAAAAAAAAAAAAf/cA + AAAACHAAAAAAAABwAAAAAAAAAAAAf/cAAABwf/gAcAAAAAcAcHBxYWcWF2F2j/gWcWAAD/+AAAAAAAAI + //////////////////EAB//4AHAAAAAP//////////////////cHAH//gAAAAAAP/4iIiIeIiHiHiHiI + eHAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAABwAAB//4ABAAAP/wABYBYWAWFhBwFgcHAAAAAH//gAcAAP + /wAAAAAAAAAAAAAAAAAAAAAAf/+AYAAP/wAAAAAAAAAAAAAAAAAAAAAACP/wAAAP/wAAAAAAAAAAAAAA + AAAAAAAAj/9wcAAP/wAAAAAAAAAAAAAAAAAAABAP//cAAAAP/wAAAAAAAAAAAAAAAAAABgD//3AAAAAP + /wAAAAAAAAAAAAAAAAAAEAj/9wBwAAAP/wAAAAAAAAAAAAAAAAAHAP//cABwAAAP/wAAAAAAAAAAAAAA + AAAACP/3AAAAAAAP/wAAAAAAAAAAAAAAAAAAf/9wAHhwcAAP/wAAAAAAAAAAAAAAAAAAf/cAB4+AAAAP + /wAAAAAAAAAAAAAAAAAAAAAAeP+AAAAP/wAAAAAAAAAAAAAAAAAAAAAHj/gAcAAP/wAAAAAAAAAAAAAA + AAAABwB//4AHAAAP/wAAAAAAAAAAAAAAAAAAAAf/+ABwAAAP/wAAAAAAAAAAAAAAAAAAAH//gAEAAAAP + /wAAAAAAAAAAAAAAAAAAB//4AHAAAAAP/wBwAAAAAAAAAAAAAAAAf/+AAAAAAAAP/wAAAAAAAAAAAAAA + AABwf/9wBwAAAAAP/3B3FncWdxZxZxZxZwAACP/3AAAAAAAP//////////////////cAAI/4cAAAAAAP + //////////////////cHAA//9wAAAAcHeIh4h4h4h4iIeIh4iHAABwCP/3AAAAAAAAAAAAAAAAAAAAAA + AABwAAAP/4cAAAAHcBYBYWBwFgFhYBYWFnAAAAcAj/9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAA + AAAAAAAAAAAAAAAAAAAAAAAHAI+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAcAAAAAAAAAAAAAAAAAAA + AAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/ + AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA + AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH + AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/ + ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf + AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP// + ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP// + AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAeHh3h3h3h3cAAAAAAAAAAP// + ////////AAAAAAAAAAB3d3d/93d3cAAAAAAAAAAAAAAAD/AAAABwAAAAAAAAAAAAAA/wAABwAAAAAAAA + AAAHAAAP8AB3CPBwAAAAeHh4d3h4f/d3cAj/AAAAAP////////////AAj/AAAAD/d3d3d3d3d3cABwj/ + cAAA/wAAAAAAAAAAcAAAj4BwAP8AAAAAAAAAAAAABwj/AAD/AAAAAAAAAAAAAAAP+AAA/wAAAAAAAAAA + AAAHj4BwAP8AAAAAAAAAAAAAePgAAAD/AAAAAAAAAAAAcP+ABwAA/wAAAAAAAAAAAAj4AHAAAP8AAAAA + AAAAAAAIgAf/AAD/AAAAAAAAAAAAcAB/9wAA/wAAAAAAAAAAAAcHj3AAAP8AAAAAAAAAAAAAf/cAAAD/ + AAAAAAAAAAAAB/9wAAAA/wAAAAAABwAHBw/3AAAAAP93eHh4eHd4d3AH/3AAAAD////////////wcH/3 + AAAAd3d3d3d3d3d3AAcH/3AAAAAAAAAAAAAAAHAAcH/3AAAAAAAAAAAAAAAAAAcHjwAAAAAAAAAAAAAA + AAAAcHcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAD//////wAA//4AAH/+AAB//gAAf/8A + AH///Dw/wAAAH4AAAA+AAAAHgAACA4AABwGH//+Bh///gYf//wGH//4Dh//8A4f//AGH//wBh//8AYf/ + /gOH//4Hh//8D4AAAA+AAAAPgAAAB4AAAgPAAAcB////gf///8H////z/////ygAAAAYAAAAMAAAAAEA + BAAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA + wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAHAAAWAAFgcAAAAAAA//// + ////AAAAAAAHB3Foh3BwcAAAAAAAAAAIgABwAAAAAHBwcHcIgHcIgAAAAIh4iHeP+HcH+AAAd/j4iPiI + iIcAf4AAd/AAAAAWAQcAB/gAd/AAAAAAAAAAAH9wd/AAAAAAAAAAcPgAd4AAAAAAAAAHD4CAd/AAAAAA + AAAA+ABwd/AAAAAAAAB4gHgQd4AAAAAAAAAAAI9gd/AAAAAAAAAHD/Bwd/AAAAAAAAAA/2EAd4BxZ3Fn + cWd48QAAd/h4d4eHeIcA/wAAAYj4+I+PiIdxb4AABwAAAAAABgEAcP8AAAAAAAAAAAAABw9wAAAAAAAA + AAAAAHAAAAAAAAAAAAAAAAAA////APgAHwD4AB8A+AAfAP/DHwDAAA8AgAAHAAAAAwAAAMEAD//hAA// + wQAP/4EAD/+BAA//AQAP/4EAD/+BAA//gwAAAAcAAAAHAIAAAwCAAMEA///hAP//8QD///8AKAAAABAA + AAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA + AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAHiIiIiHAAAAAHCHcH + AAAAAAB3dwBwAHiIiI+IcPcADwdwcHBwD3B/cAAAAAB3hw9wAAAAAHhweHAAAAAHgAAPAAAAAAB3939w + AAAAB3gADwAAAAAHgAB/iIiIiHD3AAcHcHcHAHhwAAAAAAAAAIcAAAAAAAAAAP//AADgBwAA8A8AAPwn + AAAAAwAAABEAAB/wAAAf8QAAH+EAAB/gAAAf4QAAH+MAAAADAACAEQAA//gAAP//AAAoAAAAMAAAAGAA + AAABAAgAAAAAAAAJAAAAAAAAAAAAAAABAAAAAQAAAAAAAAUFBQAICAgADAwMABEREQAVFRUAGBgYAB0d + HQAgICAAJSUlACsrKwAtLS0AMjIyADU1NQA5OTkAPj4+AEFBQQBFRUUASkpKAExMTABRUVEAVlZWAFhY + WABdXV0AYGBgAGZmZgBpaWkAbGxsAHFxcQB1dXUAenp6AH5+fgCPj48AmJiYAKSkpACtra0AsbGxALW1 + tQC7u7sAwcHBAMXFxQDJyckAzMzMANDQ0ADZ2dkA6urqAO3t7QD19fUA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBcAAAAAAAAAAAAAAAAA + AAAAAAAAAAAfAAQRExMTExMTExMTExMTExMTExMTExMTBAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAPACf/ + ////////////////////////////JwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAMAC7///////////////// + ////////////LgALAAAAAAAAAAAAAAAAAAAAAAAAAAAXABMjJCQkJCQkJCQs//8sJCQkJCQkJCQjFAAU + AAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAf//8fAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB8TDwwMDAwMBAAf//8fAAQMDAwMDAcAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAFwAf//8fABcAAAAAABcAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAf//8f + AAsAAAAAAAQEISEEAA8AAAAAAAAAAAAAGAQAAAAAAAAAAAAAAAAAAAAAAAAf//8fAAAAAAALEQAc//8n + BAAPAAAAAAAAAAAcAAQRExMTExMTExMTExMTExMTExMi//8iExMTEwsAAAAR////KQQADwAAAAAAAAAH + ACf///////////////////////////////////8RAAAAGP///ycEAA8AAAAAAAAEAP////////////// + //////////////////////8YAA8AABwv//8nBAAPAAAAAAAABC///yQkJCQkJCQkJCQkJCQkJCQkJCQk + JCQkJCAEBAAABAAY////KQQADwAAAAAAAC//LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQA + GP///ycEAA8AAAAABC//LwQACQwMDAwMDAwMDAwMDAwMDAwMDAwMERgAAAAAAAAEABj///8nBAAdAAAA + AP//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY////JgAMAAAABC//LwAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAELP//LgAJAAAAAP//LwQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAPAAQp////GAARAAAABC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA + BCn///8YAAQAAAAAAP//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEJ////xgABAAAAAAA + BC//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQn////GAAEHwAAAAAAAP//LwQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAABMABCn///8YAAAEHAAAAAAABC//LgQEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAQEJ////xgAAAAAAAcAAAAAAP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd//// + GAAAABQkFAATAAAABC//LgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/y8YAAAAGP//LgAJAAAA + AP//LwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACwsAAAAY////JwAMAAAABC//LwQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAABj///8pBAAcAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAFwAAGP///ycHAA8AAAAABC//LwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAY + ////JwcADAAAAAAAAP//LgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABf///8pBAAMAAAAAAAA + BC//LwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAF////ycHAA8AAAAAAAAAAP//LwAEHQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAR////KQQACwAAAAAAAAAABC//LwQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAALEQAd////GAAAGAAAAAAAAAAAAP//LxMTExMTExMTExMTExMTExMTExMTExMTEwsAAAAEK/// + /xQABAAAAAAAAAAEAC////////////////////////////////////8RAAQABCv///8UAAQAAAAAAAAE + AC7///////////////////////////////////8YABwLAAcp//8vFwAEAAAAAAARABMjIyQjJCMkIyQj + JCMkIyQjJCMkIyQjJCMkIyAEBAAADAAHKf///xQABAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAHAAAAAsAByv//y8XAAQAAAAAAB8TDwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwPDxgAAAAAAAAL + AAcp//8vFAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAHKf//LgALAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAByn/JwALAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAQRBAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAFwQABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD/4AAAB/8AAP/AAAAD/wAA/8AAAAP/AAD/wAAAA/8AAP/AAAAD/wAA/+AAAAf/ + AAD/8AAAB/8AAP//8A+B/wAA///wD4D/AADAAAAAAH8AAIAAAAAAPwAAgAAAAAAfAACAAAAAAA8AAIAA + AABgBwAAgAAAAHADAACAAAAB+AEAAID////8AQAAgP////wBAACA////+AEAAID////wAwAAgP///+AH + AACA////wAcAAID///+ABwAAgP///4ADAACA////gAEAAID///+AAQAAgP///4ABAACA////wAEAAID/ + ///gAwAAgP///+AHAACA////wA8AAID///+AHwAAgH///4A/AACAAAAAAD8AAIAAAAAAPwAAgAAAAAAf + AACAAAAAAA8AAIAAAABgBwAAwAAAAHADAADgAAAB+AEAAP/////8AQAA//////4BAAD//////wEAAP// + ////gwAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAB + AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHBwcACIiIgAlJSUAKCgoAC0tLQA3NzcAOTk5AD09 + PQBBQUEARUVFAElJSQBMTEwAUlJSAFVVVQBiYmIAZWVlAGlpaQBsbGwAcXFxAHZ2dgB5eXkAfX19AIaG + hgCJiYkApaWlALKysgC4uLgAv7+/AN7e3gDl5eUA7e3tAPHx8QD29vYA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0GBQUFBQUFBQUFBQUF + BQwAAAAAAAAAAAAAAAAAAAAFEx0dHR0dHR0dHR0dHR0dEwUAAAAAAAAAAAAAAAAAAAAmKSkpKSkpKSkp + KSkpKSkmAAAAAAAAAAAAAAAAAAAABREaGhoaGhopJhsaGhoaGhEFAAAAAAAAAAAAAAAAAAAAEQoICAgE + ACkpAAUGCAgEABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSYAAAAAAAoFBAYAAAAAAAAAAA0GBQUFBQUF + BQUFBAApKQAEBg0YACMkCgYAAAAAAAAEEx4dHR0dHR0dHR0dHikmHh4eEwAAICkkCgYAAAAAAAAmKSkp + KSkpKSkpKSkpKSkpKSkkAAgEICkkCgYAAAAAACkpGxoaGhoaGhoaGhoaGhoaGxEGAA0EICkkCgYAAAAA + KSYEBAgICAgICAgICAgICAgKEQAAABEAISkkCggAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAoEISkk + AAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAAAAABQokKSAAAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAAAYK + JCkhBBEAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAGCiQpIQANAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAA + CAokKSEEAA0AAAAAKSYEAAAAAAAAAAAAAAAAAAAAAAAAJCkhAAAREQUAAAApJgAAAAAAAAAAAAAAAAAA + AAAAAAAfHwQAGCkmAAAAACkpAAAAAAAAAAAAAAAAAAAAAAAAFQQAABUpKRgEAAAAKSYEAAAAAAAAAAAA + AAAAAAAAAAAAFQAYKSkYAAAAAAApJgAAAAAAAAAAAAAAAAAAAAAAAAAAGCkpGAAAAAAAACkpAAAAAAAA + AAAAAAAAAAAAAAAABBUpKRgAAAAAAAAAKSYEAAYFBQUFBQUFBQUFBQUGDRUAJikfAA0AAAAAAAApKR0d + HR0dHR0dHR0dHR0dHR4TAAAaKSkVBAAAAAAAACYpKSkpKSkpKSkpKSkpKSkpKSQAEQAaKSkVAAAAAAAF + ERoaGhoaGhoaGhoaGhoaGhobEQYAGwAaKSkVAAAAAAARCggICAgICAgICAgICAgICAoRAAAAGwAaKSkV + BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAaKSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + GwAVEwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP//////AAD//gAAf/4AAH/+AAB//wAAf//8PD/AAAAfgAAAD4AAAAeAAAIDgAAHAYf/ + /4GH//+Bh///AYf//gOH//wDh//8AYf//AGH//wBh//+A4f//geH//wPgAAAD4AAAA+AAAAHgAACA8AA + BwH///+B////wf////P/////KAAAABgAAAAwAAAAAQAIAAAAAABAAgAAAAAAAAAAAAAAAQAAAAEAAAAA + AAAEBAQACQkJAAwMDAASEhIAFhYWABkZGQAcHBwAISEhACUlJQAzMzMANDQ0ADo6OgA+Pj4AQUFBAEpK + SgBOTk4AUVFRAFVVVQBYWFgAZWVlAGlpaQBsbGwAcXFxAHV1dQB/f38AgICAAIaGhgCUlJQAm5ubAKOj + owCkpKQAra2tAL6+vgDAwMAA0dHRANXV1QDY2NgA6enpAOzs7ADx8fEA+fn5AP7+/gAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcGCQkJCQkJCQkJCQYWAAAAAAAAAAAAAAYnKioq + KioqKioqKicGAAAAAAAAAAAAABANExMTEyQkExMTEw0QAAAAAAAAAAAAAAAAAAAABiIiBgAAFAAKAAAA + AAAAABEQEA8QEA8QAiIiAhAXDxsdBAAAAAAACh4eHh4eHh4eHiYmHh4TABYqHgQAAAAWGSolJCQkJSQl + JSQkJSUbDQkXKh4EAAAUGSoABgYGBgYGBgYGBgYPAAAJFyofBAAUGSkCAAAAAAAAAAAAAAAAAAAAAB0q + FgAUGSoAAAAAAAAAAAAAAAAAAAARDSckBgAUGSoCAAAAAAAAAAAAAAAAABENJyUGGwAUGSkCAAAAAAAA + AAAAAAAAAA0nJAYAEQAUGSoAAAAAAAAAAAAAAAAAER8lBgYiEQAUGSoCAAAAAAAAAAAAAAAAAAYCBiQp + CgAUGSkCAAAAAAAAAAAAAAAAABcGJCkKEQAUGSoAAAAAAAAAAAAAAAAAAAYkJw0QAAAUGSoADxAPEBAP + EBAPEBAXDR8qEQkAAAAWGSoeHh4eHh4eHh4eHh4TAA8pIwQAAAAAECQlJCQkJCUkJCQlJCUbEA8NKSMG + AAAAEwkGBgYGBgYGBgYGBgYPAAAPDSkjBAAAAAAAAAAAAAAAAAAAAAAAAAAADw0pFgAAAAAAAAAAAAAA + AAAAAAAAAAAAABEGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A+AAfAPgAHwD4AB8A/8MfAMAA + DwCAAAcAAAADAAAAwQAP/+EAD//BAA//gQAP/4EAD/8BAA//gQAP/4EAD/+DAAAABwAAAAcAgAADAIAA + wQD//+EA///xAP///wAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAACkp + KQAsLCwAMjIyADU1NQA5OTkAPj4+AEBAQABEREQASEhIAE5OTgBRUVEAWVlZAF5eXgBiYmIAZ2dnAGho + aABsbGwAcnJyAHZ2dgB7e3sAf39/AJycnACmpqYAs7OzALS0tADCwsIA1tbWANnZ2QDh4eEA5+fnAOjo + 6AD4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA + AAAAAAAAAAAAAAAAAAAAAAARGBoaGhoaGhgRAAAAAAAAAAkJCRYWCQkDAAAAAAAAAAAAAA8VFREACQoA + AAANGBoaGhoaHR0aCgMdCwAACSAJCQkKCQkJCgoACR0LAAkgCgAAAAAAAAAAABUTHQ8JIAoAAAAAAAAA + AAALHwYACSAKAAAAAAAAAAAKHQMDAAkgCgAAAAAAAAAACQETGw8JIAoAAAAAAAAAABURHQMACSABAAAA + AAAAAAANHQEAAAogGhoaGhoaGhoKAR0RAAAACQkJCgkJCgkKCgAGHREAAAAAAAAAAAAAAAAAAAMXEQAA + AAAAAAAAAAAAAAAAAAD//wAA4AcAAPAPAAD8JwAAAAMAAAARAAAf8AAAH/EAAB/hAAAf4AAAH+EAAB/j + AAAAAwAAgBEAAP/4AAD//wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA + AC8AAABWAAAAawAAAHAAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAA + AHIAAAByAAAAcgAAAHIAAAByAAAAcAAAAGsAAABZAAAAMQAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAgAAAAngAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD9AAAA8AAAAKMAAAAjAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAACCAAAA/A4ODv9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tL + S/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/EBAQ/wAA + AP0AAACGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADEAAAA/8PDw/7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+ + /v7+/v7+yMjI/wAAAP4AAADFAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADNAAAA/+7u7v7+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+//7+/v7+/v7+7u7u/wAAAP4AAADOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAClAAAA/0tL + S/+tra3/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf/Y2Nj//v7+///////Y2Nj/sbGx/7Gx + sf+xsbH/sbGx/7Gxsf+xsbH/sbGx/7Gxsf+urq7/UFBQ/wAAAP4AAACpAAAABgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABEAAAA2wAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3/+/v7+/v7+ + /v9/f3/+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAOIAAABKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAGAAAAMwAAAIQAAACzAAAAxwAAAMwAAADMAAAAzAAAAMwAAADNAAAA8wAA + AP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAAPMAAADNAAAAzAAAAMwAAADMAAAAzwAAAOEAAAD7AAAA/QAA + AMsAAABrAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAA + AAQAAAAGAAAAowAAAP9/f3///v7+//////9/f3//AAAA/gAAAKMAAAAGAAAABAAAAAQAAAAEAAAAGAAA + AKUAAAD8AAAA/wAAAP8AAAD7AAAAuQAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAADQAAAC0AAABTAAAAZAAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAawAA + AGsAAABrAAAAawAAAGsAAABsAAAA0gAAAP5/f3/+/v7+/v7+/v9/f3/+AAAA/gAAANEAAABqAAAAXQAA + AD8AAAAaAAAARAAAAPQPDw/+mZmZ/5iYmP4RERH+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAlAAAAnwAAAO8AAAD9AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP9/f3///v7+//7+/v9/f3//AAAA/gAA + AP8AAAD+AAAA/gAAAPoAAADTAAAAugAAAP5wcHD//v7+//7+/v/Gxsb/ERER/wAAAP4AAADEAAAALQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACUAAAA/Q0NDf9GRkb+S0tL/ktLS/9LS0v+S0tL/ktL + S/9LS0v+S0tL/0tLS/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/+lpaX+/v7+/v// + //+kpKT+S0tL/ktLS/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP5GRkb++/v7//7+/v7+/v7+yMjI/xER + Ef4AAAD+AAAAxgAAAC0AAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAADfAAAA/sTExP/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAP4AAAD+ZWVl//z8 + /P7+/v7+/v7+/8bGxv4SEhL+AAAA/gAAAMQAAAAuAAAAAQAAAAAAAAAAAAAAAAAAACkAAAD2BwcH/vf3 + 9//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v9oaGj+AAAA/gAA + AMgAAAD2AAAA/mdnZ/77+/v+/v7+//7+/v7Gxsb+EhIS/wAAAP4AAADEAAAALgAAAAEAAAAAAAAAAAAA + ADMAAAD7CAgI//f39//+/v7/+/v7/7W1tf+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Ky + sv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/7Kysv+ysrL/srKy/4+P + j/8MDAz/AAAA8QAAAEgAAAB7AAAA9gAAAP9mZmb/+vr6///////+/v7/yMjI/xISEv8AAAD+AAAAxQAA + AC4AAAABAAAAAAAAADYAAAD9CAgI/vf39//+/v7+9PT0/gkJCf8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD3AAAAlAAAAA8AAAAMAAAAewAAAPcAAAD+ZmZm//v7+/7+/v7+/v7+/8XF + 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 + APoAAADTAAAAvQAAAP53d3f//v7+//7+/v/+/v7/Z2dn/wAAAP8AAAD+AAAAoAAAAAwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADUAAAD8CAgI/vf39//+/v7+9/f3/lJSUv9LS0v+S0tL/ktLS/9LS0v+S0tL/0tL + S/5LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktLS/9LS0v+S0tL/ktL + S/9LS0v+S0tL/iwsLP8AAAD+AAAA/gAAAP4UFBT+0dHR//7+/v7+/v7++vr6/1dXV/4AAAD+AAAA9AAA + AHAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAD4CAgI/vf39//+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+//7+/v7+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+/v/+/v7+/v7+/v7+ + /v/+/v7+/v7+/v7+/v/+/v7+/v7+/vn5+f9ERET+AAAA/gAAAPUAAAD+FxcX/9LS0v7+/v7+/v7+//f3 + 9/5YWFj+AAAA/gAAAPIAAABwAAAACwAAAAAAAAAAAAAAAAAAACAAAADtAwMD/+zs7P/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v9paWn/AAAA/gAAAJMAAADQAAAA/hkZ + Gf/R0dH//v7+//7+/v/39/f/WFhY/wAAAP8AAADyAAAAcAAAAAoAAAAAAAAAAAAAAAwAAAC7AAAA/ktL + S/+urq7+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/7Kysv6ysrL+srKy/rKysv+ysrL+srKy/rKy + sv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/rKysv+ysrL+srKy/o+Pj/8MDAz+AAAA8QAA + ADkAAAA0AAAA0AAAAP4YGBj+0NDQ//7+/v7+/v7++fn5/1hYWP4AAAD+AAAA8wAAAG8AAAAKAAAAAAAA + AAEAAABMAAAA3QAAAP4AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD+AAAA/gAA + AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAA + AP8AAAD3AAAAlQAAAA8AAAABAAAANAAAANEAAAD+GBgY/9HR0f7+/v7+/v7+//f39/5ZWVn+AAAA/gAA + AO4AAABUAAAAAQAAAAAAAAAGAAAANAAAAIQAAAC1AAAAxwAAAMsAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAA + AMsAAADKAAAAvwAAAKAAAABbAAAAFQAAAAAAAAAAAAAAAQAAADYAAADRAAAA/hkZGf/R0dH//v7+//7+ + /v/39/f/VlZW/wAAAP4AAAC0AAAACQAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAYAAAAHAAAACAAA + AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAACAAAAAcAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA1AAAA0AAA + AP4YGBj+0NDQ//7+/v7+/v7+6urq/wICAv4AAADYAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAANQAAANEAAAD+GBgY/9DQ0P7+/v7+wsLC/wAAAP4AAADPAAAADwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADYAAADOAAAA/g4ODv9CQkL/Dg4O/wAAAP0AAACOAAAABQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAApwAAAOsAAAD4AAAA6QAA + AJ8AAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA + ACUAAAA1AAAAJgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA/+AAAAf/AAD/wAAAA/8AAP+A + AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAAf8AAP/4AAAAfwAAwAAAAAA/ + AACAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAABAAAAAAAAYAAAAAAA + AAHwAAAAAH////AAAAAAf///8AAAAAB////gAAAAAH///8ABAAAAf///gAMAAAB///8AAQAAAH///wAA + AAAAf///AAAAAAB///8AAAAAAH///wAAAAAAf///AAAAAAB///+AAQAAAH///4ABAAAAf///AAMAAAB/ + //8ABwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAADwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAA + AACAAAAAYAAAAPAAAAHwAAAA//////gAAAD//////AAAAP/////+AQAA//////+DAAD///////8AACgA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA + AAgAAAAIAAAABwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAIAAABYAAAAxgAAAOYAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA + AO0AAADtAAAA7QAAAOwAAADnAAAAyAAAAFwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAO9UVFT/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH + h/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/9XV1f/AAAA8AAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAA/vLy8v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//Pz8/8AAAD+AAAAPAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADrR0dH/3Z2dv92dnb/dnZ2/3Z2 + dv92dnb/enp6//v7+//7+/v/eXl5/3Z2dv92dnb/dnZ2/3Z2dv92dnb/SUlJ/wAAAO0AAAAgAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEsAAAC2AAAA1wAA + AN0AAADdAAAA3QAAAO4GBgb++Pj4//j4+P8GBgb+AAAA7gAAAN0AAADdAAAA3gAAAPAAAAD+AAAArQAA + ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAAcAAAAHAAAABwAA + AAgAAAAKAAAACwAAAAsAAAALAAAAdQYGBv74+Pj/+Pj4/wYGBv4AAAB1AAAACQAAAAUAAAAWAAAA0g4O + Dv4ODg7+AAAA3gAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABaAAAAxAAAAOQAAADpAAAA6QAA + AOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAAD1BgYG//j4+P/4+Pj/BgYG/gAAAPUAAADjAAAAwwAA + AJQCAgL+3d3d/+Xl5f8pKSn+AAAA5QAAADsAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPNUVFT/hoaG/4aG + hv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+JiYn/+/v7//v7+/+JiYn/hoaG/4aG + hv9SUlL/AAAA/gAAAP6ysrL//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAAAAAAAABlAwMD/vb2 + 9v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+/+3t7f8BAQH+AAAA4ggICP64uLj//v7+/+bm5v8pKSn+AAAA5QAAADwAAAAAAAAAAAAA + AHYFBQX++fn5//v7+/96enr/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3 + d/93d3f/d3d3/3d3d/93d3f/RUVF/gAAAOoAAAA2AAAAvgkJCf64uLj//v7+/+bm5v8pKSn+AAAA5QAA + ADwAAAAAAAAAeAUFBf75+fn/9/f3/wYGBv4AAADvAAAA3QAAAN0AAADdAAAA3QAAAN0AAADdAAAA3QAA + AN0AAADdAAAA3QAAAN0AAADdAAAA3AAAANcAAAC0AAAASgAAAAEAAAAWAAAAvgkJCf64uLj//v7+/+bm + 5v8pKSn+AAAA2gAAABYAAAB4BQUF/vn5+f/39/f/BgYG/gAAAGsAAAAFAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAYAAAA1AkJ + Cf6/v7///v7+/97e3v8BAQH+AAAAQgAAAHgFBQX++fn5//f39/8GBgb+AAAAZgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADsAAADqKSkp/+bm5v/+/v7/srKy/wAAAPwAAAA3AAAAeAUFBf75+fn/9/f3/wYGBv4AAABmAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAA7AAAA5ikpKf/m5ub//v7+/7i4uP8JCQn+AAAAtAAAAAoAAAB4BQUF/vn5+f/39/f/BgYG/gAA + AGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAOgAAAOYpKSn/5ubm//7+/v+5ubn/CQkJ/gAAAMAAAAAYAAAAAAAAAHgFBQX++fn5//f3 + 9/8GBgb+AAAAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABMAAADZKSkp/+bm5v/+/v7/uLi4/wgICP4AAAD+AAAAxwAAAFIAAAACAAAAeAUF + Bf75+fn/9/f3/wYGBv4AAABmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAOwICAv7f39///v7+/7i4uP8JCQn+AAAA/k1NTf9MTEz/AAAA8AAA + ACcAAAB4BQUF/vn5+f/39/f/BgYG/gAAAGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/KWlpf+mpqb/CQkJ/gAAAP9oaGj//Pz8//Hx + 8f8BAQH+AAAASAAAAHgFBQX++fn5//f39/8GBgb+AAAAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAACdAAAA9QAAAP4AAAD/aGho//39 + /f/9/f3/a2tr/wAAAPMAAAAoAAAAeAUFBf75+fn/9/f3/wYGBv4AAABmAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAACXAAAA/2dn + Z//8/Pz//f39/21tbf8AAAD7AAAAeAAAAAMAAAB4BQUF/vn5+f/39/f/BgYG/gAAAGYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAcwAA + APpoaGj//f39//39/f9sbGz/AAAA+wAAAHwAAAAFAAAAAAAAAHgFBQX++fn5//f39/8GBgb+AAAAbgAA + AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAGAAAAAgAA + ACIAAADxZmZm//39/f/9/f3/bW1t/wAAAPsAAAB8AAAABQAAAAAAAAAAAAAAeAUFBf75+fn/9/f3/wYG + Bv4AAAD1AAAA6QAAAOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAADpAAAA6QAAAOkAAADpAAAA6QAA + AOMAAADDAAAAmwMDA/7y8vL//v7+/6ampv8AAAD+AAAAxAAAAAoAAAAAAAAAAAAAAAAAAAB1BQUF/vn5 + +f/7+/v/ioqK/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aGhv+Ghob/hoaG/4aG + hv+Ghob/hoaG/1JSUv8AAAD+AAAA/nBwcP/+/v7//Pz8/2NjY/8AAAD6AAAAdQAAAAQAAAAAAAAAAAAA + AGMDAwP+9PT0//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7/7e3t/wEBAf4AAAC5AAAA/HJycv/9/f3//Pz8/2NjY/8AAAD6AAAAdAAA + AAQAAAAAAAAAKgAAAO9HR0f+d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3 + d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/9FRUX+AAAA6gAAACMAAACCAAAA/HJycv/9/f3//Pz8/2Nj + Y/8AAAD6AAAAcQAAAAIAAAACAAAATQAAALYAAADXAAAA3AAAAN0AAADdAAAA3QAAAN0AAADdAAAA3QAA + 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 + + \ No newline at end of file diff --git a/RCM/Program.cs b/RCM/Program.cs index def660c..ac10cd8 100644 --- a/RCM/Program.cs +++ b/RCM/Program.cs @@ -1,9 +1,9 @@ -using Newtonsoft.Json.Linq; -using System; -using System.ComponentModel; -using System.Drawing; -using System.IO; +using System; using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.AccessControl; +using System.Security.Principal; +using System.Threading; using System.Windows.Forms; namespace RCM { @@ -13,9 +13,30 @@ namespace RCM { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Config.LoadModules(); - Config.LoadConfiguration(); - Application.Run(new MainForm()); + string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString(); + string mutexId = string.Format("Local\\{{{0}}}", appGuid); + + using (Mutex mutex = new Mutex(false, mutexId)) { + bool hasHandle = false; + try { + try { + hasHandle = mutex.WaitOne(0, false); + if (hasHandle == false) { + MessageBox.Show("An instance of the application is already running", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + } catch (AbandonedMutexException) { + hasHandle = true; + } + Config.LoadModules(); + Config.LoadConfiguration(); + Application.Run(new MainForm()); + } finally { + if (hasHandle) { + mutex.ReleaseMutex(); + } + } + } } } } diff --git a/RCM/Program.ico b/RCM/Program.ico new file mode 100644 index 0000000..86bb861 Binary files /dev/null and b/RCM/Program.ico differ diff --git a/RCM/RCM.csproj b/RCM/RCM.csproj index 504a591..63f00db 100644 --- a/RCM/RCM.csproj +++ b/RCM/RCM.csproj @@ -54,16 +54,20 @@ MinimumRecommendedRules.ruleset true + + Program.ico + - - ..\packages\CredentialManagement.1.0.2\lib\net35\CredentialManagement.dll + + ..\packages\Google.Protobuf.3.10.1\lib\net45\Google.Protobuf.dll - - ..\packages\MySql.Data.8.0.16\lib\net452\MySql.Data.dll + + + ..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll - ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll @@ -71,7 +75,8 @@ ..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net46\System.Data.SQLite.dll - + + @@ -96,9 +101,17 @@ SQLiteControl.cs + + + UserControl + + + RDPConfigControl.cs + + @@ -137,10 +150,16 @@ MySQL.cs Designer + + MySQLControl.cs + SQLite.cs Designer + + SQLiteControl.cs + MainForm.cs @@ -191,10 +210,16 @@ RDP.cs Designer + + RDPConfigControl.cs + SSH.cs Designer + + SSHConfigControl.cs + WebSite.cs Designer @@ -215,9 +240,12 @@ + - + + + diff --git a/RCM/Record/RDP/RDP.cs b/RCM/Record/RDP/RDP.cs index 446a022..a913cc8 100644 --- a/RCM/Record/RDP/RDP.cs +++ b/RCM/Record/RDP/RDP.cs @@ -1,10 +1,5 @@ using System; using System.Windows.Forms; -using System.Diagnostics; -using CredentialManagement; -using System.IO; -using System.Threading; -using System.Threading.Tasks; namespace RCM { [Serializable] diff --git a/RCM/Record/RDP/RDPAction.cs b/RCM/Record/RDP/RDPAction.cs index ea70d21..8abfa3f 100644 --- a/RCM/Record/RDP/RDPAction.cs +++ b/RCM/Record/RDP/RDPAction.cs @@ -1,20 +1,22 @@ -using CredentialManagement; -using System; -using System.Collections.Generic; +using System; +using System.ComponentModel; using System.Diagnostics; using System.IO; -using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Windows.Forms; namespace RCM { - [DisplayName("Start Remote Desktop")] + [@DisplayName("Start Remote Desktop")] public class RDPAction : IAction { private RDP _rdp; + private RDPConfig _config; public RDPAction(RDP rdp) { _rdp = rdp; + _config = (RDPConfig)Config.ConfigSections[typeof(RDPConfig)]; } public async void Run() { @@ -27,29 +29,104 @@ namespace RCM { }); } - private void RunWin() { - string[] host = _rdp.Host.Split(new char[] { ':' }); - string[] username = _rdp.Username.Split(new char[] { '\\' }); + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct DATA_BLOB { + public int cbData; + public IntPtr pbData; + } + [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern bool CryptProtectData(ref DATA_BLOB pDataIn, string szDataDescr, IntPtr pOptionalEntropy, IntPtr pvReserved, IntPtr pPromptStruct, int dwFlags, ref DATA_BLOB pDataOut); + + public static string EncryptPassword(string plainText) { + if (plainText == null) { + plainText = String.Empty; + } + byte[] plainBytes = Encoding.Unicode.GetBytes(plainText); + + DATA_BLOB plainBlob = new DATA_BLOB(); + DATA_BLOB cipherBlob = new DATA_BLOB(); + + try { + plainBlob.pbData = Marshal.AllocHGlobal(plainBytes.Length); + if (plainBlob.pbData == IntPtr.Zero) { + throw new Exception("Plaintext DATA_BLOB allocation exception"); + } + plainBlob.cbData = plainBytes.Length; + Marshal.Copy(plainBytes, 0, plainBlob.pbData, plainBytes.Length); + + bool result = CryptProtectData(ref plainBlob, String.Empty, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 1, ref cipherBlob); + if (!result) { + throw new Exception("CryptProtectData exception", new Win32Exception(Marshal.GetLastWin32Error())); + } + byte[] cipherBytes = new byte[cipherBlob.cbData]; + Marshal.Copy(cipherBlob.pbData, cipherBytes, 0, cipherBlob.cbData); + return BitConverter.ToString(cipherBytes).Replace("-", ""); + } catch (Exception ex) { + throw new Exception("DPAPI encryption exception", ex); + } finally { + if (plainBlob.pbData != IntPtr.Zero) { + Marshal.FreeHGlobal(plainBlob.pbData); + } + + if (cipherBlob.pbData != IntPtr.Zero) { + Marshal.FreeHGlobal(cipherBlob.pbData); + } + } + } + + private string CreateRdpFile() { + string domain = null; + string username; + string[] splitname = _rdp.Username.Split("\\".ToCharArray()); + if (splitname.Length == 2) { + domain = splitname[0]; + username = splitname[1]; + } else { + username = _rdp.Username; + } + + string rdpName = string.Format("{0}.{1}", _rdp.Title, Guid.NewGuid().ToString()); + foreach (var c in Path.GetInvalidFileNameChars()) { + rdpName = rdpName.Replace(c, '_'); + } + string rdpFile = Path.Combine(Path.GetTempPath(), string.Format("{0}.rdp", rdpName)); // https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ff393699(v%3dws.10) - string rdpFile = Path.GetTempPath() + Guid.NewGuid().ToString() + ".rdp"; using (StreamWriter sw = new StreamWriter(rdpFile)) { sw.Write("drivestoredirect:s:*\r\nredirectprinters:i:0\r\nredirectcomports:i:0\r\nredirectsmartcards:i:0\r\nredirectposdevices:i:0\r\nnetworkautodetect:i:0\r\nauthentication level:i:0\r\nprompt for credentials:i:0\r\nnegotiate security layer:i:1\r\npromptcredentialonce:i:0\r\nsmart sizing:i:0\r\nuse multimon:i:0\r\nbandwidthautodetect:i:1\r\n"); sw.Write(string.Format("full address:s:{0}\r\n", _rdp.Host)); - sw.Write(string.Format("username:s:{0}\r\n", _rdp.Username)); - if (username.Length == 2) { - sw.Write(string.Format("domain:s:{0}\r\n", username[0])); + sw.Write(string.Format("username:s:{0}\r\n", username)); + if (!string.IsNullOrEmpty(domain)) { + sw.Write(string.Format("domain:s:{0}\r\n", domain)); + } + if (Environment.OSVersion.Platform == PlatformID.Unix) { + sw.Write(string.Format("password:s:{0}\r\n", _rdp.Password)); + } else { + sw.Write(string.Format("password 51:b:{0}\r\n", EncryptPassword(_rdp.Password))); } } - Credential credential = new Credential(_rdp.Username, _rdp.Password, string.Format("TERMSRV/{0}", host[0])); - credential.Save(); - Process p = Process.Start("mstsc", string.Format("\"{0}\"", rdpFile)); + return rdpFile; + } + + private void RunWin() { + string rdpFile = CreateRdpFile(); + Process.Start("mstsc", string.Format("\"{0}\"", rdpFile)); Thread.Sleep(1000); File.Delete(rdpFile); } private void RunUnix() { - // TODO + string rdpFile = CreateRdpFile(); + string[] cmd = _config.LinuxRDPCommand.Replace("$RDP", rdpFile).Split(" ".ToCharArray(), 2); + if (cmd.Length == 0) { + MessageBox.Show("No RDP command was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } else if (cmd.Length == 1) { + Process.Start(cmd[0]); + } else { + Process.Start(cmd[0], cmd[1]); + } + Thread.Sleep(1000); + File.Delete(rdpFile); } } } diff --git a/RCM/Record/RDP/RDPConfig.cs b/RCM/Record/RDP/RDPConfig.cs new file mode 100644 index 0000000..e29b6af --- /dev/null +++ b/RCM/Record/RDP/RDPConfig.cs @@ -0,0 +1,23 @@ +using System; +using System.Windows.Forms; + +namespace RCM { + [DisplayName("RDP")] + [Serializable] + public class RDPConfig : IConfigSection { + public string LinuxRDPCommand { get; set; } + [NonSerialized] + private RDPConfigControl _control; + + public UserControl GetControl() { + if (_control == null || _control.IsDisposed) { + _control = new RDPConfigControl(this); + } + return _control; + } + + public void UpdateFromControl() { + LinuxRDPCommand = _control.textBoxLinuxRDPCommand.Text; + } + } +} diff --git a/RCM/Record/RDP/RDPConfigControl.Designer.cs b/RCM/Record/RDP/RDPConfigControl.Designer.cs new file mode 100644 index 0000000..c92e46c --- /dev/null +++ b/RCM/Record/RDP/RDPConfigControl.Designer.cs @@ -0,0 +1,89 @@ +namespace RCM { + partial class RDPConfigControl { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.labelLinuxRDPCommandHelp = new System.Windows.Forms.Label(); + this.textBoxLinuxRDPCommand = new System.Windows.Forms.TextBox(); + this.labelLinuxSSHCommand = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.labelLinuxRDPCommandHelp); + this.groupBox1.Controls.Add(this.textBoxLinuxRDPCommand); + this.groupBox1.Controls.Add(this.labelLinuxSSHCommand); + this.groupBox1.Location = new System.Drawing.Point(3, 6); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(487, 68); + this.groupBox1.TabIndex = 10; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Linux"; + // + // labelLinuxRDPCommandHelp + // + this.labelLinuxRDPCommandHelp.AutoSize = true; + this.labelLinuxRDPCommandHelp.Location = new System.Drawing.Point(129, 42); + this.labelLinuxRDPCommandHelp.Name = "labelLinuxRDPCommandHelp"; + this.labelLinuxRDPCommandHelp.Size = new System.Drawing.Size(194, 13); + this.labelLinuxRDPCommandHelp.TabIndex = 7; + this.labelLinuxRDPCommandHelp.Text = "Use $RDP to inject the path to RDP file"; + // + // textBoxLinuxRDPCommand + // + this.textBoxLinuxRDPCommand.Location = new System.Drawing.Point(132, 19); + this.textBoxLinuxRDPCommand.Name = "textBoxLinuxRDPCommand"; + this.textBoxLinuxRDPCommand.Size = new System.Drawing.Size(342, 20); + this.textBoxLinuxRDPCommand.TabIndex = 1; + // + // labelLinuxSSHCommand + // + this.labelLinuxSSHCommand.AutoSize = true; + this.labelLinuxSSHCommand.Location = new System.Drawing.Point(19, 22); + this.labelLinuxSSHCommand.Name = "labelLinuxSSHCommand"; + this.labelLinuxSSHCommand.Size = new System.Drawing.Size(113, 13); + this.labelLinuxSSHCommand.TabIndex = 0; + this.labelLinuxSSHCommand.Text = "Command to run RDP:"; + // + // RDPConfigControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "RDPConfigControl"; + this.Size = new System.Drawing.Size(499, 99); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label labelLinuxRDPCommandHelp; + public System.Windows.Forms.TextBox textBoxLinuxRDPCommand; + private System.Windows.Forms.Label labelLinuxSSHCommand; + } +} diff --git a/RCM/Record/RDP/RDPConfigControl.cs b/RCM/Record/RDP/RDPConfigControl.cs new file mode 100644 index 0000000..14b1b24 --- /dev/null +++ b/RCM/Record/RDP/RDPConfigControl.cs @@ -0,0 +1,10 @@ +using System.Windows.Forms; + +namespace RCM { + public partial class RDPConfigControl : UserControl { + public RDPConfigControl(RDPConfig rdpConfig) { + InitializeComponent(); + textBoxLinuxRDPCommand.Text = rdpConfig.LinuxRDPCommand; + } + } +} diff --git a/RCM/Record/RDP/RDPConfigControl.resx b/RCM/Record/RDP/RDPConfigControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RCM/Record/RDP/RDPConfigControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RCM/Record/RDP/SMBAction.cs b/RCM/Record/RDP/SMBAction.cs index 51dd495..b204b46 100644 --- a/RCM/Record/RDP/SMBAction.cs +++ b/RCM/Record/RDP/SMBAction.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Windows.Forms; namespace RCM { [DisplayName("Browse via SMB")] @@ -15,12 +12,19 @@ namespace RCM { } public void Run() { - string[] host = _rdp.Host.Split(new char[] { ':' }); + string[] host = _rdp.Host.Split(":".ToCharArray()); if (Environment.OSVersion.Platform == PlatformID.Unix) { - // TODO + MessageBox.Show("This feature is not yet implemented", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + // TODO: Implement } else { - Process.Start("explorer.exe", string.Format("\\\\{0}", host[0])); // TODO: net use credentials? + Process netUse = Process.Start("net", string.Format("use \\\\{0} \"/USER:{1}\" \"{2}\"", host[0], _rdp.Username, _rdp.Password)); + netUse.WaitForExit(); + if (netUse.ExitCode == 0) { + Process.Start("explorer.exe", string.Format("\\\\{0}", host[0])); + } else { + MessageBox.Show("Unable to open the SMB share path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } } diff --git a/RCM/Record/SSH/SCPAction.cs b/RCM/Record/SSH/SCPAction.cs index c275a1e..509ea63 100644 --- a/RCM/Record/SSH/SCPAction.cs +++ b/RCM/Record/SSH/SCPAction.cs @@ -1,7 +1,6 @@ using System; using System.Diagnostics; using System.IO; -using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -36,11 +35,11 @@ namespace RCM { MessageBox.Show("WinSCP path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (string.IsNullOrWhiteSpace(_config.SSHKeys) && string.IsNullOrWhiteSpace(_ssh.Password)) { + if ((_config.SSHKeys == null || _config.SSHKeys.Length == 0) && string.IsNullOrWhiteSpace(_ssh.Password)) { MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { + if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) { if (string.IsNullOrWhiteSpace(_config.PageantPath)) { MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; @@ -52,16 +51,23 @@ namespace RCM { } StringBuilder scpParams = new StringBuilder(); - if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { - Process.Start(_config.PageantPath, _config.SSHKeys); - scpParams.Append(string.Format("/privatekey={0} ", _config.SSHKeys)); //TODO: Zvlada vic klicu? + if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) { + StringBuilder pageantParams = new StringBuilder(); + foreach (string sshKey in _config.SSHKeys) { + pageantParams.AppendFormat("\"{0}\" ", sshKey); + } + Process.Start(_config.PageantPath, pageantParams.ToString()); + } + scpParams.AppendFormat("sftp://{0}@{1}", _ssh.Username, _ssh.Host); + if (!string.IsNullOrWhiteSpace(_ssh.Password)) { + scpParams.AppendFormat(" \"/password={0}\"", _ssh.Password); } - scpParams.AppendFormat("scp://{0}@{1}", _ssh.Username, _ssh.Host); // TODO: password? Process.Start(_config.WinSCPPath, scpParams.ToString()); } private void RunUnix() { - // TOOD + MessageBox.Show("This feature is not yet implemented", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + // TODO: Implement } } } diff --git a/RCM/Record/SSH/SSH.cs b/RCM/Record/SSH/SSH.cs index b8144cb..61f8eee 100644 --- a/RCM/Record/SSH/SSH.cs +++ b/RCM/Record/SSH/SSH.cs @@ -1,9 +1,4 @@ using System; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace RCM { diff --git a/RCM/Record/SSH/SSHAction.cs b/RCM/Record/SSH/SSHAction.cs index 966a5ad..928bfb2 100644 --- a/RCM/Record/SSH/SSHAction.cs +++ b/RCM/Record/SSH/SSHAction.cs @@ -35,11 +35,11 @@ namespace RCM { MessageBox.Show("PuTTY path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (string.IsNullOrWhiteSpace(_config.SSHKeys) && string.IsNullOrWhiteSpace(_ssh.Password)) { + if ((_config.SSHKeys == null || _config.SSHKeys.Length == 0) && string.IsNullOrWhiteSpace(_ssh.Password)) { MessageBox.Show("No authentication method was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { + if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) { if (string.IsNullOrWhiteSpace(_config.PageantPath)) { MessageBox.Show("Pageant path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; @@ -50,23 +50,47 @@ namespace RCM { } } - string[] host = _ssh.Host.Split(new char[] { ':' }); + string[] host = _ssh.Host.Split(":".ToCharArray()); StringBuilder puttyParams = new StringBuilder(); - if (!string.IsNullOrWhiteSpace(_config.SSHKeys)) { - Process.Start(_config.PageantPath, _config.SSHKeys); - puttyParams.AppendFormat("-i {0} ", _config.SSHKeys); - } else { + if (_config.SSHKeys != null && _config.SSHKeys.Length != 0) { + StringBuilder pageantParams = new StringBuilder(); + foreach (string sshKey in _config.SSHKeys) { + pageantParams.AppendFormat("\"{0}\" ", sshKey); + } + Process.Start(_config.PageantPath, pageantParams.ToString()); + } + if (!string.IsNullOrWhiteSpace(_ssh.Password)) { puttyParams.AppendFormat("-pw {0} ", _ssh.Password); } if (host.Length > 1) { puttyParams.AppendFormat("-P {0} ", host[1]); } - puttyParams.AppendFormat("{0}@{1}", _ssh.Username, host[0]); + if (!string.IsNullOrWhiteSpace(_ssh.Username)) { + puttyParams.AppendFormat("{0}@", _ssh.Username); + } + puttyParams.Append(host[0]); Process.Start(_config.PuttyPath, puttyParams.ToString()); } private void RunUnix() { - // TODO + string[] host = _ssh.Host.Split(":".ToCharArray()); + StringBuilder sshParams = new StringBuilder("ssh "); + if (host.Length > 1) { + sshParams.AppendFormat("-p {0} ", host[1]); + } + if (!string.IsNullOrWhiteSpace(_ssh.Username)) { + sshParams.AppendFormat("{0}@", _ssh.Username); + } + sshParams.Append(host[0]); + + string[] cmd = _config.LinuxSSHCommand.Replace("$SSH", sshParams.ToString()).Split(" ".ToCharArray(), 2); + if (cmd.Length == 0) { + MessageBox.Show("No SSH command was set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } else if (cmd.Length == 1) { + Process.Start(cmd[0]); + } else { + Process.Start(cmd[0], cmd[1]); + } } } } diff --git a/RCM/Record/SSH/SSHConfig.cs b/RCM/Record/SSH/SSHConfig.cs index f12da7c..05b2bb6 100644 --- a/RCM/Record/SSH/SSHConfig.cs +++ b/RCM/Record/SSH/SSHConfig.cs @@ -1,18 +1,15 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace RCM { [DisplayName("SSH")] [Serializable] public class SSHConfig : IConfigSection { - public string SSHKeys { get; set; } + public string[] SSHKeys { get; set; } public string PuttyPath { get; set; } public string PageantPath { get; set; } public string WinSCPPath { get; set; } + public string LinuxSSHCommand { get; set; } [NonSerialized] private SSHConfigControl _control; @@ -24,10 +21,11 @@ namespace RCM { } public void UpdateFromControl() { - SSHKeys = _control.textBoxSshKeys.Text; + SSHKeys = _control.SSHKeys; PuttyPath = _control.textBoxPutty.Text; PageantPath = _control.textBoxPageant.Text; WinSCPPath = _control.textBoxWinSCP.Text; + LinuxSSHCommand = _control.textBoxLinuxSSHCommand.Text; } } } diff --git a/RCM/Record/SSH/SSHConfigControl.Designer.cs b/RCM/Record/SSH/SSHConfigControl.Designer.cs index b6fd4eb..dc28f73 100644 --- a/RCM/Record/SSH/SSHConfigControl.Designer.cs +++ b/RCM/Record/SSH/SSHConfigControl.Designer.cs @@ -25,6 +25,9 @@ private void InitializeComponent() { this.labelPutty = new System.Windows.Forms.Label(); this.groupBoxWindows = new System.Windows.Forms.GroupBox(); + this.buttonSelectWinSCP = new System.Windows.Forms.Button(); + this.textBoxWinSCP = new System.Windows.Forms.TextBox(); + this.labelWinSCP = new System.Windows.Forms.Label(); this.buttonSelectPageant = new System.Windows.Forms.Button(); this.buttonSelectPutty = new System.Windows.Forms.Button(); this.textBoxPageant = new System.Windows.Forms.TextBox(); @@ -36,11 +39,13 @@ this.openFileDialogSshKeys = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogPutty = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogPageant = new System.Windows.Forms.OpenFileDialog(); - this.buttonSelectWinSCP = new System.Windows.Forms.Button(); - this.textBoxWinSCP = new System.Windows.Forms.TextBox(); - this.labelWinSCP = new System.Windows.Forms.Label(); this.openFileDialogWinSCP = new System.Windows.Forms.OpenFileDialog(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.labelLinuxSSHCommandHelp = new System.Windows.Forms.Label(); + this.textBoxLinuxSSHCommand = new System.Windows.Forms.TextBox(); + this.labelLinuxSSHCommand = new System.Windows.Forms.Label(); this.groupBoxWindows.SuspendLayout(); + this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // labelPutty @@ -55,27 +60,56 @@ // groupBoxWindows // this.groupBoxWindows.Controls.Add(this.buttonSelectWinSCP); + this.groupBoxWindows.Controls.Add(this.buttonSelectSshKeys); this.groupBoxWindows.Controls.Add(this.textBoxWinSCP); + this.groupBoxWindows.Controls.Add(this.textBoxSshKeys); this.groupBoxWindows.Controls.Add(this.labelWinSCP); + this.groupBoxWindows.Controls.Add(this.labelSshKey); this.groupBoxWindows.Controls.Add(this.buttonSelectPageant); this.groupBoxWindows.Controls.Add(this.buttonSelectPutty); this.groupBoxWindows.Controls.Add(this.textBoxPageant); this.groupBoxWindows.Controls.Add(this.textBoxPutty); this.groupBoxWindows.Controls.Add(this.labelPageant); this.groupBoxWindows.Controls.Add(this.labelPutty); - this.groupBoxWindows.Location = new System.Drawing.Point(3, 39); + this.groupBoxWindows.Location = new System.Drawing.Point(3, 3); this.groupBoxWindows.Name = "groupBoxWindows"; - this.groupBoxWindows.Size = new System.Drawing.Size(487, 108); + this.groupBoxWindows.Size = new System.Drawing.Size(487, 130); this.groupBoxWindows.TabIndex = 1; this.groupBoxWindows.TabStop = false; this.groupBoxWindows.Text = "Windows"; // + // buttonSelectWinSCP + // + this.buttonSelectWinSCP.Location = new System.Drawing.Point(452, 70); + this.buttonSelectWinSCP.Name = "buttonSelectWinSCP"; + this.buttonSelectWinSCP.Size = new System.Drawing.Size(22, 22); + this.buttonSelectWinSCP.TabIndex = 6; + this.buttonSelectWinSCP.Text = "⋯"; + this.buttonSelectWinSCP.UseVisualStyleBackColor = true; + this.buttonSelectWinSCP.Click += new System.EventHandler(this.ButtonSelectWinSCP_Click); + // + // textBoxWinSCP + // + this.textBoxWinSCP.Location = new System.Drawing.Point(132, 71); + this.textBoxWinSCP.Name = "textBoxWinSCP"; + this.textBoxWinSCP.Size = new System.Drawing.Size(314, 20); + this.textBoxWinSCP.TabIndex = 5; + // + // labelWinSCP + // + this.labelWinSCP.AutoSize = true; + this.labelWinSCP.Location = new System.Drawing.Point(19, 74); + this.labelWinSCP.Name = "labelWinSCP"; + this.labelWinSCP.Size = new System.Drawing.Size(107, 13); + this.labelWinSCP.TabIndex = 7; + this.labelWinSCP.Text = "Path to WinSCP.exe:"; + // // buttonSelectPageant // this.buttonSelectPageant.Location = new System.Drawing.Point(452, 44); this.buttonSelectPageant.Name = "buttonSelectPageant"; this.buttonSelectPageant.Size = new System.Drawing.Size(22, 22); - this.buttonSelectPageant.TabIndex = 6; + this.buttonSelectPageant.TabIndex = 4; this.buttonSelectPageant.Text = "⋯"; this.buttonSelectPageant.UseVisualStyleBackColor = true; this.buttonSelectPageant.Click += new System.EventHandler(this.ButtonSelectPageant_Click); @@ -85,7 +119,7 @@ this.buttonSelectPutty.Location = new System.Drawing.Point(452, 18); this.buttonSelectPutty.Name = "buttonSelectPutty"; this.buttonSelectPutty.Size = new System.Drawing.Size(22, 22); - this.buttonSelectPutty.TabIndex = 6; + this.buttonSelectPutty.TabIndex = 2; this.buttonSelectPutty.Text = "⋯"; this.buttonSelectPutty.UseVisualStyleBackColor = true; this.buttonSelectPutty.Click += new System.EventHandler(this.ButtonSelectPutty_Click); @@ -102,7 +136,7 @@ this.textBoxPutty.Location = new System.Drawing.Point(132, 19); this.textBoxPutty.Name = "textBoxPutty"; this.textBoxPutty.Size = new System.Drawing.Size(314, 20); - this.textBoxPutty.TabIndex = 2; + this.textBoxPutty.TabIndex = 1; // // labelPageant // @@ -116,7 +150,7 @@ // labelSshKey // this.labelSshKey.AutoSize = true; - this.labelSshKey.Location = new System.Drawing.Point(8, 10); + this.labelSshKey.Location = new System.Drawing.Point(19, 100); this.labelSshKey.Name = "labelSshKey"; this.labelSshKey.Size = new System.Drawing.Size(99, 13); this.labelSshKey.TabIndex = 4; @@ -124,24 +158,24 @@ // // textBoxSshKeys // - this.textBoxSshKeys.Location = new System.Drawing.Point(135, 7); + this.textBoxSshKeys.Location = new System.Drawing.Point(132, 97); this.textBoxSshKeys.Name = "textBoxSshKeys"; this.textBoxSshKeys.Size = new System.Drawing.Size(314, 20); - this.textBoxSshKeys.TabIndex = 4; + this.textBoxSshKeys.TabIndex = 7; // // buttonSelectSshKeys // - this.buttonSelectSshKeys.Location = new System.Drawing.Point(455, 6); + this.buttonSelectSshKeys.Location = new System.Drawing.Point(452, 96); this.buttonSelectSshKeys.Name = "buttonSelectSshKeys"; this.buttonSelectSshKeys.Size = new System.Drawing.Size(22, 22); - this.buttonSelectSshKeys.TabIndex = 5; + this.buttonSelectSshKeys.TabIndex = 8; this.buttonSelectSshKeys.Text = "⋯"; this.buttonSelectSshKeys.UseVisualStyleBackColor = true; this.buttonSelectSshKeys.Click += new System.EventHandler(this.ButtonSelectSshKeys_Click); // // openFileDialogSshKeys // - this.openFileDialogSshKeys.Filter = "OpenSSH keys (*.pub)|*.pub|PuTTY keys (*.ppk)|*.ppk|All files (*.*)|*.*"; + this.openFileDialogSshKeys.Filter = "PuTTY keys (*.ppk)|*.ppk|All files (*.*)|*.*"; this.openFileDialogSshKeys.Multiselect = true; // // openFileDialogPutty @@ -152,50 +186,60 @@ // this.openFileDialogPageant.Filter = "Pageant.exe|Pageant.exe"; // - // buttonSelectWinSCP - // - this.buttonSelectWinSCP.Location = new System.Drawing.Point(452, 70); - this.buttonSelectWinSCP.Name = "buttonSelectWinSCP"; - this.buttonSelectWinSCP.Size = new System.Drawing.Size(22, 22); - this.buttonSelectWinSCP.TabIndex = 9; - this.buttonSelectWinSCP.Text = "⋯"; - this.buttonSelectWinSCP.UseVisualStyleBackColor = true; - this.buttonSelectWinSCP.Click += new System.EventHandler(this.ButtonSelectWinSCP_Click); - // - // textBoxWinSCP - // - this.textBoxWinSCP.Location = new System.Drawing.Point(132, 71); - this.textBoxWinSCP.Name = "textBoxWinSCP"; - this.textBoxWinSCP.Size = new System.Drawing.Size(314, 20); - this.textBoxWinSCP.TabIndex = 8; - // - // labelWinSCP - // - this.labelWinSCP.AutoSize = true; - this.labelWinSCP.Location = new System.Drawing.Point(19, 74); - this.labelWinSCP.Name = "labelWinSCP"; - this.labelWinSCP.Size = new System.Drawing.Size(107, 13); - this.labelWinSCP.TabIndex = 7; - this.labelWinSCP.Text = "Path to WinSCP.exe:"; - // // openFileDialogWinSCP // this.openFileDialogWinSCP.Filter = "WinSCP.exe|WinSCP.exe"; // + // groupBox1 + // + this.groupBox1.Controls.Add(this.labelLinuxSSHCommandHelp); + this.groupBox1.Controls.Add(this.textBoxLinuxSSHCommand); + this.groupBox1.Controls.Add(this.labelLinuxSSHCommand); + this.groupBox1.Location = new System.Drawing.Point(3, 139); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(487, 68); + this.groupBox1.TabIndex = 10; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Linux"; + // + // labelLinuxSSHCommandHelp + // + this.labelLinuxSSHCommandHelp.AutoSize = true; + this.labelLinuxSSHCommandHelp.Location = new System.Drawing.Point(129, 42); + this.labelLinuxSSHCommandHelp.Name = "labelLinuxSSHCommandHelp"; + this.labelLinuxSSHCommandHelp.Size = new System.Drawing.Size(189, 13); + this.labelLinuxSSHCommandHelp.TabIndex = 7; + this.labelLinuxSSHCommandHelp.Text = "Use $SSH to inject the SSH command"; + // + // textBoxLinuxSSHCommand + // + this.textBoxLinuxSSHCommand.Location = new System.Drawing.Point(132, 19); + this.textBoxLinuxSSHCommand.Name = "textBoxLinuxSSHCommand"; + this.textBoxLinuxSSHCommand.Size = new System.Drawing.Size(342, 20); + this.textBoxLinuxSSHCommand.TabIndex = 9; + // + // labelLinuxSSHCommand + // + this.labelLinuxSSHCommand.AutoSize = true; + this.labelLinuxSSHCommand.Location = new System.Drawing.Point(19, 22); + this.labelLinuxSSHCommand.Name = "labelLinuxSSHCommand"; + this.labelLinuxSSHCommand.Size = new System.Drawing.Size(112, 13); + this.labelLinuxSSHCommand.TabIndex = 0; + this.labelLinuxSSHCommand.Text = "Command to run SSH:"; + // // SSHConfigControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.buttonSelectSshKeys); - this.Controls.Add(this.textBoxSshKeys); - this.Controls.Add(this.labelSshKey); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBoxWindows); this.Name = "SSHConfigControl"; - this.Size = new System.Drawing.Size(499, 172); + this.Size = new System.Drawing.Size(499, 220); this.groupBoxWindows.ResumeLayout(false); this.groupBoxWindows.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); this.ResumeLayout(false); - this.PerformLayout(); } @@ -218,5 +262,9 @@ public System.Windows.Forms.TextBox textBoxWinSCP; private System.Windows.Forms.Label labelWinSCP; private System.Windows.Forms.OpenFileDialog openFileDialogWinSCP; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label labelLinuxSSHCommandHelp; + public System.Windows.Forms.TextBox textBoxLinuxSSHCommand; + private System.Windows.Forms.Label labelLinuxSSHCommand; } } diff --git a/RCM/Record/SSH/SSHConfigControl.cs b/RCM/Record/SSH/SSHConfigControl.cs index 5957b9c..de1410c 100644 --- a/RCM/Record/SSH/SSHConfigControl.cs +++ b/RCM/Record/SSH/SSHConfigControl.cs @@ -3,15 +3,22 @@ using System.Windows.Forms; namespace RCM { public partial class SSHConfigControl : UserControl { + public string[] SSHKeys { get; private set; } + public SSHConfigControl(SSHConfig sshConfig) { InitializeComponent(); textBoxPutty.Text = sshConfig.PuttyPath; textBoxPageant.Text = sshConfig.PageantPath; - textBoxSshKeys.Text = sshConfig.SSHKeys; + SSHKeys = sshConfig.SSHKeys; + if (SSHKeys != null) { + textBoxSshKeys.Text = string.Join(",", SSHKeys); + } + textBoxLinuxSSHCommand.Text = sshConfig.LinuxSSHCommand; } private void ButtonSelectSshKeys_Click(object sender, EventArgs e) { if (openFileDialogSshKeys.ShowDialog() == DialogResult.OK) { + SSHKeys = openFileDialogSshKeys.FileNames; textBoxSshKeys.Text = string.Join(",", openFileDialogSshKeys.FileNames); } } diff --git a/RCM/Record/SSH/SSHConfigControl.resx b/RCM/Record/SSH/SSHConfigControl.resx new file mode 100644 index 0000000..bdac2b8 --- /dev/null +++ b/RCM/Record/SSH/SSHConfigControl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 194, 17 + + + 356, 17 + + + 534, 17 + + \ No newline at end of file diff --git a/RCM/Record/WebSite/BrowserAction.cs b/RCM/Record/WebSite/BrowserAction.cs index 008de85..81e613e 100644 --- a/RCM/Record/WebSite/BrowserAction.cs +++ b/RCM/Record/WebSite/BrowserAction.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace RCM { @@ -16,8 +13,13 @@ namespace RCM { public async void Run() { await Task.Run(() => { - if (_website.URL.StartsWith("http://") || _website.URL.StartsWith("https://")) - Process.Start(_website.URL); // TODO: vyplnovat hesla + if (_website.URL.StartsWith("http://") || _website.URL.StartsWith("https://")) { + if (Environment.OSVersion.Platform == PlatformID.Unix) { + Process.Start("xdg-open", _website.URL); + } else { + Process.Start(_website.URL); // TODO: vyplnovat hesla + } + } }); } } diff --git a/RCM/Record/WebSite/WebSite.cs b/RCM/Record/WebSite/WebSite.cs index 4855693..28b7a32 100644 --- a/RCM/Record/WebSite/WebSite.cs +++ b/RCM/Record/WebSite/WebSite.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.Windows.Forms; namespace RCM { diff --git a/RCM/Record/WinBox/WinBoxAction.cs b/RCM/Record/WinBox/WinBoxAction.cs index 37ff5eb..000d26a 100644 --- a/RCM/Record/WinBox/WinBoxAction.cs +++ b/RCM/Record/WinBox/WinBoxAction.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Forms; namespace RCM { [DisplayName("Start WinBox")] @@ -19,6 +20,14 @@ namespace RCM { public async void Run() { await Task.Run(() => { + if (string.IsNullOrWhiteSpace(_config.WinBoxPath)) { + MessageBox.Show("WinBox path is not set", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (!File.Exists(_config.WinBoxPath)) { + MessageBox.Show("WinBox path does not exist", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } if (Environment.OSVersion.Platform == PlatformID.Unix) { RunUnix(); } else { @@ -28,12 +37,12 @@ namespace RCM { } private void RunWin() { - string winboxParam = string.Format("{0} \"{1}\" \"{2}\"", _winbox.Host, _winbox.Username, _winbox.Password); + string winboxParam = string.Format("\"{0}\" \"{1}\" \"{2}\"", _winbox.Host, _winbox.Username, _winbox.Password); Process.Start(_config.WinBoxPath, winboxParam); } private void RunUnix() { - string winboxParam = string.Format("{0} {1} \"{2}\" \"{3}\"", _config.WinBoxPath, _winbox.Host, _winbox.Username, _winbox.Password); + string winboxParam = string.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"", _config.WinBoxPath, _winbox.Host, _winbox.Username, _winbox.Password); Process.Start("wine", winboxParam); } } diff --git a/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs b/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs index 83b1b4c..70f4f05 100644 --- a/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs +++ b/RCM/Record/WinBox/WinBoxConfigControl.Designer.cs @@ -34,7 +34,7 @@ this.buttonSelectWinBox.Location = new System.Drawing.Point(455, 6); this.buttonSelectWinBox.Name = "buttonSelectWinBox"; this.buttonSelectWinBox.Size = new System.Drawing.Size(22, 22); - this.buttonSelectWinBox.TabIndex = 9; + this.buttonSelectWinBox.TabIndex = 2; this.buttonSelectWinBox.Text = "⋯"; this.buttonSelectWinBox.UseVisualStyleBackColor = true; this.buttonSelectWinBox.Click += new System.EventHandler(this.ButtonSelectWinBox_Click); @@ -44,7 +44,7 @@ this.textBoxWinBox.Location = new System.Drawing.Point(135, 7); this.textBoxWinBox.Name = "textBoxWinBox"; this.textBoxWinBox.Size = new System.Drawing.Size(314, 20); - this.textBoxWinBox.TabIndex = 8; + this.textBoxWinBox.TabIndex = 1; // // labelWinBox // @@ -57,7 +57,7 @@ // // openFileDialogWinBox // - this.openFileDialogWinBox.Filter = "WinBox.exe|WinBox.exe"; + this.openFileDialogWinBox.Filter = "WinBox*.exe|WinBox*.exe"; // // WinBoxConfigControl // diff --git a/RCM/RecordNodeSorter.cs b/RCM/RecordNodeSorter.cs index 234066b..261074f 100644 --- a/RCM/RecordNodeSorter.cs +++ b/RCM/RecordNodeSorter.cs @@ -7,7 +7,7 @@ namespace RCM { IRecord record1 = (IRecord)((TreeNode)o1).Tag; IRecord record2 = (IRecord)((TreeNode)o2).Tag; - int result = 0; + int result; if (record1 is Group) { if (record2 is Group) { diff --git a/RCM/TypeExtensions.cs b/RCM/TypeExtensions.cs index 0c7102a..7a42ec3 100644 --- a/RCM/TypeExtensions.cs +++ b/RCM/TypeExtensions.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace RCM { public static class TypeExtensions { diff --git a/RCM/ZZImporter.cs b/RCM/ZZImporter.cs new file mode 100644 index 0000000..1115d02 --- /dev/null +++ b/RCM/ZZImporter.cs @@ -0,0 +1,82 @@ +/*using Microsoft.VisualBasic.FileIO; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace RCM { + public static class Importer { + public static List GetRecordsFromRDM() { + Dictionary groups = new Dictionary(); + List records = new List(); + string previousGroup = null; + + using (TextFieldParser parser = new TextFieldParser("EntryList.csv", Encoding.UTF8)) { + parser.TextFieldType = FieldType.Delimited; + parser.SetDelimiters(","); + parser.ReadFields(); // Skip headers + while (!parser.EndOfData) { + string[] fields = parser.ReadFields(); + string type = fields[0]; + string name = fields[3]; + string group = fields[4]; + string parent = fields[7]; + string host = fields[8]; + string port = fields[9]; + string username = fields[10]; + string domain = fields[11]; + string password = fields[12]; + string url = fields[14]; + + if (!string.IsNullOrWhiteSpace(parent)) { + // Naive identification of subconnections ownership + group = previousGroup; + } + if (!string.IsNullOrWhiteSpace(port)) { + host = string.Format("{0}:{1}", host, port); + } + if (!string.IsNullOrWhiteSpace(domain)) { + username = string.Format("{0}\\{1}", domain, username); + } + + IRecord record = null; + if (type == "Folder" || type == "Site") { + string[] splitGroup = group.Split("\\".ToCharArray()); + group = string.Join("\\", splitGroup.Take(splitGroup.Length - 1)); + } else if (type == "Winbox") { + record = new WinBox() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password }; + } else if (type == "Microsoft Remote Desktop (RDP)") { + record = new RDP() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password }; + } else if (type == "Putty") { + record = new SSH() { Id = Guid.NewGuid(), Title = name, Host = host, Username = username, Password = password }; + } else if (type == "Web Browser (http/https)") { + record = new WebSite() { Id = Guid.NewGuid(), Title = name, URL = url, Username = username, Password = password }; + } else if (type == "FTP (Third Party)") { + // skip + } else { + MessageBox.Show(string.Format("Type: {0}, Title: {1}", type, name)); + } + if (record != null) { + string[] splitGroup = group.Split("\\".ToCharArray()); + for (int i = 0; i < splitGroup.Length; i++) { + string level = string.Join("\\", splitGroup.Take(i+1)); + if (!groups.ContainsKey(level)) { + Group g = new Group() { Id = Guid.NewGuid(), Title = splitGroup[i], GroupId = i == 0 ? Guid.Empty : groups[string.Join("\\", splitGroup.Take(i))] }; + records.Add(g); + groups.Add(level, g.Id); + } + } + record.GroupId = groups[group]; + records.Add(record); + } + previousGroup = group; + } + } + + return records; + } + } +} +*/ \ No newline at end of file diff --git a/RCM/app.config b/RCM/app.config new file mode 100644 index 0000000..68b2176 --- /dev/null +++ b/RCM/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/RCM/packages.config b/RCM/packages.config index e6fef98..9d73f3e 100644 --- a/RCM/packages.config +++ b/RCM/packages.config @@ -1,9 +1,7 @@  - - - - - + + + \ No newline at end of file diff --git a/Resources/Program.ico b/Resources/Program.ico new file mode 100644 index 0000000..86bb861 Binary files /dev/null and b/Resources/Program.ico differ diff --git a/mono.txt b/mono.txt new file mode 100644 index 0000000..5b87824 --- /dev/null +++ b/mono.txt @@ -0,0 +1,4 @@ +apt-get install mono-runtime \ +libmono-system-management4.0-cil \ +libmono-system-runtime-serialization4.0-cil \ +libmono-system-windows-forms4.0-cil