diff --git a/ConsoleTest/Program.cs b/ConsoleTest/Program.cs index 9d01510..f413eb6 100644 --- a/ConsoleTest/Program.cs +++ b/ConsoleTest/Program.cs @@ -12,16 +12,28 @@ class Program { static void Main(string[] args) { - RmCloud cloud = new RmCloud(); + string settingsRegPath = @"Software\Microsoft\Office\OneNote\AddInsData\RemarkableSync.OnenoteAddin"; + IConfigStore _configStore = new WinRegistryConfigStore(settingsRegPath); - List rootItems = cloud.GetItemHierarchy().Result; + // setup + Dictionary mapConfigs = new Dictionary(); + mapConfigs["sshHost"] = "10.11.99.1"; + mapConfigs["SshPassword"] = "ABvontxEol"; + _configStore.SetConfigs(mapConfigs); + + // end setup + + IRmDataSource dataSource = new RmSftpDataSource(_configStore); + //IRmDataSource dataSource = new RmCloudDataSource(_configStore); + + List rootItems = dataSource.GetItemHierarchy().Result; RmItem item = (from root in rootItems where root.Type == RmItem.DocumentType select root).ToArray()[0]; List pages = new List(); - using (RmDownloadedDoc doc = cloud.DownloadDocument(item).Result) + using (RmDownloadedDoc doc = dataSource.DownloadDocument(item).Result) { for (int i = 0; i < doc.PageCount; ++i) { @@ -29,7 +41,7 @@ static void Main(string[] args) } } - MyScriptClient hwrClient = new MyScriptClient(); + MyScriptClient hwrClient = new MyScriptClient(_configStore); MyScriptResult result = hwrClient.RequestHwr(pages).Result; if (result != null) { diff --git a/OnenoteAddin/AddIn.cs b/OnenoteAddin/AddIn.cs index af104ec..e647fa6 100644 --- a/OnenoteAddin/AddIn.cs +++ b/OnenoteAddin/AddIn.cs @@ -29,6 +29,8 @@ public class AddIn : IDTExtensibility2, IRibbonExtensibility protected Application OneNoteApplication { get; set; } + private const string _settingsRegPath = @"Software\Microsoft\Office\OneNote\AddInsData\RemarkableSync.OnenoteAddin"; + private RmDownloadForm _downloadForm; private SettingsForm _settingForm; private Thread _downloadFormThread; @@ -179,7 +181,7 @@ public async Task onSettingsClicked(IRibbonControl control) private void ShowDownloadForm(dynamic owner) { System.Windows.Forms.Application.EnableVisualStyles(); - _downloadForm = new RmDownloadForm(OneNoteApplication); + _downloadForm = new RmDownloadForm(OneNoteApplication, _settingsRegPath); _downloadForm.Visible = false; _downloadForm.ShowDialog(owner); _downloadForm = null; @@ -189,7 +191,7 @@ private void ShowDownloadForm(dynamic owner) private void ShowSettingsForm(dynamic owner) { System.Windows.Forms.Application.EnableVisualStyles(); - _settingForm = new SettingsForm(); + _settingForm = new SettingsForm(_settingsRegPath); _settingForm.Visible = false; _settingForm.ShowDialog(owner); _settingForm = null; diff --git a/OnenoteAddin/RmDownloadForm.Designer.cs b/OnenoteAddin/RmDownloadForm.Designer.cs index 3369348..33fa178 100644 --- a/OnenoteAddin/RmDownloadForm.Designer.cs +++ b/OnenoteAddin/RmDownloadForm.Designer.cs @@ -79,6 +79,7 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.tableLayoutPanel); this.Name = "RmDownloadForm"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.RmDownloadForm_FormClosing); this.tableLayoutPanel.ResumeLayout(false); this.tableLayoutPanel.PerformLayout(); this.ResumeLayout(false); diff --git a/OnenoteAddin/RmDownloadForm.cs b/OnenoteAddin/RmDownloadForm.cs index fd68544..d33dc2b 100644 --- a/OnenoteAddin/RmDownloadForm.cs +++ b/OnenoteAddin/RmDownloadForm.cs @@ -1,12 +1,6 @@ using RemarkableSync.RmLine; using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -46,15 +40,17 @@ public static List FromRmItem(List rmItems) } } - private RmCloud _rmCloudClient; + private IRmDataSource _rmDataSource; private Application _application; + private IConfigStore _configStore; - public RmDownloadForm(Application application) + public RmDownloadForm(Application application, string settingsRegPath) { - _rmCloudClient = new RmCloud(); + _configStore = new WinRegistryConfigStore(settingsRegPath); _application = application; + InitializeComponent(); - InitializeData(); + InitializeData(); } private async void InitializeData() @@ -62,7 +58,47 @@ private async void InitializeData() rmTreeView.Nodes.Clear(); lblInfo.Text = "Loading document list from reMarkable..."; - var rootItems = await _rmCloudClient.GetItemHierarchy(); + List rootItems = new List(); + + try + { + await Task.Run(() => + { + int connMethod = -1; + try + { + string connMethodString = _configStore.GetConfig(SettingsForm.RmConnectionMethodConfig); + connMethod = Convert.ToInt32(connMethodString); + } + catch (Exception err) + { + Console.WriteLine($"RmDownloadForm::RmDownloadForm() - Failed to get RmConnectionMethod config with err: {err.Message}"); + // will default to cloud + } + + switch (connMethod) + { + case (int)SettingsForm.RmConnectionMethod.Ssh: + _rmDataSource = new RmSftpDataSource(_configStore); + Console.WriteLine("Using SFTP data source"); + break; + case (int)SettingsForm.RmConnectionMethod.RmCloud: + default: + _rmDataSource = new RmCloudDataSource(_configStore); + Console.WriteLine("Using rm cloud data source"); + break; + } + }); + rootItems = await _rmDataSource.GetItemHierarchy(); + } + catch (Exception err) + { + Console.WriteLine($"Error getting notebook structure from reMarkable. Err: {err.Message}"); + MessageBox.Show($"Error getting notebook structure from reMarkable.\n{err.Message}", "Error"); + Close(); + return; + } + Console.WriteLine("Got item hierarchy from remarkable cloud"); var treeNodeList = RmTreeNode.FromRmItem(rootItems); @@ -88,8 +124,18 @@ private async void btnOk_Click(object sender, EventArgs e) RmTreeNode rmTreeNode = (RmTreeNode) rmTreeView.SelectedNode; Console.WriteLine($"Selected: {rmTreeNode.VisibleName} | {rmTreeNode.ID}"); - bool success = await ImportDocument(rmTreeNode); - Console.WriteLine("Import " + (success ? "successful" : "failed")); + try + { + bool success = await ImportDocument(rmTreeNode); + Console.WriteLine("Import " + (success ? "successful" : "failed")); + } + catch (Exception err) + { + Console.WriteLine($"Error importing document from reMarkable. Err: {err.Message}"); + MessageBox.Show($"Error importing document from reMarkable.\n{err.Message}", "Error"); + Close(); + return; + } } @@ -110,7 +156,7 @@ private async Task ImportDocument(RmTreeNode rmTreeNode) lblInfo.Text = $"Downloading {rmTreeNode.VisibleName}..."; - using (RmDownloadedDoc doc = await _rmCloudClient.DownloadDocument(item)) + using (RmDownloadedDoc doc = await _rmDataSource.DownloadDocument(item)) { Console.WriteLine("ImportDocument() - document downloaded"); for (int i = 0; i < doc.PageCount; ++i) @@ -120,7 +166,7 @@ private async Task ImportDocument(RmTreeNode rmTreeNode) } lblInfo.Text = $"Digitising {rmTreeNode.VisibleName}..."; - MyScriptClient hwrClient = new MyScriptClient(); + MyScriptClient hwrClient = new MyScriptClient(_configStore); Console.WriteLine("ImportDocument() - requesting hand writing recognition"); MyScriptResult result = await hwrClient.RequestHwr(pages); @@ -149,5 +195,9 @@ private void UpdateOneNoteWithHwrResult(string name, MyScriptResult result) oneNoteHelper.AddPageContent(newPageId, result.label); } + private void RmDownloadForm_FormClosing(object sender, FormClosingEventArgs e) + { + _rmDataSource?.Dispose(); + } } } diff --git a/OnenoteAddin/SettingsForm.Designer.cs b/OnenoteAddin/SettingsForm.Designer.cs index ac367f4..bef5f00 100644 --- a/OnenoteAddin/SettingsForm.Designer.cs +++ b/OnenoteAddin/SettingsForm.Designer.cs @@ -30,12 +30,12 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsForm)); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.tableLayoutRemarkable = new System.Windows.Forms.TableLayoutPanel(); - this.labelRemarkable = new System.Windows.Forms.Label(); + this.tableLayoutOverall = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutRmCloud = new System.Windows.Forms.TableLayoutPanel(); + this.labelRemarkableCloud = new System.Windows.Forms.Label(); this.labelOTC = new System.Windows.Forms.Label(); this.textOtc = new System.Windows.Forms.TextBox(); - this.btnRemarkableApply = new System.Windows.Forms.Button(); + this.btnRemarkableCloudApply = new System.Windows.Forms.Button(); this.tableLayoutMyscript = new System.Windows.Forms.TableLayoutPanel(); this.labelAppKey = new System.Windows.Forms.Label(); this.labelHmacKey = new System.Windows.Forms.Label(); @@ -43,68 +43,83 @@ private void InitializeComponent() this.textHmacKey = new System.Windows.Forms.TextBox(); this.btnMyScriptApply = new System.Windows.Forms.Button(); this.labelMyscript = new System.Windows.Forms.Label(); - this.tableLayoutPanel1.SuspendLayout(); - this.tableLayoutRemarkable.SuspendLayout(); + this.tableLayoutRmSelection = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutRmSsh = new System.Windows.Forms.TableLayoutPanel(); + this.labelRemarkableSsh = new System.Windows.Forms.Label(); + this.labelSshPassword = new System.Windows.Forms.Label(); + this.textSshPassword = new System.Windows.Forms.TextBox(); + this.btnRemarkableSshApply = new System.Windows.Forms.Button(); + this.labelRemarkableConnection = new System.Windows.Forms.Label(); + this.radioButtonRmCloud = new System.Windows.Forms.RadioButton(); + this.radioButtonRmSsh = new System.Windows.Forms.RadioButton(); + this.tableLayoutOverall.SuspendLayout(); + this.tableLayoutRmCloud.SuspendLayout(); this.tableLayoutMyscript.SuspendLayout(); + this.tableLayoutRmSelection.SuspendLayout(); + this.tableLayoutRmSsh.SuspendLayout(); this.SuspendLayout(); // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.ColumnCount = 1; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.Controls.Add(this.tableLayoutRemarkable, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.tableLayoutMyscript, 0, 1); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); - this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(10); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 3; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(484, 261); - this.tableLayoutPanel1.TabIndex = 0; - // - // tableLayoutRemarkable - // - this.tableLayoutRemarkable.ColumnCount = 3; - this.tableLayoutRemarkable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); - this.tableLayoutRemarkable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutRemarkable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); - this.tableLayoutRemarkable.Controls.Add(this.labelRemarkable, 0, 0); - this.tableLayoutRemarkable.Controls.Add(this.labelOTC, 0, 1); - this.tableLayoutRemarkable.Controls.Add(this.textOtc, 1, 1); - this.tableLayoutRemarkable.Controls.Add(this.btnRemarkableApply, 2, 1); - this.tableLayoutRemarkable.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutRemarkable.Location = new System.Drawing.Point(3, 3); - this.tableLayoutRemarkable.Name = "tableLayoutRemarkable"; - this.tableLayoutRemarkable.RowCount = 2; - this.tableLayoutRemarkable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); - this.tableLayoutRemarkable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F)); - this.tableLayoutRemarkable.Size = new System.Drawing.Size(478, 90); - this.tableLayoutRemarkable.TabIndex = 0; - // - // labelRemarkable - // - this.labelRemarkable.AutoSize = true; - this.tableLayoutRemarkable.SetColumnSpan(this.labelRemarkable, 3); - this.labelRemarkable.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelRemarkable.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRemarkable.Location = new System.Drawing.Point(3, 0); - this.labelRemarkable.Name = "labelRemarkable"; - this.labelRemarkable.Size = new System.Drawing.Size(472, 36); - this.labelRemarkable.TabIndex = 0; - this.labelRemarkable.Text = "reMarkable Tablet Setup"; - this.labelRemarkable.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // tableLayoutOverall + // + this.tableLayoutOverall.ColumnCount = 1; + this.tableLayoutOverall.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutOverall.Controls.Add(this.tableLayoutRmCloud, 0, 1); + this.tableLayoutOverall.Controls.Add(this.tableLayoutMyscript, 0, 3); + this.tableLayoutOverall.Controls.Add(this.tableLayoutRmSelection, 0, 0); + this.tableLayoutOverall.Controls.Add(this.tableLayoutRmSsh, 0, 2); + this.tableLayoutOverall.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutOverall.Location = new System.Drawing.Point(0, 0); + this.tableLayoutOverall.Margin = new System.Windows.Forms.Padding(10); + this.tableLayoutOverall.Name = "tableLayoutOverall"; + this.tableLayoutOverall.RowCount = 5; + this.tableLayoutOverall.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutOverall.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); + this.tableLayoutOverall.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); + this.tableLayoutOverall.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutOverall.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutOverall.Size = new System.Drawing.Size(484, 461); + this.tableLayoutOverall.TabIndex = 0; + // + // tableLayoutRmCloud + // + this.tableLayoutRmCloud.ColumnCount = 3; + this.tableLayoutRmCloud.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutRmCloud.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmCloud.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutRmCloud.Controls.Add(this.labelRemarkableCloud, 0, 0); + this.tableLayoutRmCloud.Controls.Add(this.labelOTC, 0, 1); + this.tableLayoutRmCloud.Controls.Add(this.textOtc, 1, 1); + this.tableLayoutRmCloud.Controls.Add(this.btnRemarkableCloudApply, 2, 1); + this.tableLayoutRmCloud.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutRmCloud.Location = new System.Drawing.Point(3, 85); + this.tableLayoutRmCloud.Name = "tableLayoutRmCloud"; + this.tableLayoutRmCloud.RowCount = 2; + this.tableLayoutRmCloud.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); + this.tableLayoutRmCloud.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F)); + this.tableLayoutRmCloud.Size = new System.Drawing.Size(478, 104); + this.tableLayoutRmCloud.TabIndex = 0; + // + // labelRemarkableCloud + // + this.labelRemarkableCloud.AutoSize = true; + this.tableLayoutRmCloud.SetColumnSpan(this.labelRemarkableCloud, 3); + this.labelRemarkableCloud.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelRemarkableCloud.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelRemarkableCloud.Location = new System.Drawing.Point(3, 0); + this.labelRemarkableCloud.Name = "labelRemarkableCloud"; + this.labelRemarkableCloud.Size = new System.Drawing.Size(472, 41); + this.labelRemarkableCloud.TabIndex = 0; + this.labelRemarkableCloud.Text = "reMarkable Cloud Setup"; + this.labelRemarkableCloud.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // labelOTC // this.labelOTC.AutoSize = true; this.labelOTC.Dock = System.Windows.Forms.DockStyle.Fill; this.labelOTC.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelOTC.Location = new System.Drawing.Point(3, 36); + this.labelOTC.Location = new System.Drawing.Point(3, 41); this.labelOTC.Name = "labelOTC"; - this.labelOTC.Size = new System.Drawing.Size(113, 54); + this.labelOTC.Size = new System.Drawing.Size(113, 63); this.labelOTC.TabIndex = 1; this.labelOTC.Text = "One Time Code"; this.labelOTC.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -112,21 +127,21 @@ private void InitializeComponent() // textOtc // this.textOtc.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.textOtc.Location = new System.Drawing.Point(122, 53); + this.textOtc.Location = new System.Drawing.Point(122, 62); this.textOtc.Name = "textOtc"; this.textOtc.Size = new System.Drawing.Size(233, 20); this.textOtc.TabIndex = 2; // - // btnRemarkableApply + // btnRemarkableCloudApply // - this.btnRemarkableApply.Anchor = System.Windows.Forms.AnchorStyles.None; - this.btnRemarkableApply.Location = new System.Drawing.Point(373, 49); - this.btnRemarkableApply.Name = "btnRemarkableApply"; - this.btnRemarkableApply.Size = new System.Drawing.Size(90, 28); - this.btnRemarkableApply.TabIndex = 3; - this.btnRemarkableApply.Text = "Apply"; - this.btnRemarkableApply.UseVisualStyleBackColor = true; - this.btnRemarkableApply.Click += new System.EventHandler(this.btnRemarkableApply_Click); + this.btnRemarkableCloudApply.Anchor = System.Windows.Forms.AnchorStyles.None; + this.btnRemarkableCloudApply.Location = new System.Drawing.Point(373, 57); + this.btnRemarkableCloudApply.Name = "btnRemarkableCloudApply"; + this.btnRemarkableCloudApply.Size = new System.Drawing.Size(90, 30); + this.btnRemarkableCloudApply.TabIndex = 3; + this.btnRemarkableCloudApply.Text = "Apply"; + this.btnRemarkableCloudApply.UseVisualStyleBackColor = true; + this.btnRemarkableCloudApply.Click += new System.EventHandler(this.btnRemarkableApply_Click); // // tableLayoutMyscript // @@ -141,13 +156,13 @@ private void InitializeComponent() this.tableLayoutMyscript.Controls.Add(this.btnMyScriptApply, 2, 2); this.tableLayoutMyscript.Controls.Add(this.labelMyscript, 0, 0); this.tableLayoutMyscript.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutMyscript.Location = new System.Drawing.Point(3, 99); + this.tableLayoutMyscript.Location = new System.Drawing.Point(3, 305); this.tableLayoutMyscript.Name = "tableLayoutMyscript"; this.tableLayoutMyscript.RowCount = 3; this.tableLayoutMyscript.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); this.tableLayoutMyscript.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); this.tableLayoutMyscript.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); - this.tableLayoutMyscript.Size = new System.Drawing.Size(478, 138); + this.tableLayoutMyscript.Size = new System.Drawing.Size(478, 131); this.tableLayoutMyscript.TabIndex = 1; // // labelAppKey @@ -155,9 +170,9 @@ private void InitializeComponent() this.labelAppKey.AutoSize = true; this.labelAppKey.Dock = System.Windows.Forms.DockStyle.Fill; this.labelAppKey.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelAppKey.Location = new System.Drawing.Point(3, 55); + this.labelAppKey.Location = new System.Drawing.Point(3, 52); this.labelAppKey.Name = "labelAppKey"; - this.labelAppKey.Size = new System.Drawing.Size(113, 41); + this.labelAppKey.Size = new System.Drawing.Size(113, 39); this.labelAppKey.TabIndex = 1; this.labelAppKey.Text = "App Key"; this.labelAppKey.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -167,9 +182,9 @@ private void InitializeComponent() this.labelHmacKey.AutoSize = true; this.labelHmacKey.Dock = System.Windows.Forms.DockStyle.Fill; this.labelHmacKey.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelHmacKey.Location = new System.Drawing.Point(3, 96); + this.labelHmacKey.Location = new System.Drawing.Point(3, 91); this.labelHmacKey.Name = "labelHmacKey"; - this.labelHmacKey.Size = new System.Drawing.Size(113, 42); + this.labelHmacKey.Size = new System.Drawing.Size(113, 40); this.labelHmacKey.TabIndex = 2; this.labelHmacKey.Text = "HMAC Key"; this.labelHmacKey.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -177,7 +192,7 @@ private void InitializeComponent() // textAppKey // this.textAppKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.textAppKey.Location = new System.Drawing.Point(122, 65); + this.textAppKey.Location = new System.Drawing.Point(122, 61); this.textAppKey.Name = "textAppKey"; this.textAppKey.Size = new System.Drawing.Size(233, 20); this.textAppKey.TabIndex = 3; @@ -185,7 +200,7 @@ private void InitializeComponent() // textHmacKey // this.textHmacKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.textHmacKey.Location = new System.Drawing.Point(122, 107); + this.textHmacKey.Location = new System.Drawing.Point(122, 101); this.textHmacKey.Name = "textHmacKey"; this.textHmacKey.Size = new System.Drawing.Size(233, 20); this.textHmacKey.TabIndex = 4; @@ -193,9 +208,9 @@ private void InitializeComponent() // btnMyScriptApply // this.btnMyScriptApply.Anchor = System.Windows.Forms.AnchorStyles.None; - this.btnMyScriptApply.Location = new System.Drawing.Point(373, 103); + this.btnMyScriptApply.Location = new System.Drawing.Point(373, 96); this.btnMyScriptApply.Name = "btnMyScriptApply"; - this.btnMyScriptApply.Size = new System.Drawing.Size(90, 28); + this.btnMyScriptApply.Size = new System.Drawing.Size(90, 30); this.btnMyScriptApply.TabIndex = 5; this.btnMyScriptApply.Text = "Apply"; this.btnMyScriptApply.UseVisualStyleBackColor = true; @@ -209,34 +224,163 @@ private void InitializeComponent() this.labelMyscript.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelMyscript.Location = new System.Drawing.Point(3, 0); this.labelMyscript.Name = "labelMyscript"; - this.labelMyscript.Size = new System.Drawing.Size(472, 55); + this.labelMyscript.Size = new System.Drawing.Size(472, 52); this.labelMyscript.TabIndex = 0; this.labelMyscript.Text = "MyScript Setup"; this.labelMyscript.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // + // tableLayoutRmSelection + // + this.tableLayoutRmSelection.ColumnCount = 2; + this.tableLayoutRmSelection.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSelection.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSelection.Controls.Add(this.labelRemarkableConnection, 0, 0); + this.tableLayoutRmSelection.Controls.Add(this.radioButtonRmCloud, 0, 1); + this.tableLayoutRmSelection.Controls.Add(this.radioButtonRmSsh, 1, 1); + this.tableLayoutRmSelection.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutRmSelection.Location = new System.Drawing.Point(3, 3); + this.tableLayoutRmSelection.Name = "tableLayoutRmSelection"; + this.tableLayoutRmSelection.RowCount = 2; + this.tableLayoutRmSelection.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSelection.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSelection.Size = new System.Drawing.Size(478, 76); + this.tableLayoutRmSelection.TabIndex = 2; + // + // tableLayoutRmSsh + // + this.tableLayoutRmSsh.ColumnCount = 3; + this.tableLayoutRmSsh.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutRmSsh.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSsh.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutRmSsh.Controls.Add(this.labelRemarkableSsh, 0, 0); + this.tableLayoutRmSsh.Controls.Add(this.labelSshPassword, 0, 1); + this.tableLayoutRmSsh.Controls.Add(this.textSshPassword, 1, 1); + this.tableLayoutRmSsh.Controls.Add(this.btnRemarkableSshApply, 2, 1); + this.tableLayoutRmSsh.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutRmSsh.Location = new System.Drawing.Point(3, 195); + this.tableLayoutRmSsh.Name = "tableLayoutRmSsh"; + this.tableLayoutRmSsh.RowCount = 2; + this.tableLayoutRmSsh.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSsh.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutRmSsh.Size = new System.Drawing.Size(478, 104); + this.tableLayoutRmSsh.TabIndex = 3; + // + // labelRemarkableSsh + // + this.labelRemarkableSsh.AutoSize = true; + this.tableLayoutRmSsh.SetColumnSpan(this.labelRemarkableSsh, 3); + this.labelRemarkableSsh.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelRemarkableSsh.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelRemarkableSsh.Location = new System.Drawing.Point(3, 0); + this.labelRemarkableSsh.Name = "labelRemarkableSsh"; + this.labelRemarkableSsh.Size = new System.Drawing.Size(472, 52); + this.labelRemarkableSsh.TabIndex = 0; + this.labelRemarkableSsh.Text = "reMarkable SSH Setup"; + this.labelRemarkableSsh.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelSshPassword + // + this.labelSshPassword.AutoSize = true; + this.labelSshPassword.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelSshPassword.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F); + this.labelSshPassword.Location = new System.Drawing.Point(3, 52); + this.labelSshPassword.Name = "labelSshPassword"; + this.labelSshPassword.Size = new System.Drawing.Size(113, 52); + this.labelSshPassword.TabIndex = 1; + this.labelSshPassword.Text = "Password"; + this.labelSshPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // textSshPassword + // + this.textSshPassword.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textSshPassword.Location = new System.Drawing.Point(122, 68); + this.textSshPassword.MaxLength = 20; + this.textSshPassword.Name = "textSshPassword"; + this.textSshPassword.Size = new System.Drawing.Size(233, 20); + this.textSshPassword.TabIndex = 2; + this.textSshPassword.UseSystemPasswordChar = true; + // + // btnRemarkableSshApply + // + this.btnRemarkableSshApply.Anchor = System.Windows.Forms.AnchorStyles.None; + this.btnRemarkableSshApply.Location = new System.Drawing.Point(373, 63); + this.btnRemarkableSshApply.Name = "btnRemarkableSshApply"; + this.btnRemarkableSshApply.Size = new System.Drawing.Size(90, 30); + this.btnRemarkableSshApply.TabIndex = 3; + this.btnRemarkableSshApply.Text = "Apply"; + this.btnRemarkableSshApply.UseVisualStyleBackColor = true; + this.btnRemarkableSshApply.Click += new System.EventHandler(this.btnRemarkableSshApply_Click); + // + // labelRemarkableConnection + // + this.labelRemarkableConnection.AutoSize = true; + this.tableLayoutRmSelection.SetColumnSpan(this.labelRemarkableConnection, 2); + this.labelRemarkableConnection.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelRemarkableConnection.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelRemarkableConnection.Location = new System.Drawing.Point(3, 0); + this.labelRemarkableConnection.Name = "labelRemarkableConnection"; + this.labelRemarkableConnection.Size = new System.Drawing.Size(472, 38); + this.labelRemarkableConnection.TabIndex = 0; + this.labelRemarkableConnection.Text = "reMarkable Connection"; + this.labelRemarkableConnection.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // radioButtonRmCloud + // + this.radioButtonRmCloud.AutoSize = true; + this.radioButtonRmCloud.Dock = System.Windows.Forms.DockStyle.Fill; + this.radioButtonRmCloud.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.radioButtonRmCloud.Location = new System.Drawing.Point(30, 41); + this.radioButtonRmCloud.Margin = new System.Windows.Forms.Padding(30, 3, 30, 3); + this.radioButtonRmCloud.Name = "radioButtonRmCloud"; + this.radioButtonRmCloud.Size = new System.Drawing.Size(179, 32); + this.radioButtonRmCloud.TabIndex = 1; + this.radioButtonRmCloud.TabStop = true; + this.radioButtonRmCloud.Text = "Use reMarkable Cloud"; + this.radioButtonRmCloud.UseVisualStyleBackColor = true; + this.radioButtonRmCloud.CheckedChanged += new System.EventHandler(this.radioButtonRmCloud_CheckedChanged); + // + // radioButtonRmSsh + // + this.radioButtonRmSsh.AutoSize = true; + this.radioButtonRmSsh.Dock = System.Windows.Forms.DockStyle.Fill; + this.radioButtonRmSsh.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.radioButtonRmSsh.Location = new System.Drawing.Point(269, 41); + this.radioButtonRmSsh.Margin = new System.Windows.Forms.Padding(30, 3, 30, 3); + this.radioButtonRmSsh.Name = "radioButtonRmSsh"; + this.radioButtonRmSsh.Size = new System.Drawing.Size(179, 32); + this.radioButtonRmSsh.TabIndex = 2; + this.radioButtonRmSsh.TabStop = true; + this.radioButtonRmSsh.Text = "Use USB SSH"; + this.radioButtonRmSsh.UseVisualStyleBackColor = true; + this.radioButtonRmSsh.CheckedChanged += new System.EventHandler(this.radioButtonRmSsh_CheckedChanged); + // // SettingsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(484, 261); - this.Controls.Add(this.tableLayoutPanel1); + this.ClientSize = new System.Drawing.Size(484, 461); + this.Controls.Add(this.tableLayoutOverall); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "SettingsForm"; this.Text = "Settings"; - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutRemarkable.ResumeLayout(false); - this.tableLayoutRemarkable.PerformLayout(); + this.tableLayoutOverall.ResumeLayout(false); + this.tableLayoutRmCloud.ResumeLayout(false); + this.tableLayoutRmCloud.PerformLayout(); this.tableLayoutMyscript.ResumeLayout(false); this.tableLayoutMyscript.PerformLayout(); + this.tableLayoutRmSelection.ResumeLayout(false); + this.tableLayoutRmSelection.PerformLayout(); + this.tableLayoutRmSsh.ResumeLayout(false); + this.tableLayoutRmSsh.PerformLayout(); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.TableLayoutPanel tableLayoutRemarkable; - private System.Windows.Forms.Label labelRemarkable; + private System.Windows.Forms.TableLayoutPanel tableLayoutOverall; + private System.Windows.Forms.TableLayoutPanel tableLayoutRmCloud; + private System.Windows.Forms.Label labelRemarkableCloud; private System.Windows.Forms.TableLayoutPanel tableLayoutMyscript; private System.Windows.Forms.Label labelOTC; private System.Windows.Forms.Label labelMyscript; @@ -245,7 +389,16 @@ private void InitializeComponent() private System.Windows.Forms.TextBox textOtc; private System.Windows.Forms.TextBox textAppKey; private System.Windows.Forms.TextBox textHmacKey; - private System.Windows.Forms.Button btnRemarkableApply; + private System.Windows.Forms.Button btnRemarkableCloudApply; private System.Windows.Forms.Button btnMyScriptApply; + private System.Windows.Forms.TableLayoutPanel tableLayoutRmSelection; + private System.Windows.Forms.TableLayoutPanel tableLayoutRmSsh; + private System.Windows.Forms.Label labelRemarkableSsh; + private System.Windows.Forms.Label labelSshPassword; + private System.Windows.Forms.TextBox textSshPassword; + private System.Windows.Forms.Button btnRemarkableSshApply; + private System.Windows.Forms.Label labelRemarkableConnection; + private System.Windows.Forms.RadioButton radioButtonRmCloud; + private System.Windows.Forms.RadioButton radioButtonRmSsh; } } \ No newline at end of file diff --git a/OnenoteAddin/SettingsForm.cs b/OnenoteAddin/SettingsForm.cs index 38221e6..9aab45f 100644 --- a/OnenoteAddin/SettingsForm.cs +++ b/OnenoteAddin/SettingsForm.cs @@ -12,9 +12,21 @@ namespace RemarkableSync.OnenoteAddin { public partial class SettingsForm : Form { - public SettingsForm() + public enum RmConnectionMethod { + RmCloud = 0, + Ssh = 1 + } + + public static readonly string RmConnectionMethodConfig = "RmConnectionMethod"; + + private IConfigStore _configStore; + + public SettingsForm(string settingsRegPath) + { + _configStore = new WinRegistryConfigStore(settingsRegPath); InitializeComponent(); + getConnectionMethodFromConfig(); } private async void btnRemarkableApply_Click(object sender, EventArgs e) @@ -36,7 +48,7 @@ private async void btnRemarkableApply_Click(object sender, EventArgs e) ToggleLoadingIcon(true); string otc = textOtc.Text; - RmCloud rmClient = new RmCloud(); + RmCloudDataSource rmClient = new RmCloudDataSource(_configStore); bool registerResult = await rmClient.RegisterWithOneTimeCode(otc); ToggleLoadingIcon(false); @@ -77,7 +89,7 @@ private async void btnMyScriptApply_Click(object sender, EventArgs e) ToggleLoadingIcon(true); await Task.Run(() => { - MyScriptClient myScriptClient = new MyScriptClient(); + MyScriptClient myScriptClient = new MyScriptClient(_configStore); myScriptClient.SetConfig(appKey, hmacKey); }); ToggleLoadingIcon(false); @@ -93,14 +105,87 @@ private void ToggleLoadingIcon(bool show) { Cursor.Current = Cursors.WaitCursor; btnMyScriptApply.Enabled = false; - btnRemarkableApply.Enabled = false; + btnRemarkableCloudApply.Enabled = false; } else { Cursor.Current = Cursors.Default; btnMyScriptApply.Enabled = true; - btnRemarkableApply.Enabled = true; + btnRemarkableCloudApply.Enabled = true; + } + } + + private void radioButtonRmCloud_CheckedChanged(object sender, EventArgs e) + { + tableLayoutRmCloud.Enabled = radioButtonRmCloud.Checked; + setRmConnectionMethod(RmConnectionMethod.RmCloud); + } + + private void radioButtonRmSsh_CheckedChanged(object sender, EventArgs e) + { + tableLayoutRmSsh.Enabled = radioButtonRmSsh.Checked; + setRmConnectionMethod(RmConnectionMethod.Ssh); + } + + private void btnRemarkableSshApply_Click(object sender, EventArgs e) + { + if (textSshPassword.Text.Length == 0) + { + MessageBox.Show(this, "Please enter your reMarkable SSH password", "Enter SSH Password"); + return; + } + + Dictionary mapConfigs = new Dictionary(); + mapConfigs[RmSftpDataSource.SshPasswordConfig] = textSshPassword.Text; + mapConfigs[RmSftpDataSource.SshHostConfig] = "10.11.99.1"; // hard-coded to USB connection IP + + if (_configStore.SetConfigs(mapConfigs)) + { + MessageBox.Show(this, "SSH password saved.", "Success"); + return; + } + else + { + MessageBox.Show(this, "Error saving SSH password.", "Error"); + return; + } + } + + private void setRmConnectionMethod(RmConnectionMethod connectionMethod) + { + Dictionary mapConfigs = new Dictionary(); + mapConfigs[RmConnectionMethodConfig] = connectionMethod.ToString("d"); + _configStore.SetConfigs(mapConfigs); + } + + private void getConnectionMethodFromConfig() + { + int connMethod = -1; + try + { + string connMethodString = _configStore.GetConfig(RmConnectionMethodConfig); + connMethod = Convert.ToInt32(connMethodString); + } + catch (Exception err) + { + Console.WriteLine($"SettingsForm::getConnectionMethodFromConfig() - Failed to get RmConnectionMethod config with err: {err.Message}"); + // will default to cloud + } + + switch (connMethod) + { + case (int)SettingsForm.RmConnectionMethod.Ssh: + radioButtonRmCloud.Checked = false; + radioButtonRmSsh.Checked = true; + break; + case (int)SettingsForm.RmConnectionMethod.RmCloud: + default: + radioButtonRmCloud.Checked = true; + radioButtonRmSsh.Checked = false; + break; } + radioButtonRmCloud_CheckedChanged(null, null); + radioButtonRmSsh_CheckedChanged(null, null); } } } diff --git a/OnenoteAddinSetup/OnenoteAddinSetup.vdproj b/OnenoteAddinSetup/OnenoteAddinSetup.vdproj index 9251c5f..8085260 100644 --- a/OnenoteAddinSetup/OnenoteAddinSetup.vdproj +++ b/OnenoteAddinSetup/OnenoteAddinSetup.vdproj @@ -15,32 +15,32 @@ { "Entry" { - "MsmKey" = "8:_06BD93B58CBE1E34F8A74C6CBAE702F5" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmKey" = "8:_04DAA528368919480A38D9EB967C2BDB" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_09504A613504B8A760CBB7968DEC3DEF" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_04DAA528368919480A38D9EB967C2BDB" + "OwnerKey" = "8:_BE078BD81313A2F6556E4BB4DAB1BF1D" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_09504A613504B8A760CBB7968DEC3DEF" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" + "MsmKey" = "8:_04DAA528368919480A38D9EB967C2BDB" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_09504A613504B8A760CBB7968DEC3DEF" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmKey" = "8:_04DAA528368919480A38D9EB967C2BDB" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_09504A613504B8A760CBB7968DEC3DEF" - "OwnerKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" + "MsmKey" = "8:_06BD93B58CBE1E34F8A74C6CBAE702F5" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -52,7 +52,7 @@ "Entry" { "MsmKey" = "8:_09F12D87D7C957C28220B596B07B7061" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -124,13 +124,7 @@ "Entry" { "MsmKey" = "8:_321FAC91C92DEAEDE2CFBAC8CEB11125" - "OwnerKey" = "8:_F65378A8B5E3B50F30C4B23684DEC021" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_321FAC91C92DEAEDE2CFBAC8CEB11125" - "OwnerKey" = "8:_D303FB36D2BAACB2058AB40453A3F28F" + "OwnerKey" = "8:_04DAA528368919480A38D9EB967C2BDB" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -147,122 +141,140 @@ } "Entry" { - "MsmKey" = "8:_33986A9C8F08B409ADBBF0BE00799B9F" - "OwnerKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" + "MsmKey" = "8:_348B7776B8B4DE427C53F560B8F4AD57" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_33986A9C8F08B409ADBBF0BE00799B9F" + "MsmKey" = "8:_37DCEB5DDDEFAC8B8201DE0CD540F77F" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_33986A9C8F08B409ADBBF0BE00799B9F" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" + "MsmKey" = "8:_40DFE9C539AED97F7EB727148844760D" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_348B7776B8B4DE427C53F560B8F4AD57" + "MsmKey" = "8:_42EA77DEE58955FEC2B36B68060C9616" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_37DCEB5DDDEFAC8B8201DE0CD540F77F" + "MsmKey" = "8:_469020F8D4A3A6467C4879CBAEAEC881" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" + "MsmKey" = "8:_495612206BD7CA5FB83BDFDE13BAFD3F" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" + "MsmKey" = "8:_4A1E0F78CC5E4019995520A329FA1AD3" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" - "OwnerKey" = "8:_78A81A467176CFC71406146028DC3D4C" + "MsmKey" = "8:_4A7C7F5FFBFD71CEE40BD881E0362A8C" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_40DFE9C539AED97F7EB727148844760D" + "MsmKey" = "8:_4A7C7F5FFBFD71CEE40BD881E0362A8C" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_42EA77DEE58955FEC2B36B68060C9616" + "MsmKey" = "8:_4BEB4231552EE9C917FEC57AE67D455C" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_469020F8D4A3A6467C4879CBAEAEC881" + "MsmKey" = "8:_4CFED6DA55D8F5D7768C024727C30B7E" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_495612206BD7CA5FB83BDFDE13BAFD3F" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmKey" = "8:_4CFED6DA55D8F5D7768C024727C30B7E" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4A1E0F78CC5E4019995520A329FA1AD3" + "MsmKey" = "8:_5006FF2AD83FAE7301A0A4FE1BF164B3" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4BEB4231552EE9C917FEC57AE67D455C" + "MsmKey" = "8:_503CD6211A88D533217C7C0E8A54171F" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5006FF2AD83FAE7301A0A4FE1BF164B3" + "MsmKey" = "8:_537C50377713C2C66F66D1A9062AF618" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_503CD6211A88D533217C7C0E8A54171F" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmKey" = "8:_576AC7FBAF222A4A2C8A5C33EF5E7DE4" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_537C50377713C2C66F66D1A9062AF618" + "MsmKey" = "8:_576AC7FBAF222A4A2C8A5C33EF5E7DE4" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_576AC7FBAF222A4A2C8A5C33EF5E7DE4" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_57AF8CD1EE8D4DF441935A9B850A6BCA" + "MsmKey" = "8:_576AC7FBAF222A4A2C8A5C33EF5E7DE4" + "OwnerKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_576B6E7CFBC9B5519882FA28E8CEDF16" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_59224D5A44A1CCF753AD99B18AC35489" + "MsmKey" = "8:_576B6E7CFBC9B5519882FA28E8CEDF16" + "OwnerKey" = "8:_7AA5CBE42791DD22A56B9AE0F0D26426" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_57AF8CD1EE8D4DF441935A9B850A6BCA" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_5D26E75AF2E5FBA8E8E8D7F34AC32D39" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_59224D5A44A1CCF753AD99B18AC35489" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -357,36 +369,12 @@ } "Entry" { - "MsmKey" = "8:_78A81A467176CFC71406146028DC3D4C" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_78A81A467176CFC71406146028DC3D4C" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_78E5CC472A267E30364B2D37D0172522" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_793528AB59774F7E9BADDC85CF54A0BD" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_793528AB59774F7E9BADDC85CF54A0BD" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_7A775EB6D21C70419685ECEAE549CDF3" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -429,18 +417,6 @@ } "Entry" { - "MsmKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" - "OwnerKey" = "8:_7AA5CBE42791DD22A56B9AE0F0D26426" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_821C7C30F2543FBBEA8C78BE62C7CEDB" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -477,6 +453,18 @@ } "Entry" { + "MsmKey" = "8:_8B7F46DA6602F62C787675E202F353E6" + "OwnerKey" = "8:_7AA5CBE42791DD22A56B9AE0F0D26426" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8B7F46DA6602F62C787675E202F353E6" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_8BF5A54F56B42F2F4FB228C5E3B11442" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -549,38 +537,38 @@ } "Entry" { - "MsmKey" = "8:_9C85FC4A363A699FFD215023B9D5B995" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmKey" = "8:_9C576A850EEF8D64F1489FE36B1A038D" + "OwnerKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A372231A87A916FA288DF0FD21CA1C08" + "MsmKey" = "8:_9C576A850EEF8D64F1489FE36B1A038D" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A5DBB673A88C437CFCFDA44B7E77C10A" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmKey" = "8:_9C576A850EEF8D64F1489FE36B1A038D" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A6B4B53D81BD0BED35CCD6E24FF8E64A" - "OwnerKey" = "8:_793528AB59774F7E9BADDC85CF54A0BD" + "MsmKey" = "8:_9C85FC4A363A699FFD215023B9D5B995" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A6B4B53D81BD0BED35CCD6E24FF8E64A" + "MsmKey" = "8:_A372231A87A916FA288DF0FD21CA1C08" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_A6B4B53D81BD0BED35CCD6E24FF8E64A" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" + "MsmKey" = "8:_A5DBB673A88C437CFCFDA44B7E77C10A" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -633,6 +621,24 @@ } "Entry" { + "MsmKey" = "8:_BE078BD81313A2F6556E4BB4DAB1BF1D" + "OwnerKey" = "8:_4CFED6DA55D8F5D7768C024727C30B7E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BE078BD81313A2F6556E4BB4DAB1BF1D" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BE078BD81313A2F6556E4BB4DAB1BF1D" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_BF266AD44DD69ED47DCADBB7A41534D9" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -681,6 +687,24 @@ } "Entry" { + "MsmKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" + "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" + "OwnerKey" = "8:_4A7C7F5FFBFD71CEE40BD881E0362A8C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_C4855A2BEDDCDD69A8F22B8827354925" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -747,36 +771,6 @@ } "Entry" { - "MsmKey" = "8:_D303FB36D2BAACB2058AB40453A3F28F" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D303FB36D2BAACB2058AB40453A3F28F" - "OwnerKey" = "8:_A6B4B53D81BD0BED35CCD6E24FF8E64A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D303FB36D2BAACB2058AB40453A3F28F" - "OwnerKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D303FB36D2BAACB2058AB40453A3F28F" - "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D303FB36D2BAACB2058AB40453A3F28F" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_D3772689FEE36004B7F658E18D2E0698" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -796,13 +790,13 @@ "Entry" { "MsmKey" = "8:_DA01605D5FE5E1E75EA3C94E750AFC77" - "OwnerKey" = "8:_78A81A467176CFC71406146028DC3D4C" + "OwnerKey" = "8:_4A7C7F5FFBFD71CEE40BD881E0362A8C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_DA01605D5FE5E1E75EA3C94E750AFC77" - "OwnerKey" = "8:_A6B4B53D81BD0BED35CCD6E24FF8E64A" + "OwnerKey" = "8:_BE078BD81313A2F6556E4BB4DAB1BF1D" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -897,12 +891,6 @@ } "Entry" { - "MsmKey" = "8:_F65378A8B5E3B50F30C4B23684DEC021" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_F91B1D16F91B9E905C29A4BF1C0F4D73" "OwnerKey" = "8:_F23C7B6B2E3D40539AAF3F562F61B2B0" "MsmSig" = "8:_UNDEFINED" @@ -934,37 +922,73 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_BE078BD81313A2F6556E4BB4DAB1BF1D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" "OwnerKey" = "8:_7AA5CBE42791DD22A56B9AE0F0D26426" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_81C10CD0E543D7EFE0C0A714F344321B" + "OwnerKey" = "8:_576B6E7CFBC9B5519882FA28E8CEDF16" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_321FAC91C92DEAEDE2CFBAC8CEB11125" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8B7F46DA6602F62C787675E202F353E6" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_3D81B2F61B9D7FE7C8807B571FC91D51" + "OwnerKey" = "8:_C4578570DC4950DA589CD2F0C14853F0" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_33986A9C8F08B409ADBBF0BE00799B9F" + "OwnerKey" = "8:_9C576A850EEF8D64F1489FE36B1A038D" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_09504A613504B8A760CBB7968DEC3DEF" + "OwnerKey" = "8:_576AC7FBAF222A4A2C8A5C33EF5E7DE4" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_793528AB59774F7E9BADDC85CF54A0BD" + "OwnerKey" = "8:_4CFED6DA55D8F5D7768C024727C30B7E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_718A4EACFEBA7AAF1A40A97D39771444" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -1627,24 +1651,6 @@ "OwnerKey" = "8:_E7D279CD4B7611C46A8F67FE559B5C6D" "MsmSig" = "8:_UNDEFINED" } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_5D26E75AF2E5FBA8E8E8D7F34AC32D39" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_321FAC91C92DEAEDE2CFBAC8CEB11125" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_718A4EACFEBA7AAF1A40A97D39771444" - "MsmSig" = "8:_UNDEFINED" - } } "Configurations" { @@ -1670,6 +1676,14 @@ "PrerequisitesLocation" = "2:1" "Url" = "8:" "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2" + { + "Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.7.2" + } + } } } "Release" @@ -1732,20 +1746,20 @@ } "File" { - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_06BD93B58CBE1E34F8A74C6CBAE702F5" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_04DAA528368919480A38D9EB967C2BDB" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_06BD93B58CBE1E34F8A74C6CBAE702F5" + "_04DAA528368919480A38D9EB967C2BDB" { - "Name" = "8:System.Runtime.Serialization.Json.dll" + "Name" = "8:System.Runtime.CompilerServices.Unsafe.DLL" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Runtime.Serialization.Json.dll" + "SourcePath" = "8:System.Runtime.CompilerServices.Unsafe.DLL" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -1763,20 +1777,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_09504A613504B8A760CBB7968DEC3DEF" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_06BD93B58CBE1E34F8A74C6CBAE702F5" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_09504A613504B8A760CBB7968DEC3DEF" + "_06BD93B58CBE1E34F8A74C6CBAE702F5" { - "Name" = "8:System.Buffers.DLL" + "Name" = "8:System.Runtime.Serialization.Json.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Buffers.DLL" + "SourcePath" = "8:System.Runtime.Serialization.Json.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2248,20 +2262,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_33986A9C8F08B409ADBBF0BE00799B9F" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_348B7776B8B4DE427C53F560B8F4AD57" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Threading.Timer, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_33986A9C8F08B409ADBBF0BE00799B9F" + "_348B7776B8B4DE427C53F560B8F4AD57" { - "Name" = "8:System.Numerics.Vectors.dll" + "Name" = "8:System.Threading.Timer.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Numerics.Vectors.dll" + "SourcePath" = "8:System.Threading.Timer.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2279,20 +2293,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_348B7776B8B4DE427C53F560B8F4AD57" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_37DCEB5DDDEFAC8B8201DE0CD540F77F" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Threading.Timer, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Threading.Thread, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_348B7776B8B4DE427C53F560B8F4AD57" + "_37DCEB5DDDEFAC8B8201DE0CD540F77F" { - "Name" = "8:System.Threading.Timer.dll" + "Name" = "8:System.Threading.Thread.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Threading.Timer.dll" + "SourcePath" = "8:System.Threading.Thread.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2310,20 +2324,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_37DCEB5DDDEFAC8B8201DE0CD540F77F" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_40DFE9C539AED97F7EB727148844760D" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Threading.Thread, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Security.Cryptography.X509Certificates, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_37DCEB5DDDEFAC8B8201DE0CD540F77F" + "_40DFE9C539AED97F7EB727148844760D" { - "Name" = "8:System.Threading.Thread.dll" + "Name" = "8:System.Security.Cryptography.X509Certificates.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Threading.Thread.dll" + "SourcePath" = "8:System.Security.Cryptography.X509Certificates.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2341,20 +2355,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3D81B2F61B9D7FE7C8807B571FC91D51" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_42EA77DEE58955FEC2B36B68060C9616" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Net.NameResolution, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_3D81B2F61B9D7FE7C8807B571FC91D51" + "_42EA77DEE58955FEC2B36B68060C9616" { - "Name" = "8:System.Memory.dll" + "Name" = "8:System.Net.NameResolution.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Memory.dll" + "SourcePath" = "8:System.Net.NameResolution.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2372,20 +2386,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_40DFE9C539AED97F7EB727148844760D" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_469020F8D4A3A6467C4879CBAEAEC881" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Security.Cryptography.X509Certificates, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.IO.UnmanagedMemoryStream, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_40DFE9C539AED97F7EB727148844760D" + "_469020F8D4A3A6467C4879CBAEAEC881" { - "Name" = "8:System.Security.Cryptography.X509Certificates.dll" + "Name" = "8:System.IO.UnmanagedMemoryStream.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Security.Cryptography.X509Certificates.dll" + "SourcePath" = "8:System.IO.UnmanagedMemoryStream.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2403,20 +2417,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_42EA77DEE58955FEC2B36B68060C9616" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_495612206BD7CA5FB83BDFDE13BAFD3F" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Net.NameResolution, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Net.WebHeaderCollection, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_42EA77DEE58955FEC2B36B68060C9616" + "_495612206BD7CA5FB83BDFDE13BAFD3F" { - "Name" = "8:System.Net.NameResolution.dll" + "Name" = "8:System.Net.WebHeaderCollection.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Net.NameResolution.dll" + "SourcePath" = "8:System.Net.WebHeaderCollection.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2434,20 +2448,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_469020F8D4A3A6467C4879CBAEAEC881" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4A1E0F78CC5E4019995520A329FA1AD3" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.IO.UnmanagedMemoryStream, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Net.WebSockets.Client, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_469020F8D4A3A6467C4879CBAEAEC881" + "_4A1E0F78CC5E4019995520A329FA1AD3" { - "Name" = "8:System.IO.UnmanagedMemoryStream.dll" + "Name" = "8:System.Net.WebSockets.Client.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.IO.UnmanagedMemoryStream.dll" + "SourcePath" = "8:System.Net.WebSockets.Client.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2465,20 +2479,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_495612206BD7CA5FB83BDFDE13BAFD3F" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4A7C7F5FFBFD71CEE40BD881E0362A8C" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Net.WebHeaderCollection, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Text.Encodings.Web, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_495612206BD7CA5FB83BDFDE13BAFD3F" + "_4A7C7F5FFBFD71CEE40BD881E0362A8C" { - "Name" = "8:System.Net.WebHeaderCollection.dll" + "Name" = "8:System.Text.Encodings.Web.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Net.WebHeaderCollection.dll" + "SourcePath" = "8:System.Text.Encodings.Web.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2496,20 +2510,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4A1E0F78CC5E4019995520A329FA1AD3" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4BEB4231552EE9C917FEC57AE67D455C" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Net.WebSockets.Client, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Threading.Tasks, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_4A1E0F78CC5E4019995520A329FA1AD3" + "_4BEB4231552EE9C917FEC57AE67D455C" { - "Name" = "8:System.Net.WebSockets.Client.dll" + "Name" = "8:System.Threading.Tasks.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Net.WebSockets.Client.dll" + "SourcePath" = "8:System.Threading.Tasks.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2527,20 +2541,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4BEB4231552EE9C917FEC57AE67D455C" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4CFED6DA55D8F5D7768C024727C30B7E" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Threading.Tasks, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_4BEB4231552EE9C917FEC57AE67D455C" + "_4CFED6DA55D8F5D7768C024727C30B7E" { - "Name" = "8:System.Threading.Tasks.dll" + "Name" = "8:Microsoft.Bcl.AsyncInterfaces.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Threading.Tasks.dll" + "SourcePath" = "8:Microsoft.Bcl.AsyncInterfaces.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2651,20 +2665,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_57AF8CD1EE8D4DF441935A9B850A6BCA" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_576AC7FBAF222A4A2C8A5C33EF5E7DE4" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Threading.ThreadPool, Version=4.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_57AF8CD1EE8D4DF441935A9B850A6BCA" + "_576AC7FBAF222A4A2C8A5C33EF5E7DE4" { - "Name" = "8:System.Threading.ThreadPool.dll" + "Name" = "8:System.Buffers.DLL" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Threading.ThreadPool.dll" + "SourcePath" = "8:System.Buffers.DLL" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2682,20 +2696,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_59224D5A44A1CCF753AD99B18AC35489" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_576B6E7CFBC9B5519882FA28E8CEDF16" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.ComponentModel.Annotations, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:Renci.SshNet, Version=2020.0.1.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL" "ScatterAssemblies" { - "_59224D5A44A1CCF753AD99B18AC35489" + "_576B6E7CFBC9B5519882FA28E8CEDF16" { - "Name" = "8:System.ComponentModel.Annotations.dll" + "Name" = "8:Renci.SshNet.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.ComponentModel.Annotations.dll" + "SourcePath" = "8:Renci.SshNet.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -2713,20 +2727,51 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5D26E75AF2E5FBA8E8E8D7F34AC32D39" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_57AF8CD1EE8D4DF441935A9B850A6BCA" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Threading.ThreadPool, Version=4.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_5D26E75AF2E5FBA8E8E8D7F34AC32D39" + "_57AF8CD1EE8D4DF441935A9B850A6BCA" { - "Name" = "8:System.Buffers.DLL" + "Name" = "8:System.Threading.ThreadPool.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Buffers.DLL" + "SourcePath" = "8:System.Threading.ThreadPool.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_59224D5A44A1CCF753AD99B18AC35489" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.ComponentModel.Annotations, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "ScatterAssemblies" + { + "_59224D5A44A1CCF753AD99B18AC35489" + { + "Name" = "8:System.ComponentModel.Annotations.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.ComponentModel.Annotations.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -3054,82 +3099,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_749E5AA7891E40FE34761B04636937E4" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Collections.NonGeneric, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_749E5AA7891E40FE34761B04636937E4" - { - "Name" = "8:System.Collections.NonGeneric.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Collections.NonGeneric.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_753384BA7A5B74C0958B2AC0D59DFD24" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Xml.XPath, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_753384BA7A5B74C0958B2AC0D59DFD24" - { - "Name" = "8:System.Xml.XPath.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Xml.XPath.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7597807C72F184BEC146AA5EDAB9FE4D" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_749E5AA7891E40FE34761B04636937E4" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Security.Cryptography.Algorithms, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Collections.NonGeneric, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_7597807C72F184BEC146AA5EDAB9FE4D" + "_749E5AA7891E40FE34761B04636937E4" { - "Name" = "8:System.Security.Cryptography.Algorithms.dll" + "Name" = "8:System.Collections.NonGeneric.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Security.Cryptography.Algorithms.dll" + "SourcePath" = "8:System.Collections.NonGeneric.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -3147,20 +3130,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_77851AAFCE4E9E876EF66C1065001689" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_753384BA7A5B74C0958B2AC0D59DFD24" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Globalization, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Xml.XPath, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_77851AAFCE4E9E876EF66C1065001689" + "_753384BA7A5B74C0958B2AC0D59DFD24" { - "Name" = "8:System.Globalization.dll" + "Name" = "8:System.Xml.XPath.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Globalization.dll" + "SourcePath" = "8:System.Xml.XPath.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -3178,20 +3161,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_78A81A467176CFC71406146028DC3D4C" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_7597807C72F184BEC146AA5EDAB9FE4D" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Text.Encodings.Web, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Security.Cryptography.Algorithms, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_78A81A467176CFC71406146028DC3D4C" + "_7597807C72F184BEC146AA5EDAB9FE4D" { - "Name" = "8:System.Text.Encodings.Web.dll" + "Name" = "8:System.Security.Cryptography.Algorithms.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Text.Encodings.Web.dll" + "SourcePath" = "8:System.Security.Cryptography.Algorithms.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -3209,20 +3192,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_78E5CC472A267E30364B2D37D0172522" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_77851AAFCE4E9E876EF66C1065001689" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Data.Common, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Globalization, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_78E5CC472A267E30364B2D37D0172522" + "_77851AAFCE4E9E876EF66C1065001689" { - "Name" = "8:System.Data.Common.dll" + "Name" = "8:System.Globalization.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Data.Common.dll" + "SourcePath" = "8:System.Globalization.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -3240,20 +3223,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_793528AB59774F7E9BADDC85CF54A0BD" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_78E5CC472A267E30364B2D37D0172522" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Data.Common, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_793528AB59774F7E9BADDC85CF54A0BD" + "_78E5CC472A267E30364B2D37D0172522" { - "Name" = "8:Microsoft.Bcl.AsyncInterfaces.dll" + "Name" = "8:System.Data.Common.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Microsoft.Bcl.AsyncInterfaces.dll" + "SourcePath" = "8:System.Data.Common.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -3488,37 +3471,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_81C10CD0E543D7EFE0C0A714F344321B" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Text.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_81C10CD0E543D7EFE0C0A714F344321B" - { - "Name" = "8:System.Text.Json.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Text.Json.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_821C7C30F2543FBBEA8C78BE62C7CEDB" { "AssemblyRegister" = "3:1" @@ -3705,6 +3657,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8B7F46DA6602F62C787675E202F353E6" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Text.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_8B7F46DA6602F62C787675E202F353E6" + { + "Name" = "8:System.Text.Json.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Text.Json.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8BF5A54F56B42F2F4FB228C5E3B11442" { "AssemblyRegister" = "3:1" @@ -4046,20 +4029,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9C85FC4A363A699FFD215023B9D5B995" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9C576A850EEF8D64F1489FE36B1A038D" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Xml, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_9C85FC4A363A699FFD215023B9D5B995" + "_9C576A850EEF8D64F1489FE36B1A038D" { - "Name" = "8:System.Runtime.Serialization.Xml.dll" + "Name" = "8:System.Numerics.Vectors.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Runtime.Serialization.Xml.dll" + "SourcePath" = "8:System.Numerics.Vectors.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -4077,20 +4060,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A372231A87A916FA288DF0FD21CA1C08" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9C85FC4A363A699FFD215023B9D5B995" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.IO.FileSystem.DriveInfo, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.Runtime.Serialization.Xml, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_A372231A87A916FA288DF0FD21CA1C08" + "_9C85FC4A363A699FFD215023B9D5B995" { - "Name" = "8:System.IO.FileSystem.DriveInfo.dll" + "Name" = "8:System.Runtime.Serialization.Xml.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.IO.FileSystem.DriveInfo.dll" + "SourcePath" = "8:System.Runtime.Serialization.Xml.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -4108,20 +4091,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A5DBB673A88C437CFCFDA44B7E77C10A" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A372231A87A916FA288DF0FD21CA1C08" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Diagnostics.Debug, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "AssemblyAsmDisplayName" = "8:System.IO.FileSystem.DriveInfo, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_A5DBB673A88C437CFCFDA44B7E77C10A" + "_A372231A87A916FA288DF0FD21CA1C08" { - "Name" = "8:System.Diagnostics.Debug.dll" + "Name" = "8:System.IO.FileSystem.DriveInfo.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Diagnostics.Debug.dll" + "SourcePath" = "8:System.IO.FileSystem.DriveInfo.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -4139,20 +4122,20 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A6B4B53D81BD0BED35CCD6E24FF8E64A" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A5DBB673A88C437CFCFDA44B7E77C10A" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:System.Diagnostics.Debug, Version=4.0.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_A6B4B53D81BD0BED35CCD6E24FF8E64A" + "_A5DBB673A88C437CFCFDA44B7E77C10A" { - "Name" = "8:System.Threading.Tasks.Extensions.dll" + "Name" = "8:System.Diagnostics.Debug.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:System.Threading.Tasks.Extensions.dll" + "SourcePath" = "8:System.Diagnostics.Debug.dll" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" @@ -4325,6 +4308,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BE078BD81313A2F6556E4BB4DAB1BF1D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_BE078BD81313A2F6556E4BB4DAB1BF1D" + { + "Name" = "8:System.Threading.Tasks.Extensions.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Threading.Tasks.Extensions.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BF266AD44DD69ED47DCADBB7A41534D9" { "AssemblyRegister" = "3:1" @@ -4573,6 +4587,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4578570DC4950DA589CD2F0C14853F0" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_C4578570DC4950DA589CD2F0C14853F0" + { + "Name" = "8:System.Memory.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:System.Memory.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4855A2BEDDCDD69A8F22B8827354925" { "AssemblyRegister" = "3:1" @@ -4852,37 +4897,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D303FB36D2BAACB2058AB40453A3F28F" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_D303FB36D2BAACB2058AB40453A3F28F" - { - "Name" = "8:System.Runtime.CompilerServices.Unsafe.DLL" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Runtime.CompilerServices.Unsafe.DLL" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D3772689FEE36004B7F658E18D2E0698" { "AssemblyRegister" = "3:1" @@ -5410,37 +5424,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F65378A8B5E3B50F30C4B23684DEC021" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_F65378A8B5E3B50F30C4B23684DEC021" - { - "Name" = "8:System.Runtime.CompilerServices.Unsafe.DLL" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Runtime.CompilerServices.Unsafe.DLL" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_08C876CEF80A42A19DF4FA9658FCCC78" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F91B1D16F91B9E905C29A4BF1C0F4D73" { "AssemblyRegister" = "3:1" @@ -5621,15 +5604,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:OneNoteAddin" - "ProductCode" = "8:{6C610432-D40A-44B8-9352-166C8D4E7BDB}" - "PackageCode" = "8:{3E1EB637-AC14-4C00-808B-EE029F4D88F7}" + "ProductCode" = "8:{5742A5D0-B3C9-4207-A420-7AFC5E161EAA}" + "PackageCode" = "8:{29A02C59-12DD-4168-8D4F-4C55F5C93D7B}" "UpgradeCode" = "8:{0FE24561-6E49-4553-A3EE-0A6A59847324}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:FALSE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.0.0" + "ProductVersion" = "8:2.0.0" "Manufacturer" = "8:reMarkableSync" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/RemarkableSync/Interfaces/IConfigStore.cs b/RemarkableSync/Interfaces/IConfigStore.cs new file mode 100644 index 0000000..b728679 --- /dev/null +++ b/RemarkableSync/Interfaces/IConfigStore.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RemarkableSync +{ + public interface IConfigStore : IDisposable + { + string GetConfig(string key); + + bool SetConfigs(Dictionary configs); + } +} diff --git a/RemarkableSync/Interfaces/IRmDataSource.cs b/RemarkableSync/Interfaces/IRmDataSource.cs new file mode 100644 index 0000000..441891f --- /dev/null +++ b/RemarkableSync/Interfaces/IRmDataSource.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace RemarkableSync +{ + public interface IRmDataSource: IDisposable + { + Task> GetItemHierarchy(); + + Task DownloadDocument(RmItem item); + } +} diff --git a/RemarkableSync/MyScriptClient.cs b/RemarkableSync/MyScriptClient.cs index 8700728..7637d74 100644 --- a/RemarkableSync/MyScriptClient.cs +++ b/RemarkableSync/MyScriptClient.cs @@ -38,17 +38,19 @@ class Stroke public int[] y { get; set; } } - private static string ConfigFile = ".myscript"; private static string AppKeyName = "appkey"; private static string HmacKeyName = "hmackey"; + private static string EmptyKey = "****"; private string _appKey; private string _hmacKey; + private IConfigStore _configStore; - public MyScriptClient() + public MyScriptClient(IConfigStore configStore) { _appKey = ""; _hmacKey = ""; + _configStore = configStore; _client = new HttpClient(); LoadConfig(); } @@ -172,48 +174,18 @@ private StrokeGroup PageToStrokeGroup(RmPage page, int pageNum) private void LoadConfig() { - Dictionary config = new Dictionary(); - try - { - string configFilePath = GetConfigPath(); - foreach (string line in File.ReadLines(configFilePath)) - { - int delimPos = line.IndexOf(':'); - if (delimPos == -1) - continue; - config.Add(line.Substring(0, delimPos).Trim(), line.Substring(delimPos + 1).Trim()); - } - } - catch (Exception err) - { - Console.WriteLine($"Unable to load token from config file. Err = {err.Message}"); - } - - if (config.ContainsKey(AppKeyName)) - _appKey = config[AppKeyName]; - - if (config.ContainsKey(HmacKeyName)) - _hmacKey = config[HmacKeyName]; + string appKey = _configStore.GetConfig(AppKeyName); + string hmacKey = _configStore.GetConfig(HmacKeyName); + _appKey = appKey == EmptyKey ? "" : appKey; + _hmacKey = hmacKey == EmptyKey ? "" : hmacKey; } private void WriteConfig() { - StreamWriter file = new StreamWriter(GetConfigPath()); - if (_appKey?.Length > 0) - { - file.WriteLine(String.Format("{0}: {1}", AppKeyName, _appKey)); - } - if (_hmacKey?.Length > 0) - { - file.WriteLine(String.Format("{0}: {1}", HmacKeyName, _hmacKey)); - } - file.Close(); + Dictionary mapConfigs = new Dictionary(); + mapConfigs[AppKeyName] = _appKey?.Length > 0 ? _appKey : EmptyKey; + mapConfigs[HmacKeyName] = _hmacKey?.Length > 0 ? _hmacKey : EmptyKey; + _configStore.SetConfigs(mapConfigs); } - - private string GetConfigPath() - { - return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + ConfigFile; - } - } } diff --git a/RemarkableSync/RemarkableSync.csproj b/RemarkableSync/RemarkableSync.csproj index b0e2b87..ce1bb29 100644 --- a/RemarkableSync/RemarkableSync.csproj +++ b/RemarkableSync/RemarkableSync.csproj @@ -74,6 +74,9 @@ prompt + + ..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll + @@ -88,6 +91,7 @@ True + @@ -97,13 +101,20 @@ + + - + + + + + + diff --git a/RemarkableSync/RmCloud.cs b/RemarkableSync/RmCloudDataSource.cs similarity index 72% rename from RemarkableSync/RmCloud.cs rename to RemarkableSync/RmCloudDataSource.cs index ef80775..aadfddd 100644 --- a/RemarkableSync/RmCloud.cs +++ b/RemarkableSync/RmCloudDataSource.cs @@ -12,11 +12,11 @@ // TODO: Exception handling namespace RemarkableSync { - public class RmCloud + public class RmCloudDataSource : IRmDataSource { - private static string ConfigFile = ".rmapi"; - private static string DeviceTokenName = "devicetoken"; - private static string UserTokenName = "usertoken"; + private static string DeviceTokenName = "rmdevicetoken"; + private static string UserTokenName = "rmusertoken"; + private static string EmptyToken = "****"; private static string UserAgent = "rmapi"; private static string Device = "desktop-windows"; private static string DeviceTokenUrl = "https://my.remarkable.com/token/json/2/device/new"; @@ -28,12 +28,14 @@ public class RmCloud private bool _initialized; private HttpClient _client; + private IConfigStore _configStore; - public RmCloud() + public RmCloudDataSource(IConfigStore configStore) { _usertoken = null; _devicetoken = null; _initialized = false; + _configStore = configStore; _client = new HttpClient(); _client.DefaultRequestHeaders.Add("user-agent", UserAgent); @@ -50,7 +52,7 @@ public async Task RegisterWithOneTimeCode(string oneTimeCode) try { - Console.WriteLine($"RmCloud::RegisterWithOneTimeCode() - registring with code: {oneTimeCode}"); + Console.WriteLine($"RmCloudDataSource::RegisterWithOneTimeCode() - registring with code: {oneTimeCode}"); HttpResponseMessage response = await Request( HttpMethod.Post, DeviceTokenUrl, @@ -66,12 +68,12 @@ public async Task RegisterWithOneTimeCode(string oneTimeCode) } else { - Console.WriteLine($"RmCloud::RegisterWithOneTimeCode() - response code: {response.StatusCode}"); + Console.WriteLine($"RmCloudDataSource::RegisterWithOneTimeCode() - response code: {response.StatusCode}"); } } catch (Exception err) { - Console.WriteLine("RmCloud::RegisterWithOneTimeCode() - Error: " + err.Message); + Console.WriteLine("RmCloudDataSource::RegisterWithOneTimeCode() - Error: " + err.Message); } return false; } @@ -82,7 +84,7 @@ public async Task> GetItemHierarchy() return getChildItemsRecursive("", ref collection); } - public async Task> GetAllItems() + private async Task> GetAllItems() { if (!_initialized) { @@ -97,8 +99,8 @@ public async Task> GetAllItems() if (!response.IsSuccessStatusCode) { - Console.WriteLine("GetAllItems request failed with status code " + response.StatusCode.ToString()); - return null; + string errMsg = "GetAllItems request failed with status code " + response.StatusCode.ToString(); + throw new Exception(errMsg); } string responseContent = await response.Content.ReadAsStringAsync(); @@ -115,7 +117,7 @@ public async Task DownloadDocument(RmItem item) if (item.Type != RmItem.DocumentType) { - Console.WriteLine($"RmCloud::DownloadDocument() - item with id {item.ID} is not document type"); + Console.WriteLine($"RmCloudDataSource::DownloadDocument() - item with id {item.ID} is not document type"); return null; } @@ -127,20 +129,20 @@ public async Task DownloadDocument(RmItem item) HttpResponseMessage response = await Request(HttpMethod.Get, url, null, null); if (!response.IsSuccessStatusCode) { - Console.WriteLine("RmCloud::DownloadDocument() - request failed with status code " + response.StatusCode.ToString()); + Console.WriteLine("RmCloudDataSource::DownloadDocument() - request failed with status code " + response.StatusCode.ToString()); return null; } List items = JsonSerializer.Deserialize>(response.Content.ReadAsStringAsync().Result); if (items.Count == 0) { - Console.WriteLine("RmCloud::DownloadDocument() - Failed to find document with id: " + item.ID); + Console.WriteLine("RmCloudDataSource::DownloadDocument() - Failed to find document with id: " + item.ID); return null; } string blobUrl = items[0].BlobURLGet; Stream stream = await _client.GetStreamAsync(blobUrl); ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Read); - return new RmDownloadedDoc(archive, item.ID); + return new RmCloudDownloadedDoc(archive, item.ID); } catch (Exception err) { @@ -150,6 +152,12 @@ public async Task DownloadDocument(RmItem item) } + public void Dispose() + { + _client?.Dispose(); + _configStore?.Dispose(); + } + private async Task Initialize() { LoadConfig(); @@ -163,49 +171,20 @@ private async Task Initialize() private void LoadConfig() { - Dictionary config = new Dictionary(); - try - { - string configFilePath = GetConfigPath(); - foreach (string line in File.ReadLines(configFilePath)) - { - int delimPos = line.IndexOf(':'); - if (delimPos == -1) - continue; - config.Add(line.Substring(0, delimPos).Trim(), line.Substring(delimPos + 1).Trim()); - } - } - catch (Exception err) - { - Console.WriteLine($"Unable to load token from config file. Err = {err.Message}"); - } - - if (config.ContainsKey(DeviceTokenName)) - _devicetoken = config[DeviceTokenName]; - - if (config.ContainsKey(UserTokenName)) - _usertoken = config[UserTokenName]; + string devicetoken = _configStore.GetConfig(DeviceTokenName); + string usertoken = _configStore.GetConfig(UserTokenName); + _devicetoken = devicetoken == EmptyToken ? "" : devicetoken; + _usertoken = usertoken == EmptyToken ? "" : usertoken; } private void WriteConfig() { - StreamWriter file = new StreamWriter(GetConfigPath()); - if (_devicetoken?.Length > 0) - { - file.WriteLine(String.Format("{0}: {1}", DeviceTokenName, _devicetoken)); - } - if (_usertoken?.Length > 0) - { - file.WriteLine(String.Format("{0}: {1}", UserTokenName, _usertoken)); - _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_usertoken}"); + Dictionary mapConfigs = new Dictionary(); + mapConfigs[DeviceTokenName] = _devicetoken?.Length > 0 ? _devicetoken : EmptyToken; + mapConfigs[UserTokenName] = _usertoken?.Length > 0 ? _usertoken : EmptyToken; + _configStore.SetConfigs(mapConfigs); - } - file.Close(); - } - - private string GetConfigPath() - { - return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\" + ConfigFile; + _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_usertoken}"); } private async Task Request(HttpMethod method, string url, Dictionary header, HttpContent content) diff --git a/RemarkableSync/RmCloudDownloadedDoc.cs b/RemarkableSync/RmCloudDownloadedDoc.cs new file mode 100644 index 0000000..fe7695a --- /dev/null +++ b/RemarkableSync/RmCloudDownloadedDoc.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; + +namespace RemarkableSync +{ + public class RmCloudDownloadedDoc: RmDownloadedDoc + { + + public RmCloudDownloadedDoc(ZipArchive archive, string id) : base(id) + { + try + { + archive.ExtractToDirectory(_folderPath); + } + catch (Exception err) + { + Console.WriteLine($"RmCloudDownloadedDoc::RmDownloadedDoc() - failed to extract archive. Error: {err.Message}"); + _folderPath = ""; + throw err; + } + + try + { + string pageFolder = Path.Combine(_folderPath, id); + var rmFiles = new List(Directory.EnumerateFiles(pageFolder, "*.rm", SearchOption.TopDirectoryOnly)); + _pageCount = rmFiles.Count; + } + catch (Exception err) + { + Console.WriteLine($"RmCloudDownloadedDoc::RmDownloadedDoc() - failed to get page count. Error: {err.Message}"); + _pageCount = 0; + } + } + } +} diff --git a/RemarkableSync/RmDownloadedDoc.cs b/RemarkableSync/RmDownloadedDoc.cs index 2abfb6f..4e3f4d3 100644 --- a/RemarkableSync/RmDownloadedDoc.cs +++ b/RemarkableSync/RmDownloadedDoc.cs @@ -1,44 +1,24 @@ -using System; +using RemarkableSync.RmLine; +using System; using System.Collections.Generic; using System.IO; -using System.IO.Compression; -using RemarkableSync.RmLine; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace RemarkableSync { public class RmDownloadedDoc: IDisposable { - private string _folderPath; - private string _id; - private int _pageCount; + protected string _folderPath; + protected string _id; + protected int _pageCount; - public RmDownloadedDoc(ZipArchive archive, string id) + public RmDownloadedDoc(string id) { _id = id; - try - { - _folderPath = Path.Combine(Path.GetTempPath(), id); - archive.ExtractToDirectory(_folderPath); - } - catch (Exception err) - { - Console.WriteLine($"RmDownloadedDoc::RmDownloadedDoc() - failed to extract archive. Error: {err.Message}"); - _folderPath = ""; - return; - } - - try - { - string pageFolder = Path.Combine(_folderPath, id); - var rmFiles = new List(Directory.EnumerateFiles(pageFolder, "*.rm", SearchOption.TopDirectoryOnly)); - _pageCount = rmFiles.Count; - } - catch (Exception err) - { - Console.WriteLine($"RmDownloadedDoc::RmDownloadedDoc() - failed to get page count. Error: {err.Message}"); - _pageCount = 0; - } + _folderPath = Path.Combine(Path.GetTempPath(), id); } public RmPage GetPageContent(int pageNumber) @@ -67,9 +47,9 @@ public RmPage GetPageContent(int pageNumber) } } } - catch(Exception err) + catch (Exception err) { - Console.WriteLine($"RmDownloadedDoc::GetPageContent() - Parsing page content to Page object failedwith err: {err.Message}"); + Console.WriteLine($"RmDownloadedDoc::GetPageContent() - Parsing page content to Page object failed with err: {err.Message}"); } return null; @@ -83,7 +63,7 @@ public void Dispose() { Directory.Delete(_folderPath, true); } - catch(Exception err) + catch (Exception err) { Console.WriteLine($"RmDownloadedDoc::Dispose() - failed to remove folder: {_folderPath}. Error: {err.Message}"); } @@ -96,9 +76,14 @@ public int PageCount get { return _pageCount; } } - private string GetPageContentFilePath(int pageNumber) + protected string GetPageContentFilePath(int pageNumber) { return Path.Combine(_folderPath, _id, $"{pageNumber}.rm"); } + + protected string GetPageContentFolderPath() + { + return Path.Combine(_folderPath, _id); + } } } diff --git a/RemarkableSync/RmSftpDataSource.cs b/RemarkableSync/RmSftpDataSource.cs new file mode 100644 index 0000000..0a67b6e --- /dev/null +++ b/RemarkableSync/RmSftpDataSource.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Renci.SshNet; +using Renci.SshNet.Common; + + +namespace RemarkableSync +{ + public partial class RmSftpDataSource : IRmDataSource + { + public static readonly string SshHostConfig = "SshHost"; + + public static readonly string SshPasswordConfig = "SshPassword"; + + private static readonly string ContentFolderPath = "/home/root/.local/share/remarkable/xochitl"; + + private SftpClient _client; + + public RmSftpDataSource(IConfigStore configStore) + { + string host = configStore.GetConfig(SshHostConfig); + string password = configStore.GetConfig(SshPasswordConfig); + + host = host ?? "10.11.99.1"; + if (password == null) + { + string errMsg = "Unable to get SSH password from config store"; + Console.WriteLine($"RmSftpDataSource::RmSftpDataSource() - {errMsg}"); + throw new Exception(errMsg); + } + + const string username = "root"; + const int port = 22; + + try + { + _client = new SftpClient(host, port, username, password); + _client.Connect(); + } + catch (SshAuthenticationException err) + { + Console.WriteLine($"RmSftpDataSource::RmSftpDataSource() - authentication error on SFTP connection: err: {err.Message}"); + throw new Exception("reMarkable device SSH login failed"); + } + catch (Exception err) + { + Console.WriteLine($"RmSftpDataSource::RmSftpDataSource() - error on SFTP connection: err: {err.Message}"); + throw new Exception("Failed to connect to reMarkable device via SSH"); + } + } + + public async Task> GetItemHierarchy() + { + List collection = await Task.Run(GetAllItems); + return getChildItemsRecursive("", ref collection); + } + + public async Task DownloadDocument(RmItem item) + { + return await Task.Run(() => + { + // get the .content file for the notebook first + string contentFileFullPath = $"{ContentFolderPath}/{item.ID}.content"; + MemoryStream stream = new MemoryStream(); + _client.DownloadFile(contentFileFullPath, stream); + NotebookContent notebookContent = NotebookContent.FromStream(stream); + List pageIDs = notebookContent.pages.ToList(); + Console.WriteLine($"RmSftpDataSource::DownloadDocument() - Notebook \"{item.VissibleName}\" has {pageIDs.Count} pages"); + + RmSftpDownloadedDoc downloadedDoc = new RmSftpDownloadedDoc(ContentFolderPath, item.ID, pageIDs, _client); + return downloadedDoc; + }); + } + + public void Dispose() + { + _client?.Dispose(); + } + + private List GetAllItems() + { + List items = new List(); + + foreach (var file in _client.ListDirectory(ContentFolderPath)) + { + if (file.IsDirectory) + continue; + + if (!file.Name.EndsWith(".metadata")) + continue; + + MemoryStream stream = new MemoryStream(); + _client.DownloadFile(file.FullName, stream); + NotebookMetadata notebookMetadata = NotebookMetadata.FromStream(stream); + + if (notebookMetadata.deleted) + continue; + + items.Add(notebookMetadata.ToRmItem(file.Name)); + } + + return items; + } + + private List getChildItemsRecursive(string parentId, ref List items) + { + var children = (from item in items where item.Parent == parentId select item).ToList(); + foreach (var child in children) + { + child.Children = getChildItemsRecursive(child.ID, ref items); + } + return children; + } + } +} + diff --git a/RemarkableSync/RmSftpDownloadedDoc.cs b/RemarkableSync/RmSftpDownloadedDoc.cs new file mode 100644 index 0000000..59efa8e --- /dev/null +++ b/RemarkableSync/RmSftpDownloadedDoc.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Renci.SshNet; + +namespace RemarkableSync +{ + public class RmSftpDownloadedDoc: RmDownloadedDoc + { + public RmSftpDownloadedDoc(string basePath, string id, List pageIDs, SftpClient client) : base (id) + { + try + { + _pageCount = pageIDs.Count; + + //create the temp content folder + Directory.CreateDirectory(GetPageContentFolderPath()); + + string sourceContentFolder = $"{basePath}/{id}/"; + + for (int i = 0; i < _pageCount; ++i) + { + var file = File.OpenWrite(GetPageContentFilePath(i)); + client.DownloadFile(sourceContentFolder + pageIDs[i]+ ".rm", file); + file.Flush(); + file.Close(); + } + } + catch (Exception err) + { + Console.WriteLine($"RmDownloadedDoc::RmDownloadedDoc() - failed to download content to temp folder. Error: {err.Message}"); + throw err; + } + } + } +} diff --git a/RemarkableSync/RmSftpJsonTypes.cs b/RemarkableSync/RmSftpJsonTypes.cs new file mode 100644 index 0000000..3821941 --- /dev/null +++ b/RemarkableSync/RmSftpJsonTypes.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + +namespace RemarkableSync +{ + public partial class RmSftpDataSource : IRmDataSource + { + public class NotebookMetadata + { + public static NotebookMetadata FromStream(Stream stream) + { + string content = ""; + stream.Position = 0; + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + content = reader.ReadToEnd(); + } + return JsonSerializer.Deserialize(content); + } + + public RmItem ToRmItem(string filename) + { + RmItem item = new RmItem(); + + // strip extension from filename to use as ID + int pos = filename.IndexOf('.'); + item.ID = pos == -1 ? filename : filename.Substring(0, pos); + item.Version = version; + item.Type = type; + item.VissibleName = visibleName; + item.Parent = parent; + return item; + } + + public bool deleted { get; set; } + public string lastModified { get; set; } + public int lastOpenedPage { get; set; } + public bool metadatamodified { get; set; } + public bool modified { get; set; } + public string parent { get; set; } + public bool pinned { get; set; } + public bool synced { get; set; } + public string type { get; set; } + public int version { get; set; } + public string visibleName { get; set; } + } + + public class NotebookContent + { + public static NotebookContent FromStream(Stream stream) + { + string content = ""; + stream.Position = 0; + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + content = reader.ReadToEnd(); + } + return JsonSerializer.Deserialize(content); + } + + public int coverPageNumber { get; set; } + public bool dummyDocument { get; set; } + public Extrametadata extraMetadata { get; set; } + public string fileType { get; set; } + public string fontName { get; set; } + public int lineHeight { get; set; } + public int margins { get; set; } + public string orientation { get; set; } + public int pageCount { get; set; } + public string[] pages { get; set; } + public string textAlignment { get; set; } + public int textScale { get; set; } + public Transform transform { get; set; } + } + + public class Extrametadata + { + public string LastBallpointColor { get; set; } + public string LastBallpointSize { get; set; } + public string LastBallpointv2Color { get; set; } + public string LastBallpointv2Size { get; set; } + public string LastCalligraphyColor { get; set; } + public string LastCalligraphySize { get; set; } + public string LastClearPageColor { get; set; } + public string LastClearPageSize { get; set; } + public string LastEraseSectionColor { get; set; } + public string LastEraseSectionSize { get; set; } + public string LastEraserColor { get; set; } + public string LastEraserSize { get; set; } + public string LastEraserTool { get; set; } + public string LastFinelinerColor { get; set; } + public string LastFinelinerSize { get; set; } + public string LastFinelinerv2Color { get; set; } + public string LastFinelinerv2Size { get; set; } + public string LastHighlighterColor { get; set; } + public string LastHighlighterSize { get; set; } + public string LastHighlighterv2Color { get; set; } + public string LastHighlighterv2Size { get; set; } + public string LastMarkerColor { get; set; } + public string LastMarkerSize { get; set; } + public string LastMarkerv2Color { get; set; } + public string LastMarkerv2Size { get; set; } + public string LastPaintbrushColor { get; set; } + public string LastPaintbrushSize { get; set; } + public string LastPaintbrushv2Color { get; set; } + public string LastPaintbrushv2Size { get; set; } + public string LastPen { get; set; } + public string LastPencilColor { get; set; } + public string LastPencilSize { get; set; } + public string LastPencilv2Color { get; set; } + public string LastPencilv2Size { get; set; } + public string LastReservedPenColor { get; set; } + public string LastReservedPenSize { get; set; } + public string LastSelectionToolColor { get; set; } + public string LastSelectionToolSize { get; set; } + public string LastSharpPencilColor { get; set; } + public string LastSharpPencilSize { get; set; } + public string LastSharpPencilv2Color { get; set; } + public string LastSharpPencilv2Size { get; set; } + public string LastSolidPenColor { get; set; } + public string LastSolidPenSize { get; set; } + public string LastTool { get; set; } + public string LastZoomToolColor { get; set; } + public string LastZoomToolSize { get; set; } + } + + public class Transform + { + public int m11 { get; set; } + public int m12 { get; set; } + public int m13 { get; set; } + public int m21 { get; set; } + public int m22 { get; set; } + public int m23 { get; set; } + public int m31 { get; set; } + public int m32 { get; set; } + public int m33 { get; set; } + } + + } +} + diff --git a/RemarkableSync/WinRegistryConfigStore.cs b/RemarkableSync/WinRegistryConfigStore.cs new file mode 100644 index 0000000..7842ab6 --- /dev/null +++ b/RemarkableSync/WinRegistryConfigStore.cs @@ -0,0 +1,110 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace RemarkableSync +{ + public class WinRegistryConfigStore : IConfigStore + { + private string _regKeyPath; + + public WinRegistryConfigStore(string regKeyPath) + { + _regKeyPath = regKeyPath; + } + + public string GetConfig(string configName) + { + string regValue = null; ; + try + { + var settingsKey = Registry.CurrentUser.OpenSubKey(_regKeyPath); + regValue = (string)settingsKey.GetValue(configName, null); + } + catch (Exception err) + { + Console.WriteLine($"WinRegistryConfigStore::GetConfig() - Failed to access registry for config \"{configName}\". Error: {err.Message}"); + return null; + } + + if (regValue == null) + { + Console.WriteLine($"WinRegistryConfigStore::GetConfig() - Getting value from registry for config \"{configName}\" failed"); + return null; + } + + try + { + return Encoding.UTF8.GetString(DecryptData(Convert.FromBase64String(regValue))); + } + catch (Exception err) + { + Console.WriteLine($"WinRegistryConfigStore::GetConfig() - Failed to get config \"{configName}\". Error: {err.Message}"); + return null; + } + } + + public bool SetConfigs(Dictionary configs) + { + List> encryptedConfigs = null; + try + { + // to byte[], encrypt, then to base 64 string + var rawData = from config in configs + select new KeyValuePair( + config.Key, + Convert.ToBase64String(EncryptData(Encoding.UTF8.GetBytes(config.Value)))); + encryptedConfigs = rawData.ToList(); + } + catch (Exception err) + { + Console.WriteLine($"WinRegistryConfigStore::SetConfigs() - Failed to encrypt all configs. Error: {err.Message}"); + return false; + } + + + var settingsKey = Registry.CurrentUser.OpenSubKey(_regKeyPath, true); + foreach (var encryptedConfig in encryptedConfigs) + { + settingsKey.SetValue(encryptedConfig.Key, encryptedConfig.Value); + } + + + return true; + } + + public void Dispose() + { + return; + } + + private byte[] EncryptData(byte[] rawData) + { + try + { + return ProtectedData.Protect(rawData, null, DataProtectionScope.LocalMachine); + } + catch (Exception err) + { + Console.WriteLine("WinRegistryConfigStore::EncryptData() - Encrupt failed with err: " + err.Message); + throw err; + } + } + + private byte[] DecryptData(byte[] encryptedData) + { + try + { + return ProtectedData.Unprotect(encryptedData, null, DataProtectionScope.LocalMachine); + } + catch (Exception err) + { + Console.WriteLine("WinRegistryConfigStore::DecryptData() - Encrupt failed with err: " + err.Message); + throw err; + } + } + } +} diff --git a/RemarkableSync/packages.config b/RemarkableSync/packages.config index 5ad1e68..6181b80 100644 --- a/RemarkableSync/packages.config +++ b/RemarkableSync/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file