From 7b206a01a496770d0d5f03437399866148d84bf8 Mon Sep 17 00:00:00 2001 From: Nicola Dalla Costa Date: Sat, 9 May 2020 09:11:49 +0200 Subject: [PATCH 01/93] Fixed a typo in Italian translation. (#374) --- AutoUpdater.NET/UpdateForm.it.resx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/UpdateForm.it.resx b/AutoUpdater.NET/UpdateForm.it.resx index eb2fb63d..c80add61 100644 --- a/AutoUpdater.NET/UpdateForm.it.resx +++ b/AutoUpdater.NET/UpdateForm.it.resx @@ -136,7 +136,7 @@ Aggiorna - {0} {1} è ora disponibile. Hai insallato la versione {2}. Vuoi scaricare l'aggiornamento ora? + {0} {1} è ora disponibile. Hai installato la versione {2}. Vuoi scaricare l'aggiornamento ora? Note di rilascio: @@ -144,4 +144,4 @@ Una nuova versione di {0} è disponibile! - \ No newline at end of file + From f07d5dabe5ad942d49df22e62fb66ba2e3a613d6 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 27 Jul 2020 17:37:27 +0530 Subject: [PATCH 02/93] Added InstalledVersion field to manually provide installed version. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 4 +- AutoUpdater.NET/AutoUpdater.cs | 8 +- AutoUpdater.NET/Properties/AssemblyInfo.cs | 4 +- .../build/Autoupdater.NET.Official.nuspec | 2 +- AutoUpdaterTest/FormMain.cs | 3 + README.md | 83 +++++++++---------- appveyor.yml | 4 +- 7 files changed, 57 insertions(+), 51 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 5eb9377a..befc2e69 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -93,7 +93,7 @@ - + @@ -109,7 +109,7 @@ - + Component diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 78e507af..100b4075 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -70,6 +70,10 @@ public static class AutoUpdater internal static bool Running; + /// + /// You can set this field to your current version if you don't want to determine the version from the assembly. + /// + public static Version InstalledVersion; /// /// Set it to folder path where you want to download the update file. If not provided then it defaults to Temp folder. /// @@ -375,8 +379,8 @@ private static object CheckUpdate(Assembly mainAssembly) throw new MissingFieldException(); } - args.InstalledVersion = mainAssembly.GetName().Version; - args.IsUpdateAvailable = new Version(args.CurrentVersion) > mainAssembly.GetName().Version; + args.InstalledVersion = InstalledVersion != null ? InstalledVersion : mainAssembly.GetName().Version; + args.IsUpdateAvailable = new Version(args.CurrentVersion) > args.InstalledVersion; if (!Mandatory) { diff --git a/AutoUpdater.NET/Properties/AssemblyInfo.cs b/AutoUpdater.NET/Properties/AssemblyInfo.cs index c51847f5..08d7abc0 100644 --- a/AutoUpdater.NET/Properties/AssemblyInfo.cs +++ b/AutoUpdater.NET/Properties/AssemblyInfo.cs @@ -32,6 +32,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] +[assembly: AssemblyVersion("1.6.1.0")] +[assembly: AssemblyFileVersion("1.6.1.0")] [assembly: NeutralResourcesLanguageAttribute("en")] diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 90873de9..9b73cf99 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.6.0 + 1.6.1 AutoUpdater.NET RBSoft RBSoft diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 04c20b86..85738a16 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -121,6 +121,9 @@ private void FormMain_Load(object sender, EventArgs e) //Uncomment following line if you want to check for update synchronously. //AutoUpdater.Synchronous = true; + //Uncomment following line if you don't want the library to determine the installed version from assembly. + //AutoUpdater.InstalledVersion = new Version("2.0.0.1"); + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } diff --git a/README.md b/README.md index b5034cfb..274052ba 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,14 @@ AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml", myAssembly); ## Configuration Options +### Provide installed version manually + +If you don't want AutoUpdater.NET to determine the installed version from assembly then you can provide your own version by assigning it to InstalledVersion field as shown below. + +````csharp +AutoUpdater.InstalledVersion = new Version("1.2"); +```` + ### Download Update file and XML using FTP If you like to use ftp XML URL to check for updates or download the update file then you can provide you FTP credentials in alternative Start method as shown below. @@ -302,60 +310,51 @@ AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) { - if (args != null) + if (args.IsUpdateAvailable) { - if (args.IsUpdateAvailable) + DialogResult dialogResult; + if (args.Mandatory.Value) { - DialogResult dialogResult; - if (args.Mandatory.Value) - { - dialogResult = - MessageBox.Show( - $@"There is new version {args.CurrentVersion} available. You are using version {args.InstalledVersion}. This is required update. Press Ok to begin updating the application.", @"Update Available", - MessageBoxButtons.OK, - MessageBoxIcon.Information); - } - else - { - dialogResult = - MessageBox.Show( - $@"There is new version {args.CurrentVersion} available. You are using version { - args.InstalledVersion - }. Do you want to update the application now?", @"Update Available", - MessageBoxButtons.YesNo, - MessageBoxIcon.Information); - } + dialogResult = + MessageBox.Show( + $@"There is new version {args.CurrentVersion} available. You are using version {args.InstalledVersion}. This is required update. Press Ok to begin updating the application.", @"Update Available", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + else + { + dialogResult = + MessageBox.Show( + $@"There is new version {args.CurrentVersion} available. You are using version { + args.InstalledVersion + }. Do you want to update the application now?", @"Update Available", + MessageBoxButtons.YesNo, + MessageBoxIcon.Information); + } - // Uncomment the following line if you want to show standard update dialog instead. - // AutoUpdater.ShowUpdateForm(args); + // Uncomment the following line if you want to show standard update dialog instead. + // AutoUpdater.ShowUpdateForm(args); - if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK)) + if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK)) + { + try { - try - { - if (AutoUpdater.DownloadUpdate(args)) - { - Application.Exit(); - } - } - catch (Exception exception) + if (AutoUpdater.DownloadUpdate(args)) { - MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK, - MessageBoxIcon.Error); + Application.Exit(); } } - } - else - { - MessageBox.Show(@"There is no update available please try again later.", @"No update available", - MessageBoxButtons.OK, MessageBoxIcon.Information); + catch (Exception exception) + { + MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } } } else { - MessageBox.Show( - @"There is a problem reaching update server please check your internet connection and try again later.", - @"Update check failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(@"There is no update available please try again later.", @"No update available", + MessageBoxButtons.OK, MessageBoxIcon.Information); } } ```` diff --git a/appveyor.yml b/appveyor.yml index 0cb7ee0f..5254c3c4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.6.0.{build} +version: 1.6.1.{build} environment: - my_version: 1.6.0 + my_version: 1.6.1 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From a6b7f74ba8909684f352946933086745683a71fe Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Tue, 4 Aug 2020 12:37:13 +0530 Subject: [PATCH 03/93] Now it is not possible for user to use ALT+F4 to close the updater when mandatory mode is Forced or ForcedDownload. --- AutoUpdater.NET/DownloadUpdateDialog.cs | 16 +++++++++------- AutoUpdater.NET/UpdateForm.Designer.cs | 1 + AutoUpdater.NET/UpdateForm.cs | 8 ++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 1634b82a..7dd85dfb 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -215,6 +215,8 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } finally { + DialogResult = _webClient == null ? DialogResult.Cancel : DialogResult.OK; + FormClosing -= DownloadUpdateDialog_FormClosing; Close(); } } @@ -255,19 +257,19 @@ private static void CompareChecksum(string fileName, CheckSum checksum) private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArgs e) { - if (_webClient == null) + if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) { - DialogResult = DialogResult.Cancel; + if (e.CloseReason == CloseReason.UserClosing) + { + e.Cancel = true; + return; + } } - else if (_webClient.IsBusy) + if (_webClient != null && _webClient.IsBusy) { _webClient.CancelAsync(); DialogResult = DialogResult.Cancel; } - else - { - DialogResult = DialogResult.OK; - } } } } \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.Designer.cs b/AutoUpdater.NET/UpdateForm.Designer.cs index e5ee1a68..216e8274 100644 --- a/AutoUpdater.NET/UpdateForm.Designer.cs +++ b/AutoUpdater.NET/UpdateForm.Designer.cs @@ -112,6 +112,7 @@ private void InitializeComponent() this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "UpdateForm"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.UpdateForm_FormClosing); this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.UpdateForm_FormClosed); this.Load += new System.EventHandler(this.UpdateFormLoad); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).EndInit(); diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 539812b0..d3e35394 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -178,5 +178,13 @@ private void UpdateForm_FormClosed(object sender, FormClosedEventArgs e) { AutoUpdater.Running = false; } + + private void UpdateForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) + { + e.Cancel = e.CloseReason == CloseReason.UserClosing; + } + } } } \ No newline at end of file From 113501e7494fb28183b3270df85870cf588b39c3 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sat, 22 Aug 2020 14:49:37 +0530 Subject: [PATCH 04/93] Now ZipExtractor will retry copying file in case of failure. --- ZipExtractor/FormMain.cs | 22 +++++++++++++++++++++- ZipExtractor/ZipExtractor.csproj | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 55406346..ebaa8994 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -5,6 +5,7 @@ using System.IO; using System.IO.Compression; using System.Text; +using System.Threading; using System.Windows.Forms; using ZipExtractor.Properties; @@ -12,6 +13,7 @@ namespace ZipExtractor { public partial class FormMain : Form { + private const int _maxRetries = 2; private BackgroundWorker _backgroundWorker; readonly StringBuilder _logBuilder = new StringBuilder(); @@ -88,8 +90,26 @@ private void FormMain_Shown(object sender, EventArgs e) } ZipStorer.ZipFileEntry entry = dir[index]; - zip.ExtractFile(entry, Path.Combine(path, entry.FilenameInZip)); string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FilenameInZip); + int retries = 0; + bool notCopied = true; + while (notCopied) + { + try + { + zip.ExtractFile(entry, Path.Combine(path, entry.FilenameInZip)); + notCopied = false; + } + catch (IOException) + { + Thread.Sleep(5000); + retries++; + if (retries > _maxRetries) + { + throw; + } + } + } int progress = (index + 1) * 100 / dir.Count; _backgroundWorker.ReportProgress(progress, currentFile); diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 01f42033..b54bd852 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -21,7 +21,7 @@ false true 0 - 1.0.0.%2a + 1.1.0.0 false false true From e06ecc02be7b8affa7679d30e0d39b6004d91e64 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 24 Aug 2020 11:57:23 +0530 Subject: [PATCH 05/93] - Migrated to new csproj format. - Now using ZipArchive class present in .NET 4.5 to extract zip file. --- .gitignore | 3 +- AutoUpdater.NET.sln | 48 +- AutoUpdater.NET/AutoUpdater.NET.csproj | 438 ++---------------- AutoUpdater.NET/AutoUpdater.cs | 16 +- AutoUpdater.NET/Properties/AssemblyInfo.cs | 37 -- .../Resources/net20/ZipExtractor.exe | Bin 0 -> 106496 bytes .../Resources/net20/ZipExtractor.exe.config | 6 + ZipExtractor/FormMain.cs | 111 +++-- ZipExtractor/Properties/AssemblyInfo.cs | 36 -- ZipExtractor/Properties/Settings.Designer.cs | 2 +- ZipExtractor/ZipExtractor.csproj | 198 +++----- ZipExtractor/app.config | 3 - ZipExtractor/packages.config | 5 - appveyor.yml | 16 +- 14 files changed, 205 insertions(+), 714 deletions(-) delete mode 100644 AutoUpdater.NET/Properties/AssemblyInfo.cs create mode 100644 AutoUpdater.NET/Resources/net20/ZipExtractor.exe create mode 100644 AutoUpdater.NET/Resources/net20/ZipExtractor.exe.config delete mode 100644 ZipExtractor/Properties/AssemblyInfo.cs delete mode 100644 ZipExtractor/app.config delete mode 100644 ZipExtractor/packages.config diff --git a/.gitignore b/.gitignore index 164007dc..1930c402 100644 --- a/.gitignore +++ b/.gitignore @@ -251,5 +251,4 @@ paket-files/ .idea/ *.sln.iml *.snk -/AutoUpdater.NET/lib -/AutoUpdater.NET/build/lib/net40 +/AutoUpdater.NET/build/lib/ diff --git a/AutoUpdater.NET.sln b/AutoUpdater.NET.sln index 39e677ff..c666fb9e 100644 --- a/AutoUpdater.NET.sln +++ b/AutoUpdater.NET.sln @@ -10,8 +10,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoUpdater.NET", "AutoUpda EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoUpdaterTest", "AutoUpdaterTest\AutoUpdaterTest.csproj", "{FD5AE762-C630-49F8-B814-FCF70E7838D1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipExtractor", "ZipExtractor\ZipExtractor.csproj", "{91DE558C-6DB8-429B-A069-C0491DCFF15B}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoUpdaterTestWPF", "AutoUpdaterTestWPF\AutoUpdaterTestWPF.csproj", "{9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1DBD2EE1-6C31-4B24-9212-E221404F4ADE}" @@ -22,64 +20,30 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipExtractor", "ZipExtractor\ZipExtractor.csproj", "{EDB311FC-50D3-468B-AC36-4CDFE04D29A3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug-NET35|Any CPU = Debug-NET35|Any CPU - Debug-NET40|Any CPU = Debug-NET40|Any CPU Release|Any CPU = Release|Any CPU - Release-NET35|Any CPU = Release-NET35|Any CPU - Release-NET40|Any CPU = Release-NET40|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Debug-NET35|Any CPU.ActiveCfg = Debug-NET35|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Debug-NET35|Any CPU.Build.0 = Debug-NET35|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Debug-NET40|Any CPU.ActiveCfg = Debug-NET40|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Debug-NET40|Any CPU.Build.0 = Debug-NET40|Any CPU {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Release|Any CPU.Build.0 = Release|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Release-NET35|Any CPU.ActiveCfg = Release-NET35|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Release-NET35|Any CPU.Build.0 = Release-NET35|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Release-NET40|Any CPU.ActiveCfg = Release-NET40|Any CPU - {FB9E7E6B-B19F-4F37-A708-2996190CEF13}.Release-NET40|Any CPU.Build.0 = Release-NET40|Any CPU {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Debug-NET35|Any CPU.ActiveCfg = Debug|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Debug-NET35|Any CPU.Build.0 = Debug|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Debug-NET40|Any CPU.ActiveCfg = Debug|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Debug-NET40|Any CPU.Build.0 = Debug|Any CPU {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Release|Any CPU.Build.0 = Release|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Release-NET35|Any CPU.ActiveCfg = Release|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Release-NET35|Any CPU.Build.0 = Release|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Release-NET40|Any CPU.ActiveCfg = Release|Any CPU - {FD5AE762-C630-49F8-B814-FCF70E7838D1}.Release-NET40|Any CPU.Build.0 = Release|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Debug-NET35|Any CPU.ActiveCfg = Debug-NET35|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Debug-NET35|Any CPU.Build.0 = Debug-NET35|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Debug-NET40|Any CPU.ActiveCfg = Debug-NET40|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Debug-NET40|Any CPU.Build.0 = Debug-NET40|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Release|Any CPU.Build.0 = Release|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Release-NET35|Any CPU.ActiveCfg = Release-NET35|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Release-NET35|Any CPU.Build.0 = Release-NET35|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Release-NET40|Any CPU.ActiveCfg = Release-NET40|Any CPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B}.Release-NET40|Any CPU.Build.0 = Release-NET40|Any CPU {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Debug-NET35|Any CPU.ActiveCfg = Debug|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Debug-NET35|Any CPU.Build.0 = Debug|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Debug-NET40|Any CPU.ActiveCfg = Debug|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Debug-NET40|Any CPU.Build.0 = Debug|Any CPU {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Release|Any CPU.ActiveCfg = Release|Any CPU {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Release|Any CPU.Build.0 = Release|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Release-NET35|Any CPU.ActiveCfg = Release|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Release-NET35|Any CPU.Build.0 = Release|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Release-NET40|Any CPU.ActiveCfg = Release|Any CPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3}.Release-NET40|Any CPU.Build.0 = Release|Any CPU + {EDB311FC-50D3-468B-AC36-4CDFE04D29A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDB311FC-50D3-468B-AC36-4CDFE04D29A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDB311FC-50D3-468B-AC36-4CDFE04D29A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDB311FC-50D3-468B-AC36-4CDFE04D29A3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index befc2e69..3319d18c 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -1,396 +1,50 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {FB9E7E6B-B19F-4F37-A708-2996190CEF13} - library - Properties - AutoUpdaterDotNET - AutoUpdater.NET - v4.0 - 512 - - - - - - true - full - false - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - TRACE - prompt - 4 - false - - - v2.0 - bin\Debug\net20 - bin\Debug\net20\AutoUpdater.NET.XML - - - v2.0 - build\lib\net20 - build\lib\net20\AutoUpdater.NET.XML - - - v3.5 - bin\Debug\net35 - bin\Debug\net35\AutoUpdater.NET.XML - - - v3.5 - build\lib\net35 - build\lib\net35\AutoUpdater.NET.XML - - - v4.0 - bin\Debug\net40 - bin\Debug\net40\AutoUpdater.NET.XML - - - v4.0 - build\lib\net40 - build\lib\net40\AutoUpdater.NET.XML - - - true - - - AutoUpdater.NET.snk - - - - $(DefineConstants);NETWPF - true - - - false - - - - + + + + {FB9E7E6B-B19F-4F37-A708-2996190CEF13} + library + net20;net35;net40;net45 + true + AutoUpdaterDotNET + AutoUpdater.NET + RBSoft + AutoUpdater.NET + Copyright © 2012-2020 RBSoft + 1.6.1.0 + 1.6.1.0 + true + AutoUpdater.NET.snk + embedded + true + en + + + build\lib + + + NETWPF + + + + + + + + + - - - - + + + + + + - - - - - - - - - - - - - - - - - Form - - - DownloadUpdateDialog.cs - - - - - - Component - - - - - Form - - - RemindLaterForm.cs - - - Form - - - UpdateForm.cs - - - - True - True - Resources.resx - - - - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - Designer - - - - - - - - - - - - - Designer - - - - - - Designer - - - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - Designer - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - Designer - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - Designer - - - - - - Designer - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - + + + + + + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 100b4075..05f08ee4 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -64,7 +64,7 @@ public static class AutoUpdater { private static System.Timers.Timer _remindLaterTimer; - internal static bool IsWinFormsApplication; + private static bool _isWinFormsApplication; internal static Uri BaseUri; @@ -272,9 +272,9 @@ public static void Start(string appCast, Assembly myAssembly = null) AppCastURL = appCast; - IsWinFormsApplication = Application.MessageLoop; + _isWinFormsApplication = Application.MessageLoop; - if (!IsWinFormsApplication) + if (!_isWinFormsApplication) { Application.EnableVisualStyles(); } @@ -522,7 +522,7 @@ private static void Exit() string processPath; try { - processPath = process.MainModule.FileName; + processPath = process.MainModule?.FileName; } catch (Win32Exception) { @@ -531,8 +531,8 @@ private static void Exit() continue; } - if (process.Id != currentProcess.Id && - currentProcess.MainModule.FileName == processPath + if (process.Id != currentProcess.Id && !string.IsNullOrEmpty(processPath) && + currentProcess.MainModule?.FileName == processPath ) //get all instances of assembly except current { if (process.CloseMainWindow()) @@ -548,7 +548,7 @@ private static void Exit() } } - if (IsWinFormsApplication) + if (_isWinFormsApplication) { MethodInvoker methodInvoker = Application.Exit; methodInvoker.Invoke(); @@ -638,7 +638,7 @@ public static bool DownloadUpdate(UpdateInfoEventArgs args) } /// - /// Shows standard update dialog. + /// Shows standard update dialog. /// public static void ShowUpdateForm(UpdateInfoEventArgs args) { diff --git a/AutoUpdater.NET/Properties/AssemblyInfo.cs b/AutoUpdater.NET/Properties/AssemblyInfo.cs deleted file mode 100644 index 08d7abc0..00000000 --- a/AutoUpdater.NET/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; -using System.Resources; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("AutoUpdater.NET")] -[assembly: AssemblyDescription("AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("RBSoft")] -[assembly: AssemblyProduct("AutoUpdater.NET")] -[assembly: AssemblyCopyright("Copyright © 2012-2020 RBSoft")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a4037a6f-fdf7-46c8-a303-c3c4fcddb015")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.1.0")] -[assembly: AssemblyFileVersion("1.6.1.0")] -[assembly: NeutralResourcesLanguageAttribute("en")] diff --git a/AutoUpdater.NET/Resources/net20/ZipExtractor.exe b/AutoUpdater.NET/Resources/net20/ZipExtractor.exe new file mode 100644 index 0000000000000000000000000000000000000000..500e36b090a9b2d5f18c6c6f5d050bd47c475b0d GIT binary patch literal 106496 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�IGCsG+?eXkVL8!nQDzLAAAi@1o~2F9oqsc2CfeCrlFcXhYN8eBcnfRKmoLk zm|4MKcGOLw$_L{_6@mlT1;-?qk--WYEp(X{5fG)$&~;PckV$TIU@IuJDjf_97?BWr z^aCG^#H1R`EC~>-aY$lfb$yt`eaGNPl~{Ps5hi-AE=vLNPygDZ-smvVDPb8=XLB$? zOlKl?x-yRph^RtCDmhCFuSOa;Fge_OQjSuYhhpRFDSzV?UZ}w|NIXMtYT{dXHb-H2 zYQp;0&uVqv9HrGljK*fyPp!%f;*UT8qe`6*{fUP$g4LFy{3Sb4IZ~S`KZ1yydXax2gG^|2_-N|!YiQ6TtPbh zH%9QOpND^=CvhD`F04(kdv{goz^(N2Q4(3Awj85B3O12ia3QD{J1U+CW0m1zh0EBBi6qKi}YvGhkD|6a1##C zz>GQcR*u$ca+%8SuAo$=JH-qt-ShX%6#}lHi!IS<~8&*fKP=?7g1J>8f0$cBLb$5^rE)pA0 zga&8AO9t@cbWo*Ba&!=0&7~`$0lXrHh=J{)Baj48V1zNyOGUE1t<{+fkFazS%yCAa%uy-^D&t{|ha$A;u#&<{MMhvE4{p9L0o`7g?!v73 z8wi4vWT6w4o0ne%?38%2Ozj6~HD2|lrt3va)iIK%*0)UrNL4V>5x-NYla$K-C{_(# zsmg$IrYq`WmA(YO+gpzW2|Fru`Q5ZC{iX)iN?0zGnybvuf-lRaLQu$J#4!jKs|JJO zMU~!?smyqWDw>SCjZxi#2QO`4MQ)%bK^WmS$@(?EAH;)P%|KYb>N>$)|9CB9jJg>O z4;?HJnLTlW^e7+=6nJY1+zr{HdWji1iE1c1r$Cp5a0|G{Uz`5QmLX=$O?Ev_=x~T7wT~LPQ{rhhOHe_aH26oghR|;!Ut7C4F00R6k)eK@FlW zCIF`<_Ja}fbEoJLj0X}DeQaU6YH&Yhgu&FsXd7OHmp|AYFo@Tx@NNQ&id_}Ph+!z; zNkTuGh$F_~tyLV*Heks=xW1}3?1Fc{n|6_l*=f%ty?bjo~`nguE;wfY=1 zj`fCx5)=GmlsPa6@Lt=nU1OwXpq?mNrOe6DPZ7j+ct4gCL--+(tw0cCfEo~9(*(cJRG|UgCV|1dYE`$ zvIZhkfFHusXB`oCmU@!3f`0vAnCO-0l9vJ8A^L@>Gw}9{EKPG15ata-I$5jAMV(;f zPIk#8ppXy}u2L(sMVL2m!zcZ)GbCZ);Up6&^(l}Hr?6y1+y*{NT#uQBQ&SDDjn^QU z7<*3>CZdltd52bi3Z2Fp)mV;F%iQbhvN>gGJS^sNR}}f!kn! z1}A7$1HnwOc)5uu8Zx{im2h1uM;C&;y}hFXyu#q*|Ix0HSKRPfx z%0D{5$IIW}FA4>;^oodzj`H>o5Ayeo_Vo|*^Jy6#6yz5f;p^w+6XxaP)6zT0$J-Z$ z`GxuTc>DWAhlPa)MTYx@1^7lr`T6*SMR`T~2LV3P*FW6LFAPD>HzLqKI?^j32xz>5 z{K6uA{rr8rgTkSO$jBg&Bf>8r5=DbtVd3FnfdRfzzP{m+{sAomy?uiG!Xtd6;L{`C z-hSR*k>L^1C_190uUAxHWVCl+fPc%De$k*;WKcl3zqgmSm!H2MC>b6Y?(Kt8@n#sd zLSzWyafugb*sg5?5Q(s4o&2AvfCcU{6?5UMvoc3fNX)9MU*zb=H70|iG*yl&zo@>H zS?c_}z+!MPZ{rXMbBTU!NI0k))U7XQu+ph#U0{u!helNdFD*WL18{RbwaS%Q1$Ptga(m{3}poD(l;Y>&%E9jnJU~^o0@`(!o6j z1$?U{AFkJBAQ>72_aE}%uR6$3KiGrkz&{Pa;g6lj;KL^xlneh92-bg)&jD&R)RYk( znef?^T*%>%rs&|xJ2LNyis7nz3F-|L#mE~{sL6kl#gnv^37?tD19>#i9=?VM7meUL zI+hUG8XbR!(FP2G-kPFrTf1t&HR}&4iL|Xj07DCnNcOP-_1X)2^ zaT0LI1Ujrw7vPM<(U8L&;y?ndDQX@Ikg*xI4f7Eg8Ay}|_E13UO2P}cb?HXx7(Nuk z*i%a^l?T+gF1|Z$kW2u;YJR<}*52H-rB$ zK9)h+#CU8^9YBo1yt2r7Fktc;aDX-~4P3E@VZU+#AH)5HIjDdKu9<;Q@1*}AH}+ix zkvd&ZTi;&8-o#$6fYyKQF_0qSKl^e5>CHT%8SZ1;tDdMcIb&;S^|nNA|BH_e+5D&W zkV_I+3y%r~cq<;K*urY)fqcm60I!7JMsD4J278miZ?UChb#%Db@MtHN^Y}m0HlU_Z zmk6kbM?U^Q67KyBXa!4zM=TyiMMSQKA6CNtgX!>yYbXcf^VkEC_y43<8q~uPi_r;> zJvBnb*v7fQb0D0f^b#@l$Nt55pCPU>F)thX1Gk1f7S}TPzrmik4&%%DATjP!S=~pW z8p?;mZOGx_KIUKMhwbxj`OQ3d{d&aTF}PP(8^62d{EeZh!^BqvtynZ4e+?c!Bq%Y0 zpDFyr@Uw)U4gBobGWgmyk1H_|H{lB<@azu~H{r-Ap^z)1B&I@+3`yW`CLlW@JV7ZG zHf{`M6pJfkQH`yEf|7U>=ucov8sjBxfL;;?jD>LjR0y2lsY#)bDNDqJVg+Wv=aaM& zb7Yb#oWu=N;#|UT07(~Mp-M=ygvN!Xqi}r_6DCv6oGQ2=YUvD8ueXVeO9@THr3=KR zm0VmdDV@WREn`lr800$Uv4vK%E|G3l@DYqWgt08d}sB<^DtpVs#ewpkc>1D8b$IJCGd3erXx z8O!Cd`9`?EAk7!Z*c9|Y7a*V!OCl2rL1O&3CD;-fFc7lf`8|RM0uGOo$c*(RkZ19r zf6Edj@E7zbaTB4Dj3beYonfq)%D5y23;>U-$-z+s*sINvF^@0g3)yx6U|>>wHkez; z=R==^w;{?7O91BQ%QzHaM)NpEMtlJe1hwPx`Hno1UPC_5$VedI@!%wG0=h`#mf|uc zNCJu&0V$k#aN_B)5CqKOSqSLhSl}hZyo_W>&x^-n3$ZT5D!C9Qzyp90_&gpNj}6#7Sw|zB_Kr5H7rUXFyUc?8G#xCfsv7nC3Xhk z%EEvHSeVbF`Q$K?(Gd3VA&^me;~GIHLyN!#1b~m{LIza8j%Eb5gtqw5j<|_{&-5br z1CJ7Lc+l~<_u1eBl+ccC%7eD&fb9f4_zozEYT&~%cs@#ocq~wy7CW=R&A}sSm)epYQBBpm4wiRpfsh$N^dGsqy!Y{O{&y@ zs2~VIdf(VUQ9%*0pkTpH6BPu3hy?`{1Qk@8bOe#AfI#j9^nLyR?|Hv_&U2sdyU%^T zvy#c|nOVOzv-h6NtTlUP5AxBwYM}}F$oqp9&CeYgM)9cD0IDPy6Hi7yvyoFnK57rZ z68X%TSzgFzLq3LlW^Foyd=BL2A)gcZFOZLB8$mnr(fSHBR~9fd?HACLWej`G(^nZx2`-k}U ze~2IchxqxM`5%;@IpO4j|vR2nYOs zoIh5A16gKe{zX#ACnHBe4hIW@us^QHA4NeN*!&kTjCq6{`Y@x=51md&F^u^ybK_=o zgdF-XqnJPcOG*e!n5VF?gfPU+6`5FA5*dkHVqsAp3YR4Q^M5d6ENM@KBWJWNF$&W%P$P`#IpC5{5 zMno1CEToqdhB4VuT;xJ}d}w4MDjO=qJU+27vh`-XASs?*Mf2S|Rlwhc_ zDk=<}4>5n3>W=ffy}rYt5QekML)A@uL^6BGZEpO84uGcP|O>`!^@ zMMViHydYvB|AffIzxh%6p2NIGIGD`IUODU zCT7~-gfS~OvtloJ=ocOS*XnsCl7%>80me*Pt_yif(J(yL(gr5cdB{0gM6z6On)T9CO`2XfczK=wu* zDBOGlYjfYi#@qFvh1|y6I?%pT4>I|UAXo4KHs-y74fj5Pdf`XVDEb7N4?lr+aWm+l zc-{L=U|9G8^ol;hX5@?>BKPPM7?(DKX<0L@d)xu*pLD{8%5Knp_8C-P^ngZHFKAWu zfL2W}XxH=s<#8LBJ#GPur>$W5q!p~5wZhgHZD503U_}iCKYa!6kL!T)tON9)cYtnH zH|SS&!KRuX(0|nphUnPvbvNj~?t{&>ePC174tB5F!KkhW%<6kUudW~T-}HlFeLo8K zfzjJ9VEXP0n7tna^QJ+tulo#^Z+pR^t{tr2A$(&W*fsTo)rYTO^YJU#HV?tJkNx1( z`~_TEzJNpP5V+TW2H$rbu;+aj_%(HbXWLf@{Ll#jAG#puQ#S-R_dr-{4>-1e1E=<3 zaQQq89_@p$sPB^yJ2?gW z_wR>;2M@yG!-wJ6v14%ZSg5q>+uhah|c!k^`1z%^wC+_PdpMF0b8PcWc4p8*4J{>HN-JP*PPAiM~| zFGu(_2rq~5+I$RfP-Z}Y6$6e2AXz6EP@d0#k8l3Q&llqV;-Bkl$fCb!*)N}8bQ%Br zA@g_sh`a`AfD0tM?mt7yvcLJI|1<3C*3GYSWn!e26cH)S{~~|>%Z&L~Qu>R3nYhG% zg2d4a>laA!KUW^f-~9i}@~@v4_*Z!r%Fiq~ItitP6F~>e!}$+09)17f7g@e?<;qnn zSFQdBT7_uks^wz8%Ojp5RtIgJ}D9Xgr*cdUWGP|&Ol3Txi z0bpr~k`dWh*=#j3GBC0-*s{fHi>0L{O5U)rT9^rtW1@{wG?R6K>`WFfUc5w4kR-TP zXtU))2J#Ei(dwCh<+fvziGZ4(fQcTT-ex{MeJg}eHU66)mEF?H#K6eNd@GaJ9+92? zQbTh)qs1m$c=!Z2BY>r`!f*Ks%%T|RrX$j|wzo&!EFx>erG~C1ON>nT^z?*`tq|fb zeswEUa)S%3Y((M}+XZenTVcaZ!q$e14Gk7=+9b4vd7b807BlnEK$p?R{4C)lEB=C$ zD|Mcn7B5+{#7LM|Sbyj}aoXC}9&rzh3U$=c4%*4oz9 znt4*pt2VzLd0svW*qNVW%18W&+5ZWWVP-}vq9EiN$SUvWXKG#V`+0R7PX z{pS(rl^)HG*xu8O!GBGccHj|f0rbs;1C4*W1t9uc9 zbaX7D=vahfB2bagWpZ;fUEoIiZs-=dTqc}g#a|7KVlrc~v2hEC1pp1b5R&>gKl7Hl zU&gbZBxHp}BhI*a!VqLWhtP!*{mJi1bHB{IK3RdWSX|tJc|stR2eU}%6i|uGewW7# z)d89Zl7E7b6@($~_<1^TfC)f3pmS!P@}K@yy@@ECbF}az_F7goKj|~3iN8$sR z@=^JNkaQ+@;yi+x11b?S15eLC`TYa7pCcr*;4*`m?1_m-k0PxaWig*Y6uPFUK#qTv z-xF2H?VRk%r;@pu{E0`A_JRpZ_@l>;GZ83* z`2x*fA%Et!$_wN$FMm;XN?Oio#LpCe{P=MuKNAoei}*uPwfi^uoF{X0PjW5rAHQ=4 z<-nBxH$UwU`TnT<94GVge)AtYj`*4K|KMltcD+D5yhFpn0#E1V=jWZ@clgMWTeoiA zzJ2@Fts_ScA3C^ye@skdWLQ`za~Sm(?cBL**G`=qH*emc>_&#b9=`=bN4~y3h`hYK z5W{co|Ev84+j4$vV_qHm_b{?^=QnWuZ~wn`9VVIAP2!)g>+kE#?BvPFQIPw~PGv!X z-}Hx_>WOUA-9A3x>xZ8A(`euq6$2q5AwY|c1=KQwe+&jR6GlP6NmnG=W0lCs>#F4pbj}099mHs+J&Iva}V}m$iXL@h4D6_NPW^3uu-h zSKbbL%3eZn`BT_PZv!nl;(Ls2O=NR!e9{5h^mfofcH>5--TBMr+*Z>D0rV;es;Gw0 zr!^4%^aVscuZHkvH4s%<1JN&DfyeWA5K~nL+v`4o=bL8mu4@L}iqD|;^fTyJc7oo^ zF4$b%1G=wzLBFOOEUMf8vP1QeE$Z~D9b9VL!KAJi%-;0=Pj;yB+X1jZcBttuJJb!? zp$qnBKiK@XKRQ8X6j)_H!o;KSA}Z zo(~vJ%D`x`0!CK=Fut4s#&A9`zQ6g)&Qe4#pRrtl#){FvNHXe;^H2+1>jW_Djqu@o zz&N4|j0;x4$PEC-;}b|`J}|o9{EbIrE0(Bk($KhVG8)Ux<3xCFgh%7b4Dw=NXe$H5 z*$NmD0l-K*0gMOvzHi5YwQ3dfeR+t4nVGNp>*w#H{7M%PU%f_MU0p*%Vcv!;=;EGH{Y!p7Ft&Q_C;Zw)`c7_Xp~snIV*S;y3LGY30C0xA1;R9iDM8#6Nt zV^kDVorUu2nwskqSy|-lsZ@6+QK`sCu(2^W*Ih{8Vs2r{$xe`S_wex8i9Q}o4qICb z^DV#9Eo>Y(+41roNPA%_D7$td4tpfxSGtLf?KZUAr#wpZ@!2 zD~p1cw>Ro#c6&29Jlv6hUy7QUt(_yvU)kHo#}|>0&u@lb=~j03C>^i7+jkFb4~@3R z7s)_npxRk2$hWeiIwSl#lpKVJ$>2So!`6lLt@iHDY^*Hn_RxZZLxRz&IhyZoZ?Bym z_SV1CJ(&3`?g=Zrla$n|HzYb^+|U zQvm+i_aNk638>EN7@t55=^acR!=r!>p5^aA8;w;n$Fx-{Iza1jJLsS>Y0c+dp#7qI zejMBBA>d6Dgued-5ltv@ z7nozz#tq1!@o6*UEE)&F0*y~^eg6fvqH$>ESoCjQAQ<7okzNsv(wxy4Gjn{I+BpIq z-3#N$%rRtd)X)1c$B$7zzh`g)XsCY=VvZG~{yYMW5yzmh+Qbtlpy1&{H0Jvp;yw(( z{!fE&5a|-vKYfM-q(huUI>c$DADrzUfpnxBT>Lr;nVo%b>Dw4QX+>}3q@l-Q$!M}h z9(rt6i{^x(n@?se1}%m%I5DgsoDl$L7$@L9BOl%}{_bb_(dL#bEYb518nVrkk^P*9 z_LxTaUBhV4O9metLHKlp&p~)P!q+2w*B|&b2v4y@uP31a1SO+)nB)Q6MEHtffHw%= zgz&8h--+=32>%V?zyE<(T!Zuk)M(L=Zjp>;s^lFo*P!qgDFRMdNl8IYPFh9^^<)MzEVyMG5UD6B$fB^JJS$EF=?UtpD(e*t zQCN``C%REfYoofFilQ-qu@ag9rmdr+t*O3YJu|$XeUrG3t}aDeLrrBqtiM@;qNhjE z-Z&oy6Qiw`7FJdk=4PgU%#Zlp`2FubxBQ=XWMww2$TDO_p7Y)tI{{4Y8!rQfWdpv*Q-l-g>x^FeRgG5u@erjW9p4fmxWydoS zpTQk$5>1IXkw~FON0kQ-P6*Ih2MGJNAM!c6ly!-?xB06}PFJ>HJv}}2!_{wYn|*6) z@T10vmZ^Bh;2k@6*p@P?8H{zZvY_bt=#CSIT?yXxQP?)E5g6{+A(qI72`LUZXab6= z?7+1@tJV-m1+CXy{>IpLfo9iXx*QZVp2e8Gr*dOx_P;*o=1{1TdNZ%I=UlH zk;z|qSki7>7Ud#Oh6MU{ze$^|t1(ri)&+y+MCi|RX?8htR7)QQcj-BatJj-N6@4>5 z^-gqTwH?@SN_L!)Xd_*|MPowe?6NbHAG7_{9=v@O7$N|?nt40!sB?W|H|*7^xBhzR zh{W671k2mJo3h{M+27p!N<(a)YRas9?t$uvY}R92_SbJv&@r?~nY+%nm|^{ZLpwiJ z;K3bhr=8^DtB&%9wGH<-#*{`_2&g!w7Dj8`zaw^Q`TOge9P7O0>)I6NE;cC+vT*D! zFI>->QPg{ptDxnUd1H(|?@WK|rJkOtNJ8JE_*+kU9HU8FD*X=}J{C_6^HsHdu6#A_ zp^Rge&1aIK_wWPP(g*m=qKtYM=cG@Q&$%_}ZyMN(-PKH;M399PE#+2&)B`PGKQ z%9^-yCRYokNT1SIh5O;&i}^H{gXykZRoQb4S^N zJf+CRIj-9Hz{ZPL%J1*c+)CCG9!?3$$+OYMU#@ZT`*@GT zuWV|kFnT-&SZwgesCB}1f$vv<(rSaOZ$YQZLrPwq=HlWSp6pC|QeVH=_Y%_VnOPcQPIN*pg zGjqwZb2;RE@2$w9;z&>Y5%YeN#pF%PpS7uH7}%P7*r=Txw4ONWRdu@Bvex9lqvF85 z(uZvXL$y{BK*3ny{lTl=1mCDbeR~fm42=J{&z|;Li$&;l)c%}Y(nqCP+X9u*vCv1| zlc~;0uXT&@n16K07;o~jDHF#LvF$0U730VJ55zqVh{&$4b5$o?HOt*Ut+_#;hr8d%o%olXiDW_`VPF{Fo&ut~ud86x=Ou7Vnu(*~_A)jm&#`UAe~<(B1CkkN_# z`D}pnZIKj>Kh-VJSvtcys!>v0`n<=-FV6c+*_-%}E1EQZIhUI5AaJ)4+J{oRqnqze?ZHz%2xH=~gda971*wKM&Qx>zLvv>wgl3f|v~RvY!YTh`Y9HlPmb7+b>tiZ}Ox)gg?;e$lHT+f@}}!+B${h&e zj3&&A#HD7btHlg*af6L^gRmdtll{z#?xi;@iwT%ICk8krV|gqR(ykU5GIlnk>`tW% zwtqpdyMLC;(Yd%@4dcMGV^<84G;m}kXF_bWLQib6yO?nHN_Ulk{4q|^J(4AftgS`C z2CA6Dap@yI`5Jq-trW~BE9aaiEN)p(TmR|9CC`A7oK!`pB#jqEvK zuPT`rT8Y%8O?ZqOzYz{SEb-+4jVT7tiP+C&P{hLe_41DiE+<^-Q`}n(zUq8_!wrdD z5&QY@)KmD(mvY#WTFpM3B|F%kKGRVNbgM`;U!hrs8Y^1Yj1O%MmvpLvb{Cl07}&!- zFjl#?!vT!bRV6@Xm@)QX?#O7#By1zS7}><@FJm9{?ee#$drfa9W+rcS(S*BM*P%`- zjsudkr=_As65S5i-A?Uld9X)hX6W0Tg45_+?DU{DXb#f}!|}0`@ps-OIbC@9(rEH! z#*EQ}!9}3Pa0`^v^5o?neZT3E{aafu7UPGwXaJ{q;d`OUQRCR+_C$&XM16~F+h5N3 zS-wj?Ozu;me>`u@@cz8*l|0!*l4AaS#%Nl3P5lb+&@Jrv>L0t&=^FGM=mcW|Ii8X6 zVfuEJBFo|@vSy6J*}5m^>o;Zw@I z4>atvJh0H?wZ|{vp9(JuFgkG>Pd8-2 z!cir<%?<0@cCn%nron4|+K|~_OTZLU3ehBnBBXc7o0bvd2Tc4h8AyB61H_%oB$`$=9`Z?g_`a|0tg(p@**T4i|7YR_puzb^L zq}#EaZf$K{v3dDkRq9N7m8wVO3KPO)z+|;1l{J3 z)lXvg2!f7`lB>~o?I9k?l@?M3_7qvMMOW2 z?CM5#Q_Ouqu6P+r$O&<=(a*^dp}hj?W;{JAqF!dEMU)VSW?C(V;m*0KOsd>yX6Bi} zA`4cErevlB`#m0@61Llek`RtsmITB0{6NscV?AdUp*uWehSZ9Jf`Z|Pwb48|E+wa> zHn6h#mwerD$%lj%Nv&V1EL?(P$982zKZpm~y`%T+u$iJ)3Rqr_RM=w)4X1G&S}o~n z0S=d7l7kn`rN_qClJKyL*n^{et{_g{cl)U#_%ex@R6aM68^0-@hokXe%8`!ree9U9 zAUoE3F)|0u^bcMN;olO^nFp*saQ*A_i-J=U_wsQ+Bs7Finb+7ied`&WXsf2o@?aW7 z3JKT#et-Z?`>LTRY-B~G5TxCBD*Sd6SG!7X_@c-_QmWY4=f#rz9}4{?HY%WdOqd;@ zC%@^~JJ5KcK6{Ic=?{H8-I@>BiIhk)pa!pD(baD)jZ_^NONx#f{1iL+IsU`qlCh3B zy-k}o-6;e@JhR$;SZwgKABJbfYB%C2>)T#6UX`pFt~{stzN)m8k9Z>sbdcL)&{h5566I2gN6U|)$NMpQ^e+Gjyeub; zv^|IhhfBDEQx1~B{G#Sf9F`&IY?$(CCdv5jRC9g7K>P^1#|5+C6EM6=h{d@CpxZ#y zbMo=a(?K(%G6@+eI)xtI;?g^A5kFdzu}Y^Ci6nidx>+5@&z^ZVB^LCWdT>$UneGn1$V z81HZJRoBJk*|K6i%Z@?bcUG^VxTqv!{n>1LMY*@p#S*F+TWps_(vO)~-DKn%rB#aM zZ(Es4m&!I_5Hg=XgFDcEi>eaX5{YMlc1mWoG^)$V!thyoY#WShWrgR9*R0^mjN23! z`Vf!BvS_H%qnt|(_AcumITt}V>R~nGnd-mM67^~kkLBu|T-+`IGq9QoYisw4^es~L;NuP!I`XJcE`OWqJN zOW1rC!6Pp8y8r%&6Bp5fyu6Zc18$6nwbEWEH|?HM-a_JK=^#e3mrcF$=WIEkrrrL^ zKV}{38oaDwb1AT{R`ercoCj8&ztcB*MSl9mt0NMA-lsCMZ)KMR4k${5u4PP3_)Rj3 zgY#8JY&RJg?Xx&xFg3S-@mRiljptoQXlUC-~JYK|cdH0qhLGk z<+~kDxR-v%>U}b3@3%`Ha@lNbWiw^gFXqUQiVp74iRE#+AVV`)TWrwzWI3>It1f?l zqYEmy#BJ5^b5hvP1}sY`hhp~02N>s;PbQXAuSLmueQ67*6!SgYi5qT-;kStqUH?>~ zl5c;;?BK40GivASHnvTfKj400Z8;FNX!m_V5jLe~toV_}?%l+M#?C=bTK5fJ6@woV ziW=RAdCfIJ#3co*MQxr29-_}oCm%l<5>leIAZOoOz7 zo~mQ4eV~Y_K+X+Dt()7n&;#t-KBz$t{?1Z3YT50!0kGUHA1KuIi<1fTxwJVA0-R&0 zWvlXH*-nKOKU;rjqjn`~aJ$5I&f}<34PWXg|55sFhslf*J6?~K9^S+i%lb7gJ&nSfc%B%wHuPt z?{AEwUj~X0?Bdx%G}uvDi;ZlG8wu02Q4^GflW~;hi5-r(`jsc@dk510 z*&mKDwToGO;q`cLL&<}=nEE2R@k{t+Zjd*-QQi+q`TSJNhpw(i_pfK=p;V+vizjU6S0l@=B=8coUY zbcqq>qKAW$I7y;cq6m-eTFLx(d{{T;bqA(mPVJ-ECY=@D;F9Xr8lp1$FzR@A?AFWH zK2C3EdaI=e82edP4T^QP5goW7xrdN_0&EeE?6-1vj%OubNe*VDTuxs&}T2Ae34 zhTcwd9l55Xkp7T1E|Hlx<#w1+z6Li;sEUF|D}=aMMl1DIGo_%e%b+2HcXWqXEuOOX zpq(taG^c~4q*X<6;1|rkSu1vD>(rv`)i2c)PJLWCR_@fv_cRnY%?F$Dlywh4kivp( z5(P%B@*+VI4k;GgE1)MGoM}p$6?XEd<1Lx4d)ihWs}mWJpmUK6>hHCilak#A-()FI zPJJNPrTUOOnk||LCc9c#u}j?y>Xlt(Y@I6;b9dY3Dcys*_iA%yuC3*|H<#YA z^TFKSmRsk<)E)2eg4#1&eQ=~G*+sI6ixwi_jD|e7e{75!t0Y|AZjRI0WB!V#;fmx( z+kgiB5#8Hwzh_Dm>Qs-Xji&m{J{x@nG_Tq2h;H#D5`jvx6ATcgxZ$a2`Ij(!AB3i5QFLE+^ z)=`P${LY$OB-C!K4X1`!H-n}Kj@o!;WDg}!lQO1;=MdF9y~2v|DCxXI$dW+uE2Fzg z*aC{TUMr8vF?Ng{O4nywrT%c$2qjbZ+GMQ`A0De(22hMvQ{T_39bm=sRiOlDA<3-p zTBS?bPXT#|RrKT+$@|Z9NOi${M~ELJ_Sjl9HGK^HdH9^J&!}vFpj7OsH7!mq18y3V zl8xDQG*1>fZ7qM;1t2@uh7j&X5{}@>rzW;Q$8)uU+%NwFq6K`oxlQ=;8L8`wvhpPnliiE zAP-irNVvezNY4cJNny&NT>n`wgUoo$dEfN^&{= z%C|*D?a{F_AEw79WIg8ME6TZsXO^@L2Et&h05|usYe44;xwuGmrLfnuW*9fz1J@o_ ztUi|@3&LyPx;^?D!rmu-g1~+>ygEVnM!i^pOxa_7c6+fh9dhbJjqGxtVGB7C?j1|a zTu%u@^&OEs30&Q0dCWfFkJ4U(lQ+(ptTf-hufDTi4O3zdJ5NM=*HxCqj{oH29yvh% zPzwA|dsP{`sm9vgJ|MCkf9_rdPKYE`;v%k|?^ne(ctql>lS+4QgU!2XLKo-U%N@Hg z=@=ml*B-zF_f9;M9S zT4feN*IsFM7ikIU9{iaA^VB*nJ#C2~p4P zmeg6CtP}03O7|t^3DdU??Z`}`e!6M|avrizuEY zJ;gzBoc5$PydF#1sWVjBc_v2~iUzE5tcz#EvvFn@YYftVcz@#GmUhO0^M&t3_c-xX z`H}bKZ=G4T<#R+1D~hqNH^tR)<48`RTTZ|h5nYp!Du3x5mCA{Et;!_AJ04_9W%3Xe z@NuiIzgkAx5c!TM%%x0weCb{7l^F$H9ii?}o|(fty8LIS?&Ul#U+?dQBcm+{C+n8s zL4Ffj}6ddcpgKrPq#&XT#WGYq&nzqkr^l*_HcxBGZ-Q`Yepsj+ko6l#{` zJi*wxzAC$~8!&mY#;x`8jPHF;RAD@&bz)z0I>tUx$y9=;f%xyM!I2+yxiR~_ZNy|q zmgBa=h$Qd5%DLw-OBjQzWRMzNxVE<`i z8gKi~p56ZlJ@ic{Dm^XbB3-b(hY#Y5ZDj=C$9Ke0rf`-QxJWo^C#k6>>ZefjyYZgm zT3^Z75s7sHYMZ%l%4KVRI`w3qUp_9TWZ+tCtz)cd{ONDB^~>3b^zFP^r4Y>pIYOAr zo>u?P?mWB$Y1lUgPVwS*qXsN7>e#JKmTSIzV)yLyNt{t+!+<)^*?Z zBx7cuA3jyDnGLFzR}vl?NF60$!8Q`SQ1H_|`}&#^Z@xaM-vjsfq&i!a&RMr zOv1OvzF|u!g)3XRDLDmE*$VHm&jISkh;`lXyO*DqPa&Cf+|4e_IXY9NxJKG%dTfVX z^Rz+9V#xEO$2zP8B~y+b529Bj3wO)Dmq#h6Ar*watCN=PsIkgRECy?1rr01YM;}UB zCbkdYrvXC)5|% z`xEojaZ>?kLmHduwRK#4=%oVK&^b|j%yey7&)}Rjk8L}FR2fu}lYS)kmBCfH)v4uM z8`@4?GaQg8u0)!2r9>wv)fIy9gV*d`zC=$^gU5dK24O;iBr*EoQb;XBn^2MZa7bq*`yC5~-j&BvNg;<+xn2A}J*+NMFzJC&o#~7K$qesF`xd2Ptd{iK2Wua<2Zg zWsKD<*O|Fp}NafoEVP6gJ9Rn9E-@$P@$bU;>hVK^vH>t|gWj96*!d+5zq_qnBbHxkasm!YN zEd#nZC-(RfpZh9mP-;blv@B+wX)a1Ay1Q9G2si912~W3%ZAEWnIKf3eJ9)XV!()+G z{nGshPe-L5C#>KxauIN|zxcSz!me6IC$y&TN20fk%IrGF*h@m0{c!c)kf@_rXTiBEb3hx`cSHD$azDzrVhBVu`Ag52pvb{k{vw`>KqGH2=p~h>QbADB03*iGE~X zaS^ef=WME9(jBht_=JEb7atpq1n>BgYU4k8zCp-pj+Xu7S}YzTpW_emzKCyknq|XQ zb7H94puWwOjb|0nT&UXxmoGv)F95czIJ8HnGUy-UV)=;=4pk8LTBl*0Lj|vUrC5i- z&vd6~b*&R2xu-{OPux8}=e)F84HJf-AG^-Ya$w&Y%Xsd@Q>^UC(#l_m4u+LD(Ya$6 zg9tLvq;~a9|5~zPs2ySdtyS^$TqVu?I#X`vlg?BlL+Hb9fhvEQ6!vYCuGo?!G(;@O zhE9y_8~-(;kh${I0Av;m?E3v7GKWBON{TR=TkrB1cvxKor zoD%tVPgKr#M-V5YhqB8Y%Xg<{w5{11pg$91Hti*G0+nYrqyxV`{`5})G|orW-OX}4 zlxV1n{+2;fG){PpPxcR_T7BAT#h~BaVYXZFWH0HZ;TemO6h`24w)#ywQrpsB-<(iX z;qac>K-FAKdxgWWI>9PCEKl)c#ttIw+(Bh@uiH&gOA@`*5a{MdaqCqIRqOipij!Xa z$eg^QBKGS0^x;l-4+~H08PC-j9o4tWWvbko#x0Vr=Mr*>AX=0%K(uUQ4Z4fpOCeue zl3coosVCpfCAew+pnky*9(9KJA)Srvcg5exgy5ccG;gGE8#(jqeC%!hQr&OXGqYPp z$L+X7q`O`F72Y2k!F72lPrCDJ`@@QUi%>~r*ohlo2|a8nC$LD~GQD#G zXLJf)3$))#72vfT4cHWSmYBE5uMje;q#p~z#Vtef*9EZ$2NiJm7OjBOmyET?5BqVHhldjn4w$qtk_zU%rWU zelz}&A-B0?w~0ZG?CxpqK(|j{WT#9yU2LWb8UnI5%9Q&~o9NOf$J!0b8`_|06He&` zcJ$%W?DaQHzfs2;^zGv!(c)BW@4g zr8S&yu)8&59#bCX;-N|{C$!Vu1zA|M*}bfWHAg_&{w)`|5@J%~G6y!r)vkb{cqLYH zF|2sYUDztX((}$w+s-H<+TvP$VC7wW;+nv=sI8?h{cknONR@}_?>$F724r#0s9~i6 zR+dX5bvf;RBT)C9`|75+?LzH^>0tT2Gm``Ep@v+x8Xp&=m@e*esXg}KN?d|ZjME*= zYeRLkho&*5Se_=YGrf zRA-R-8BW8&=>VA0ZJ$0<+)NZUu}j=j-F32Y+ep^T?W;51iL+odB5tCX_9;%NGRNFL?@@j2%%)JXvQx6@5IHtFG5YQ8VjzU}`D;z?j zTX-j*i*kEei7WBR$N33i2SuQY4JVNa2@$w!22Trd_d_)m+1HAvC7M_rCJkI`c-(wM z@oSw-%s3EbKW9>&4o*pu4HthZ6gN()<300|5ZBc}HB!w)Dp3ewE%bT7 zA*TzU+jc!6S9Z$&Jas_}PKGB4Hx$W~os%kgmo`S~59(2PxV1_m)j+gc=@S;kO~+%#YIj$)}{;LudVOjz>2fT=yt(=EX8G} zAk$wOF2;V@o_w6;)FHe*{{(MW=fjLlpF`#%}0EA2W{6XZUCUYfAoh?{D>j4jjE?fG`vAf7wO zJ3^aB%H;DyQ-xCeAweB=>(`T5OIP7_#cMM;e6iyC0oyuCz?~bL-HD!ZR+K>VP1!>f zwdDySAQLTih7FB^oImI7VpiCqLQC_}gp9jiDhDq2c|^pxYv%YaLk-WVuWRlUkM3ff zwYkBejFl15uA;QQZg17hAs5U`#iEu{bS<7D%;Fq`r(`YJmp+TO_6-)LXpj?;g>~4D|@+e zI~9dztXZC z-<~85%SNgx%5c?>VnWXqW$AFm4&D=@^FcoUMSdF`<}M1Mi?&@V(^Ha4t})vCVNO3) zds;_U&1>C{)D@gEFfo+@Op15M)4goza4%v)4jk};JdieNoFm*Y*@P&`< z0|Sw)Z-e?<*SmP(B*=0_H;+P zI6F7%YgSXiRp-(lXmlGG^%Cg9lyW?o6F;OKWH2618!3U8{eilawu!VZc26O?7-Z>i zuK>z2&OuE&O@`9mZ@r)*kUu&{*&vY6zLwjaTGTK zIS5BNC#ZQRuC=CiaH*l4K6@THvmHNUo^%L50GY1#Jzql)#a%k;x)i@H`~C(KyUe^# zM-+RkcXyM7Srp`zugTwvHz|xw2GkV^hA$^y>*Q@Of$Oy|73dFg zVnxR*&gRlbgkj?j==(A_EOm9@)sMW0aRtiGs&tpQiX8lr4Bukug7f8yV!2zVu8fAc zD-!fuFv+Bu21gv_Bbo*@aIlI@DuJ{&MB#h_Q-xd!9$eHP$3J_DVpD=?U-30u2Zj<` ze{8t^_S=dc&4c`IH6s2_W-%$FOQds8K6o@*sY|($y%ZjqF6B&j9P_KXz=lU-9{47n z!nSuNFq7YoPjEF6DrVe^FX3g?f1`5#nsZM}sa2G6_(ilZJ=)1P^USEhkg_U&kq*wX zcRMIH@DR;|FYB>WCS90+y!M>7{a^GBtIUmVY zx4&ekquzCEX78Rcso1MxMv52<7NSF-Om3iteR)K(bW}a|i7tl)dMl#$!y$E1F@0*S zCW8eJI*T^kS%fd%PtgczVQMBH1S@uS+d27r^MJ- zq4O2x@ZuO3*dMptC3jIA-X%^?W6z^HesazANskAQvdf-#wKB?TZlw`_O6!Xvpe`H4SeSsWW_oT{M|?Hum3W&m6Ga zcI1xTEyFy;mYU;>h9~MK(owJblOGb%Yjb%n7vkI&qY6zraG^AU9X)CoC1eg(Q@A0? z0I15)5(U?M>UEBP!RmZoZVd}IX}-WGDRp(S_z}@8=9T(j!^wv-I=%R(o8ppY0@w4O ziQ1Vkz8cCb&ImZDms*>`cqhxr6-BOS1n6})8|6b|91)%>Q2K9_Kh{tha^4|9F4&c~ z**^0-&FWcNeYf(IO7BhcDXXr=IMkMwNCRuCD@1a+vEmPNDHWXLz+@y@IB>&!rCiC9 zUox(6<@MF!B3H1DwPwXD-o9g+)q6bHYNWs^`l0yV-Gxoy_F&u8CZkB)d$c+0Rxav| zrP0fLl^@aA*0r(69sPk%AQ75)*oHQs|Aq8ph4kmb6mHCYq6Can#jeZ|OCVB*n|@zb z$t@QfI+M~N8*ejq^<&bps@`{%e0NVt=%@3xzq!u>!CNie}{Lk?Vfk!lz_WG69xt@v}) zcWTBpzt>es!3ILq1RVA3+y^Rbi=C2{KdWZ%E%VY9}=^>EHcY|A>) zTd!neA|DF8)2XgaN(%VtZ8Z_cdfQ(iMQ5As&&h_;5BWH|gUGlMh0Hb_-HcOa9P8bO zrQ02(EF(A^THb>{gR|_8*R=ue-2?qy&(e-hvYD3z)q97w&!kj-{_-%fXEPC$^0#w7 zXf2Mnmc!n6tWBS}F8P7CG=ZCYQAJK#EB@G}an~yyZfYS%-ZP%*?RdW%=UW!OY|Vo` zEHss=6kFS=`z{x@<%&s;;l{P#93LDybpk`p#ZU*|KKN$W=c<>1si#Za8#gos3|}L`i92#~6@hIUdTB(QQu6_kAr1QJ zOC&o+V3Jt8?Dbk9nSw3ZrC$rb#=X37{$%v6ml=b>?B91>O}!(rVjMp%3*_Ut^;d-H z$swz#Ygo{0R2$+bm$+!dseVYi46sDqAF*A0g4eY2!bN0F=SM=5IgYl{Ht$|ewarLI zE(<&&TFOK5k9?~-DIHFo#g<2Kls0^(v>7L71Uv2LL75&5QzLnmtb?i;ac3O;kZwOu z?*P7r$kOZiVMkCSzK9Rsia&E5CM)kkk=A`M?8B!=&TRGuQzhuKiP@f4o4&!E9T1}p9z6Z|gxaF9+*UDm+_0## z`f5CU)3?06F;!P%&*uvq{4DhE1l7F?aOp@nw`AFvn$yni#tRZob6WBKiz3giSY0t) zo{7VJX7gj5zMDOnd|)K4BeOH8TwXis!RT#Eqtpxu4mIIYo~TtUfb?=6V>i~5KGc1f zvsUz5w+E~mFHccrAA;p!u3=#!7z$!4b!k_ATBK;wUZrg^1=RoJMMB!1Mr^q=B`uYk z9wpeL;6nNy4@J5Oxa1A==5E^A9{+}!TIs1LV{O70bvCRRVA-<4GWTqQ&l1?O!96Bo zj*KR}-CP_(9r>v5CGWgs%wPE6;jbdr?8EBE9&1l&vUUsAqh1o}d1wis3nuWykbYxX z92X0DomvxL4@>h9Hzu9Ud=9hgs3Ot&*R&P?u_Rxk<>~P*9ue5>}0iA zk=NSOwX~@&j?Z~KfO~sm)DK+uKbc9AnffqwQ)THzo!z^n)eV2HbqP6Xd=*Hzy8(@U zO)-5yOmL3Pd3D?+;fjIxT!Y@Nmtxj=dl>gDW3QA;*qLitTpKm`p&uqT>6JlfZ`YM( zC1reI#pUb{-?yLiihWfPNW6Hr=tcRr3?FSYy^Ib@+}0wjDic9P6A#^!uh;mx>#kn} zN(qwZhBXdf8LpKT+{}qJ9er=F@G{m>gR%Zq?9W!IL*yh8vM4467cFsl?!9(RA)oy8 zi6%WB(zRD>_pzL`Z*qzb3`=!Oz znce&nWBw)4Ne_spYjfG?f}EI(QH*tY44MkW4;^X=B-pqK)XvY0s^2}Oa~#KwM$?nT z&GuvWwOQy2oS3d4i?fvu@9W)EyTO^qkJqyc*K+z2DBG-nw*D^A9ETU(;>rw(6pUKs zazHNtlGiid^xo%`>uF3{^W~n`T;(2Mm;10%sQqxt7FZ>Cz`ZDMDOg`3T5?sLoiVZt z^d*y6@!2?NKUvB}5q!uM$~CF}j94_T39Rvj6^~08BHYK!pImvHJ5wQ4mbrPf`bAgQ zsz+b<_;0Tslhnz0#FOp-rzsiK?o)%s)#gL4td5rUwXZ5>y2ITWFAlk%X;OZ!U$H4R z{CmYwHQzJsAc2?f-%v2~$>1G%*>!;jQgesAZQ8Y#!Qmr9J=ej~bn*qhjyO_edzx{x zK?Xt&0K10}<%R2o(Sqx%pMtoP2pE=euS$O>-=4;X_a@~Lk3Hrn>fXWN*x*;17(8Zs zbH;t*vY%f4p%e?o()8$|hM@n^-dDgynRWj^gt2R}#>!fZu?9*>h>8LtDqvs-DvhAP zAfbQ(_S);Z>KbdTfr1^NqJ)H`bm!0lf>>*e-v2rGnP(Uf72n+V_h0-RpP6T#=ic)@ z=iEN$UWJ*9nVzAAiDP1v{Wb>tp&Qoe1%G0;$(ZLa>c4#&IA>ZJG4VMWMq7`jkn_GgmcNNuAL#*3Wbv zzb5xgZ&i5!+nB=1-`O9qIYS1FWJTVzs@Qr>$BZz#-8tSb<^OW zcUKJ07+k5TK08?uxnE&h)Eo7STMiehol$7Vn^SbQ+m)COx;=DKPj-H`*kq38f}RWS zZP~bk2!j;nGgsdiCtlsBIKt$xFl=ncUl(5aPPI+u#0CSVcAgSr^o>E!u(rOufuS-? zpC0BT#*fvKyS!D6`N@iT-+}o_$v5xL2E7X%K(3ze$gEqE3*CHu^|x@R2|l5`9l)*XIwAx)t@tfpAHhArNDee656DyapqHoMWZzgJ zyY)PObk`gR{DzEs$z;#`G^E4FN3VZ^!+E@A8yM6P37$1 zX)>FG2k+{?WVFW*b}HKkN<9pk9+qC1xcI}!!J*#fvmAdKD3#Toft9$o!@?g-^VqDg z+Vs+@t(v|`-Sv|NgU!0{R~&syt<8NdT= zrNb_#f?-2Pf&;5MuZzx(D-i`{hxT;Sl#843&8q5{ZtFVxZVLKglJpM0tS$#*yY>7z zRl8Hau8$mJhh+U&`n~HG+o<=$YotfW^k{c@^tyd7lb$bGFEcR0C1T0yu&}EdZN{`2 zx96Q{l$Es2qy}q7cB@tG``4Erc&j-FZ$Bc;i+mfcHX^asuwtmLUS_&wT<>o-yGi}l zCV4Mo|NQ%~^-mt^r`;GkL2rM*GcTMAw%m2IcQt#zDXf$1;?a*RL*_n_)`(9yY@*0) zJ$m)e9`EjaGukt@J^60k-P)n+GqruMGv~uI%~pq(y)t?{ulO8~A$Y;hAe~d3&x}$?AE2s9nhu ztYyYpTIJndb=&2KsH~$g6?(8 zj)PY@TB*$Y#_4>W?eP(e{M)Ddg&i5IQH3$l!+y)Zm8Gqq=UvoZV{-1zl#*qJ%0<<| z!*m&4B~N*o1+cP`W45Ksrbxe49bYe8A|2?!&u|NFlWQ82!tYz==!p~EmwE)Klz;a~zvd8~*OQ;qR=UmiKlboHx5f9z`~CN> z-Q(=5x4_NyJNK;WpD*wHQ(t%0*ZHt+t=hIDy1g0isQCeN3~8V*Z5Ng=D;qX!aGQRGs-5@e8mSpt>W8@< zvJ~vl{#DB{eD&FH<$qsMmpb>!+-bbI5lyj?}8yu18-!|C~;uCPs`k*N)G8bev?1*lYdTD_3hTpEpw|B41 z%rY>)uM-qHYKiY)h5XFjLv~*7ZCV*|dheQNYm%ClwO8Jh~^+8(~M&ld&} z{;y|^nH_M#e|3 z>IvQF3I`cA%+t+}>(%~+h72?9+2MU3n6PQxnGU@en=Z17U8I&AuU&ih`49R(FKoLy z;aZ2}#RdKfGgf(>>QdN=nR=G_Y5mjluZM(~X@b{__6k`>_v~S>IaYyp%tJCpo$VRg zX{fZtZ_>p%Tx?i)#^K+$<`09b+*%I7O(vvoe)y|VeG)plVNMA z3%vswvSd$Y>bJ+nd2js?wlgt9JGqZ<-=KQmNjLUoo{%n1Z7^|pBAna*$?JnFf6E=) z=Iug(|HwbjuAM$O)QM-RE5mqpurMV~dhNQI2eh3V+-B>&bI`3*Z)b*K99kB|4XOFrk5U68dk{e0(|F2?Um|9msn z%B%AZ^JxL~zie}p`eTEh-=01uOMKVMhP^m-G|eIW)`_<9^Qs+J=q1kXEE{NMef`^x zUORTRbD4JBqi#aiq$%BwWGqyC{L6r;fdlT(*juWn91unDQ#oTGFfB)U*dbk#6*(91tfo4I&o*LXGShRYxB_rHIm#Kf!9ChupjzCC$$;RaY`OL{Sy>0EfRqwKel zB(mCOsJq$t~}PTrmDU>BpZ_e{H+r!@TY{zFo{;@$-^h5le>*d;Y758Hu#)QfB&k z=x&31dijPO7aA*uC|$|Os@x0CIk%!^YuYS0c65{a?Ji?vGjfy9ITgHpE*kIo(K(Z>Is$>Dd#^S+bMewNj1zi-j9d#eOp?>&9t zCYX3p_JcQbu{+rxOily6?Qyub&6NBL)Z&OP1nl z`AZ}Jcbf!d=aY2W%{SLp@O!Mz=(YEaF6KEFtnPM8TI)vIk1`|2TzaAQgB?j+20kj; z(pxeERzI0kwz{lORjK!fd#S^_{_5K4r&8x_`{k^RoT^vGjPa3*nxWO<=G)sBHGfIk zSo&y1Pvr-1tdnLv*Y%q5hpv=wYM;Ja5=Rxto<6FzMa5cv*oFDa$F_G5_Rw;-a7t7E zbL`FHobN+dsE6bZUKjLZfCn(#`MX1FADOBZZ<1TH=;#)!7ti%i%Lw=il@oqj(_nb} zb?uF-8lxUoR?TK)1s7x3nrbKU7mEN{z>wJUhd{ckGze4{ye?R+)6df;nCJ1=j#@mSv4?KlbPZbNAmbN z9e2JMaCzx(TMk5hufFo0XTu*o-S@TI+DrACZO5(lrCxQ9cP1}dE;#i8YN{t@4lB%; z#f7TgXutD@iDO@-jU$G~?>zL9XW!m>=iVK<8kw5~vHb%JmpVs0ewg&9F0=WY-lh$u zMhfF#r-g6E722oHUZ3kRN2u8jw`I7!{h!>1A@vaRI{N+WQk%?*GyO{PLbmW)3y_1!{=JBEfmFN2~U4$tIuXzVI6gh{EC4R5_K9G$QPc^`VmmRz>55H&)$$Szq@is>6-B$4|R5YX$G~ zCQWX;!e`?Aq78g)r);&(y;o0LG?+XsiP|~hbzp7zY;~9N+FMT(7y8afP+7gc!91j9 z%bn}C&r|0z#ac&*8UOgkiYg10x}!Z+R!lfpaZn&sKlEE~IU^rwCQ0?~O8IlE_%{3d zcs7(oDQjCkI=lanW!*Dr-DQ(bNHY&&J8vCwRQ1j}>8+F6<&2UBbq)CT(fgn&W*-i_ z&9}6)8>aQ%`mruk+;K>!W1Tw&t5w}fZ&&U3OLF)=sld8Y*aKtY{*9M!T6(SDGEI6% z&H2MJiEVEl%xlm&@*e6&Qgm;%Ov2J*+uj^D)atun?Yt|(rT5M}n6YnL+Q!{eJBMdi ze0SSZXspxuBorl?4ar^gn1uVQ%LokhLkb=3N#)tzDl~I zdY(IJUFrVNzOv!LPk$#*f*iM=YOt%XI|5po`27{7@H>7g*WXCB?_bY1 zFC+nf=Kq;74=kxG6TYTUCcH?PD0s`i_cA?cZ)e$hFsQ@}1-&g?-+Auk|K3yOy^4C} z<#>7wL<{I9Gp4UrC4vBv-9P^+qW0^ z{5d0I>3aJvZ_@R~WslQQiyYi0>hK28c*$VxZgSJVz3bxf-MrkgvVGmc^VZiSjVnlD^

K$T!?V6uwiV^7_7cvy)GuAD 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 + + + + + \ No newline at end of file diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index ebaa8994..241ecf97 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -1,9 +1,9 @@ using System; -using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.IO.Compression; +using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; @@ -13,9 +13,9 @@ namespace ZipExtractor { public partial class FormMain : Form { - private const int _maxRetries = 2; + private const int MaxRetries = 2; private BackgroundWorker _backgroundWorker; - readonly StringBuilder _logBuilder = new StringBuilder(); + private readonly StringBuilder _logBuilder = new StringBuilder(); public FormMain() { @@ -54,7 +54,7 @@ private void FormMain_Shown(object sender, EventArgs e) { try { - if (process.MainModule.FileName.Equals(executablePath)) + if (process.MainModule != null && process.MainModule.FileName.Equals(executablePath)) { _logBuilder.AppendLine("Waiting for application process to exit..."); @@ -71,52 +71,93 @@ private void FormMain_Shown(object sender, EventArgs e) _logBuilder.AppendLine("BackgroundWorker started successfully."); var path = args[2]; - + + // Ensures that the last character on the extraction path + // is the directory separator char. + // Without this, a malicious zip file could try to traverse outside of the expected + // extraction path. + if (!path.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) + path += Path.DirectorySeparatorChar; + +#if NET45 + var archive = ZipFile.OpenRead(args[1]); + + var entries = archive.Entries; +#else // Open an existing zip file for reading. - ZipStorer zip = ZipStorer.Open(args[1], FileAccess.Read); + var zip = ZipStorer.Open(args[1], FileAccess.Read); // Read the central directory collection. - List dir = zip.ReadCentralDir(); + var entries = zip.ReadCentralDir(); +#endif - _logBuilder.AppendLine($"Found total of {dir.Count} files and folders inside the zip file."); + _logBuilder.AppendLine($"Found total of {entries.Count} files and folders inside the zip file."); - for (var index = 0; index < dir.Count; index++) + try { - if (_backgroundWorker.CancellationPending) - { - eventArgs.Cancel = true; - zip.Close(); - return; - } - - ZipStorer.ZipFileEntry entry = dir[index]; - string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FilenameInZip); - int retries = 0; - bool notCopied = true; - while (notCopied) + for (var index = 0; index < entries.Count; index++) { - try + if (_backgroundWorker.CancellationPending) { - zip.ExtractFile(entry, Path.Combine(path, entry.FilenameInZip)); - notCopied = false; + eventArgs.Cancel = true; + break; } - catch (IOException) + + var entry = entries[index]; + +#if NET45 + string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FullName); +#else + string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FilenameInZip); +#endif + int retries = 0; + bool notCopied = true; + while (notCopied) { - Thread.Sleep(5000); - retries++; - if (retries > _maxRetries) + try { - throw; +#if NET45 + entry.ExtractToFile(Path.Combine(path, entry.FullName)); +#else + zip.ExtractFile(entry, Path.Combine(path, entry.FilenameInZip)); +#endif + notCopied = false; + } + catch (IOException exception) + { + const int errorSharingViolation = 0x20; + const int errorLockViolation = 0x21; + var errorCode = Marshal.GetHRForException(exception) & 0x0000FFFF; + if (errorCode == errorSharingViolation || errorCode == errorLockViolation) + { + Thread.Sleep(5000); + retries++; + if (retries > MaxRetries) + { + throw; + } + } + else + { + throw; + } } } - } - int progress = (index + 1) * 100 / dir.Count; - _backgroundWorker.ReportProgress(progress, currentFile); - _logBuilder.AppendLine($"{currentFile} [{progress}%]"); - } + int progress = (index + 1) * 100 / entries.Count; + _backgroundWorker.ReportProgress(progress, currentFile); - zip.Close(); + _logBuilder.AppendLine($"{currentFile} [{progress}%]"); + } + } + finally + { +#if NET45 + archive.Dispose(); +#else + zip.Close(); +#endif + } }; _backgroundWorker.ProgressChanged += (o, eventArgs) => diff --git a/ZipExtractor/Properties/AssemblyInfo.cs b/ZipExtractor/Properties/AssemblyInfo.cs deleted file mode 100644 index 186c0a02..00000000 --- a/ZipExtractor/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ZipExtractor")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("RBSoft")] -[assembly: AssemblyProduct("ZipExtractor")] -[assembly: AssemblyCopyright("Copyright © 2012-2020 RBSoft")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("91de558c-6db8-429b-a069-c0491dcff15b")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/ZipExtractor/Properties/Settings.Designer.cs b/ZipExtractor/Properties/Settings.Designer.cs index fb0c0153..a5b4ccd8 100644 --- a/ZipExtractor/Properties/Settings.Designer.cs +++ b/ZipExtractor/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace ZipExtractor.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.7.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index b54bd852..abcc298f 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -1,149 +1,55 @@ - - - - - Debug - AnyCPU - {91DE558C-6DB8-429B-A069-C0491DCFF15B} - WinExe - ZipExtractor - ZipExtractor - v4.0 - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.1.0.0 - false - false - true - - - - - - AnyCPU - true - full - false - DEBUG;TRACE - prompt - 4 - - - AnyCPU - none - true - ..\AutoUpdater.NET\Resources\ - TRACE - prompt - 4 - - - v2.0 - bin\Debug\net20 - - - v2.0 - - - v3.5 - bin\Debug\net35 - - - v3.5 - - - v4.0 - bin\Debug\net40 - - - v4.0 - - - true - - - ZipExtractor.snk - - - - ZipExtractor.ico - - - app.manifest - - - - - - - - - - ..\packages\ZipStorer.3.6.0\lib\net20\ZipStorer.dll - - - - - Form - - - FormMain.cs - - - - - FormMain.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - Designer - - - - Designer - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - - - - - + + - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + {91DE558C-6DB8-429B-A069-C0491DCFF15B} + WinExe + net20 + true + ZipExtractor + RBSoft + ZipExtractor + Copyright © 2012-2020 RBSoft + 1.2.0.0 + 1.2.0.0 + 1.2.0.0 + ZipExtractor.ico + app.manifest + true + ..\AutoUpdater.NET\Resources + ZipExtractor.snk + en - - + + ..\AutoUpdater.NET\Resources + + + NET45 + + + + + + + + + + + + + + + + + True + True + Settings.settings + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + \ No newline at end of file diff --git a/ZipExtractor/app.config b/ZipExtractor/app.config deleted file mode 100644 index fcd0c937..00000000 --- a/ZipExtractor/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ZipExtractor/packages.config b/ZipExtractor/packages.config deleted file mode 100644 index 7042cfcb..00000000 --- a/ZipExtractor/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 5254c3c4..68a29177 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,7 @@ environment: my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true -image: Visual Studio 2017 +image: Visual Studio 2019 clone_folder: c:\projects\AutoUpdater.NET build: off install: @@ -12,12 +12,14 @@ install: - cmd: nuget restore - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.snk.enc" -secret %my_secret% - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% -- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:Configuration=Release-NET35 /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:Configuration=Release-NET35 /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:Configuration=Release-NET40 /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:Configuration=Release-NET40 /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net20;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net20;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net35;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net35;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net40;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net40;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* From 88cb85b68e1563ef26e0511f2baf667b8c50fb89 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 24 Aug 2020 12:10:06 +0530 Subject: [PATCH 06/93] Fixed appveyor build issue. --- ZipExtractor/ZipExtractor.csproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index abcc298f..0600420c 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,8 +3,9 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net20 + net20;net35;net40;net45 true + false ZipExtractor RBSoft ZipExtractor @@ -18,6 +19,7 @@ ..\AutoUpdater.NET\Resources ZipExtractor.snk en + none ..\AutoUpdater.NET\Resources From 3ca49fcae9058592daaf65c08e95cac3ff34c627 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 24 Aug 2020 12:47:49 +0530 Subject: [PATCH 07/93] Now keeping AppendTargetFrameworkToOutputPath to true for Debug build of ZipExtractor. --- AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 105984 -> 106496 bytes .../Resources/ZipExtractor.exe.config | 2 +- ZipExtractor/ZipExtractor.csproj | 6 ++---- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe index 74a8d5678c29a5b6d5ce5e6ac02779eb4abd0ee2..cb1e7c6320763a264fb33278d7ca9fdd5b7e8d47 100644 GIT binary patch delta 13117 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 delta 12745 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 H`-J^pJSG`L diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe.config b/AutoUpdater.NET/Resources/ZipExtractor.exe.config index 3b43e650..0a3b1551 100644 --- a/AutoUpdater.NET/Resources/ZipExtractor.exe.config +++ b/AutoUpdater.NET/Resources/ZipExtractor.exe.config @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 0600420c..11f954aa 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -5,7 +5,6 @@ WinExe net20;net35;net40;net45 true - false ZipExtractor RBSoft ZipExtractor @@ -23,15 +22,14 @@ ..\AutoUpdater.NET\Resources + false NET45 - - - + From 3d0a795a153f5e4c8dfda4d5941372eb16b7cd76 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 24 Aug 2020 12:48:18 +0530 Subject: [PATCH 08/93] Removed net20 folder from Resources. --- .../Resources/net20/ZipExtractor.exe | Bin 106496 -> 0 bytes .../Resources/net20/ZipExtractor.exe.config | 6 ------ 2 files changed, 6 deletions(-) delete mode 100644 AutoUpdater.NET/Resources/net20/ZipExtractor.exe delete mode 100644 AutoUpdater.NET/Resources/net20/ZipExtractor.exe.config diff --git a/AutoUpdater.NET/Resources/net20/ZipExtractor.exe b/AutoUpdater.NET/Resources/net20/ZipExtractor.exe deleted file mode 100644 index 500e36b090a9b2d5f18c6c6f5d050bd47c475b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106496 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�IGCsG+?eXkVL8!nQDzLAAAi@1o~2F9oqsc2CfeCrlFcXhYN8eBcnfRKmoLk zm|4MKcGOLw$_L{_6@mlT1;-?qk--WYEp(X{5fG)$&~;PckV$TIU@IuJDjf_97?BWr z^aCG^#H1R`EC~>-aY$lfb$yt`eaGNPl~{Ps5hi-AE=vLNPygDZ-smvVDPb8=XLB$? zOlKl?x-yRph^RtCDmhCFuSOa;Fge_OQjSuYhhpRFDSzV?UZ}w|NIXMtYT{dXHb-H2 zYQp;0&uVqv9HrGljK*fyPp!%f;*UT8qe`6*{fUP$g4LFy{3Sb4IZ~S`KZ1yydXax2gG^|2_-N|!YiQ6TtPbh zH%9QOpND^=CvhD`F04(kdv{goz^(N2Q4(3Awj85B3O12ia3QD{J1U+CW0m1zh0EBBi6qKi}YvGhkD|6a1##C zz>GQcR*u$ca+%8SuAo$=JH-qt-ShX%6#}lHi!IS<~8&*fKP=?7g1J>8f0$cBLb$5^rE)pA0 zga&8AO9t@cbWo*Ba&!=0&7~`$0lXrHh=J{)Baj48V1zNyOGUE1t<{+fkFazS%yCAa%uy-^D&t{|ha$A;u#&<{MMhvE4{p9L0o`7g?!v73 z8wi4vWT6w4o0ne%?38%2Ozj6~HD2|lrt3va)iIK%*0)UrNL4V>5x-NYla$K-C{_(# zsmg$IrYq`WmA(YO+gpzW2|Fru`Q5ZC{iX)iN?0zGnybvuf-lRaLQu$J#4!jKs|JJO zMU~!?smyqWDw>SCjZxi#2QO`4MQ)%bK^WmS$@(?EAH;)P%|KYb>N>$)|9CB9jJg>O z4;?HJnLTlW^e7+=6nJY1+zr{HdWji1iE1c1r$Cp5a0|G{Uz`5QmLX=$O?Ev_=x~T7wT~LPQ{rhhOHe_aH26oghR|;!Ut7C4F00R6k)eK@FlW zCIF`<_Ja}fbEoJLj0X}DeQaU6YH&Yhgu&FsXd7OHmp|AYFo@Tx@NNQ&id_}Ph+!z; zNkTuGh$F_~tyLV*Heks=xW1}3?1Fc{n|6_l*=f%ty?bjo~`nguE;wfY=1 zj`fCx5)=GmlsPa6@Lt=nU1OwXpq?mNrOe6DPZ7j+ct4gCL--+(tw0cCfEo~9(*(cJRG|UgCV|1dYE`$ zvIZhkfFHusXB`oCmU@!3f`0vAnCO-0l9vJ8A^L@>Gw}9{EKPG15ata-I$5jAMV(;f zPIk#8ppXy}u2L(sMVL2m!zcZ)GbCZ);Up6&^(l}Hr?6y1+y*{NT#uQBQ&SDDjn^QU z7<*3>CZdltd52bi3Z2Fp)mV;F%iQbhvN>gGJS^sNR}}f!kn! z1}A7$1HnwOc)5uu8Zx{im2h1uM;C&;y}hFXyu#q*|Ix0HSKRPfx z%0D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

K$T!?V6uwiV^7_7cvy)GuAD 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 - - - - - \ No newline at end of file From f0ebde4d4d6c6abb6d0485984542be3b5e5e52fe Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 24 Aug 2020 13:18:58 +0530 Subject: [PATCH 09/93] Updated nuspec file. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 15 +++++- AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 106496 -> 106496 bytes .../build/Autoupdater.NET.Official.nuspec | 49 ++++++++++++------ ZipExtractor/ZipExtractor.csproj | 4 +- 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 3319d18c..e6b40ad8 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -17,6 +17,17 @@ embedded true en + Autoupdater.NET.Official + true + MIT + 1.6.1 + AutoUpdater.NET + rbsoft + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. + https://github.com/ravibpatel/AutoUpdater.NET + autoupdate updater c# vb wpf winforms + https://github.com/ravibpatel/AutoUpdater.NET/releases + build build\lib @@ -39,7 +50,9 @@ - + + all + diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe index cb1e7c6320763a264fb33278d7ca9fdd5b7e8d47..e572304a4beee59cdafcf584f4bf843659d8f649 100644 GIT binary patch delta 41 zcmV+^0M`G2zy^T829SsXjBK%rT5S;4CRD1iap6t4$vb@^ul2rz^li8FZ2=52m}e96 delta 41 xcmZoTz}9epZ9)grqKu7QQMm#dHftLB7w9=I4Hv045M3eO{3Un$mt003BLH1a5Ig_? diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 9b73cf99..95b4e248 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -1,19 +1,34 @@  - - - Autoupdater.NET.Official - 1.6.1 - AutoUpdater.NET - RBSoft - RBSoft - MIT - https://github.com/ravibpatel/AutoUpdater.NET - false - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. -

Add auto update functionality to .NET applications. - https://github.com/ravibpatel/AutoUpdater.NET/releases - RBSoft - en-US - autoupdate updater c# vb wpf winforms -
+ + + Autoupdater.NET.Official + 1.6.1 + AutoUpdater.NET + rbsoft + false + MIT + https://licenses.nuget.org/MIT + https://github.com/ravibpatel/AutoUpdater.NET + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. + https://github.com/ravibpatel/AutoUpdater.NET/releases + Copyright © 2012-2020 RBSoft + autoupdate updater c# vb wpf winforms + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 11f954aa..82572694 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -29,7 +29,9 @@ - + + all + From e0480e2bb64f1e2209dacde85e3c4ae30912d892 Mon Sep 17 00:00:00 2001 From: ChristophHornung Date: Mon, 24 Aug 2020 10:01:07 +0200 Subject: [PATCH 10/93] Update README.md. (#397) Fixed some typos. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 274052ba..d0dd08e0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ PM> Install-Package Autoupdater.NET.Official ## How it works -AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the information about the latest version of the software. If latest version of the software is greater then current version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the update button to update the software then It downloads the update file (Installer) from URL provided in XML file and executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application directory. +AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the information about the latest version of the software. If the latest version of the software is greater than the current version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the update button to update the software then It downloads the update file (Installer) from URL provided in XML file and executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application directory. ## Using the code @@ -148,9 +148,9 @@ AutoUpdater.Mandatory = true; AutoUpdater.UpdateMode = Mode.Forced; ```` -### Basic Authetication +### Basic Authentication -You can provide Basic Authetication for XML, Update file and Change Log as shown in below code. +You can provide Basic Authentication for XML, Update file and Change Log as shown in below code. ````csharp BasicAuthentication basicAuthentication = new BasicAuthentication("myUserName", "myPassword"); @@ -245,7 +245,7 @@ AutoUpdater.UpdateFormSize = new System.Drawing.Size(800, 600); ### Change storage method of Remind Later and Skip options -You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you don't provide a PersistenceProvider then it will save the values in Windows registy. +You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you don't provide a PersistenceProvider then it will save the values in Windows registry. If you are using .NET 4.0 or above then you can use JsonFilePersistenceProvider instead of default RegistryPersistenceProvider as shown below. From cdcbc2d552a275107626d1695d5306217ee22182 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 24 Aug 2020 14:00:25 +0530 Subject: [PATCH 11/93] Updated IAuthentication interface to support more types of Authentication. --- AutoUpdater.NET/AutoUpdater.cs | 5 +---- AutoUpdater.NET/BasicAuthentication.cs | 9 ++++++++- AutoUpdater.NET/CustomAuthentication.cs | 14 +++++++++----- AutoUpdater.NET/IAuthentication.cs | 5 +++++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 05f08ee4..bf3bb67f 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -674,10 +674,7 @@ internal static MyWebClient GetWebClient(Uri uri, IAuthentication basicAuthentic } else { - if (basicAuthentication != null) - { - webClient.Headers[HttpRequestHeader.Authorization] = basicAuthentication.ToString(); - } + basicAuthentication?.Apply(ref webClient); webClient.Headers[HttpRequestHeader.UserAgent] = HttpUserAgent; } diff --git a/AutoUpdater.NET/BasicAuthentication.cs b/AutoUpdater.NET/BasicAuthentication.cs index 2c52397c..b9ff985f 100644 --- a/AutoUpdater.NET/BasicAuthentication.cs +++ b/AutoUpdater.NET/BasicAuthentication.cs @@ -1,4 +1,5 @@ using System; +using System.Net; using System.Text; namespace AutoUpdaterDotNET @@ -13,7 +14,7 @@ public class BasicAuthentication : IAuthentication private string Password { get; } /// - /// Initializes credentials for Basic Authentication. + /// Initializes credentials for Basic Authentication. /// /// Username to use for Basic Authentication /// Password to use for Basic Authentication @@ -29,5 +30,11 @@ public override string ToString() var token = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{Username}:{Password}")); return $"Basic {token}"; } + + /// + public void Apply(ref MyWebClient webClient) + { + webClient.Headers[HttpRequestHeader.Authorization] = ToString(); + } } } diff --git a/AutoUpdater.NET/CustomAuthentication.cs b/AutoUpdater.NET/CustomAuthentication.cs index b58db8a4..d737d968 100644 --- a/AutoUpdater.NET/CustomAuthentication.cs +++ b/AutoUpdater.NET/CustomAuthentication.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Net; namespace AutoUpdaterDotNET { @@ -12,18 +10,24 @@ public class CustomAuthentication : IAuthentication private string HttpRequestHeaderAuthorizationValue { get; } /// - /// Initializes authorization header value for Custom Authentication + /// Initializes authorization header value for Custom Authentication /// /// Value to use as http request header authorization value public CustomAuthentication(string httpRequestHeaderAuthorizationValue) { HttpRequestHeaderAuthorizationValue = httpRequestHeaderAuthorizationValue; } - + /// public override string ToString() { return HttpRequestHeaderAuthorizationValue; } + + /// + public void Apply(ref MyWebClient webClient) + { + webClient.Headers[HttpRequestHeader.Authorization] = ToString(); + } } } diff --git a/AutoUpdater.NET/IAuthentication.cs b/AutoUpdater.NET/IAuthentication.cs index 90d6d7ed..68dd58ab 100644 --- a/AutoUpdater.NET/IAuthentication.cs +++ b/AutoUpdater.NET/IAuthentication.cs @@ -6,5 +6,10 @@ /// public interface IAuthentication { + /// + /// Apply the authentication to webclient. + /// + /// WebClient for which you want to use this authentication method. + void Apply(ref MyWebClient webClient); } } From 2a2af4e0a2b369664295dbf4077c36f71549ccf5 Mon Sep 17 00:00:00 2001 From: Andrew Slobodyanuk Date: Mon, 24 Aug 2020 11:45:11 +0300 Subject: [PATCH 12/93] Implemented network authentication. (#388) --- AutoUpdater.NET/NetworkAuthentication.cs | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 AutoUpdater.NET/NetworkAuthentication.cs diff --git a/AutoUpdater.NET/NetworkAuthentication.cs b/AutoUpdater.NET/NetworkAuthentication.cs new file mode 100644 index 00000000..1bf7f957 --- /dev/null +++ b/AutoUpdater.NET/NetworkAuthentication.cs @@ -0,0 +1,31 @@ +using System; +using System.Net; + +namespace AutoUpdaterDotNET +{ + /// + /// Provides credentials for Network Authentication. + /// + public class NetworkAuthentication : IAuthentication + { + private string Username { get; } + + private string Password { get; } + + /// + /// Initializes credentials for Network Authentication. + /// + /// Username to use for Network Authentication + /// Password to use for Network Authentication + public NetworkAuthentication(string username, string password) + { + Username = username; + Password = password; + } + + public void Apply(ref MyWebClient webClient) + { + webClient.Credentials = new NetworkCredential(Username, Password); + } + } +} From 974a8761ea1f199b72615b143effc5d1040869b1 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 26 Aug 2020 11:18:23 +0530 Subject: [PATCH 13/93] Fixed an issue in ZipExtractor causing it to throw an error if file already exists. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 7 ++- AutoUpdater.NET/AutoUpdater.cs | 61 ++++++++++----------- AutoUpdater.NET/NetworkAuthentication.cs | 1 + AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 106496 -> 106496 bytes ZipExtractor/FormMain.cs | 6 +- ZipExtractor/ZipExtractor.csproj | 1 - 6 files changed, 40 insertions(+), 36 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index e6b40ad8..9ac7a032 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -14,8 +14,6 @@ 1.6.1.0 true AutoUpdater.NET.snk - embedded - true en Autoupdater.NET.Official true @@ -28,9 +26,14 @@ autoupdate updater c# vb wpf winforms https://github.com/ravibpatel/AutoUpdater.NET/releases build + $(OutputPath)\$(Configuration)\AutoUpdater.NET.xml build\lib + pdbonly + + + full NETWPF diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index bf3bb67f..dc41ab87 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -506,48 +506,47 @@ private static void ShowError(Exception exception) } /// - /// Detects and exits all instances of running assembly, including current. + /// Detects and exits all instances of running assembly, including current. /// private static void Exit() { - if (ApplicationExitEvent != null) + var currentProcess = Process.GetCurrentProcess(); + foreach (var process in Process.GetProcessesByName(currentProcess.ProcessName)) { - ApplicationExitEvent(); - } - else - { - var currentProcess = Process.GetCurrentProcess(); - foreach (var process in Process.GetProcessesByName(currentProcess.ProcessName)) + string processPath; + try { - string processPath; - try - { - processPath = process.MainModule?.FileName; - } - catch (Win32Exception) + processPath = process.MainModule?.FileName; + } + catch (Win32Exception) + { + // Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances. + // This means this is not the process we are looking for so we can safely skip this. + continue; + } + + //get all instances of assembly except current + if (process.Id != currentProcess.Id && currentProcess.MainModule?.FileName == processPath) + { + if (process.CloseMainWindow()) { - // Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances. - // This means this is not the process we are looking for so we can safely skip this. - continue; + process.WaitForExit((int) TimeSpan.FromSeconds(10) + .TotalMilliseconds); //give some time to process message } - if (process.Id != currentProcess.Id && !string.IsNullOrEmpty(processPath) && - currentProcess.MainModule?.FileName == processPath - ) //get all instances of assembly except current + if (!process.HasExited) { - if (process.CloseMainWindow()) - { - process.WaitForExit((int) TimeSpan.FromSeconds(10) - .TotalMilliseconds); //give some time to process message - } - - if (!process.HasExited) - { - process.Kill(); //TODO show UI message asking user to close program himself instead of silently killing it - } + process.Kill(); //TODO show UI message asking user to close program himself instead of silently killing it } } - + } + + if (ApplicationExitEvent != null) + { + ApplicationExitEvent(); + } + else + { if (_isWinFormsApplication) { MethodInvoker methodInvoker = Application.Exit; diff --git a/AutoUpdater.NET/NetworkAuthentication.cs b/AutoUpdater.NET/NetworkAuthentication.cs index 1bf7f957..9a731e7c 100644 --- a/AutoUpdater.NET/NetworkAuthentication.cs +++ b/AutoUpdater.NET/NetworkAuthentication.cs @@ -23,6 +23,7 @@ public NetworkAuthentication(string username, string password) Password = password; } + /// public void Apply(ref MyWebClient webClient) { webClient.Credentials = new NetworkCredential(Username, Password); diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe index e572304a4beee59cdafcf584f4bf843659d8f649..7ea4a4107e3a4b68dfe77866ead2177a0baee56b 100644 GIT binary patch delta 1057 zcmZwGTSydP6bJDCH#@UCJ2N}(%!ry=Y8Q8HTQBTprkR>uNywlZTG@jTRJsX^30t^} zVqyhuLk1DC4+dS9D5mK8AQD}u9wHy3d=i2ldMF8r=$lJI(7+t{ednAx-^a`(r`*XY z_xPym<&Q1tb4y8O`sRLl_9Czo^vVFY1DE?Q5KS*5T_mcf$Y7aYH&eiNdNbf~qzgz! z075MS?vF+pQ^k=sW49+j+<6*b=OcQ8FFR;f@CqM03<#Px=%=-cH&Ftx!A^5YU=p;S zP4H%5Xiz+g5Zgmjd77B7NuhRl6z^hB9!{A<)S!b_Kl!he&ou>fTIiYw5tfCp+Pg5 z!c)ppw6C#Cm*lwFRj3ZzdLTzof!s=4dd@Mn0xPR+iT*LF8;eS_A>6l=!ZClE4I@+Y zxAFs9g|C(-@WroiH7Je1oSy=tlyed5b2QbZ?Bb%h8#NnKI7zh@nOa*T%3-b+Sx48E zIJXX&Iy?7PIm@lbul2ShHO)1kz24Sx^%l1Q&m3)4r@2PFY5?e8kiv2GBexMV8|>1v z>MpJY;y6^E5YOT-x#4Qxc_P zLa3v04Vq~Tqm9N&?4hv=9mbj6M~nRpr-W>8tFigYp{a0+Kk?Z3-V-NoUJc4TWAw)M maX#Mpht28B^!M>1#;+R-ah43p{SW1SvJhaZBSy>IJoy9NYsSd{ delta 1049 zcmY+@TSyd97zgnGnal3%%Pe4! z2KxB^{mI1;;s+7@m6EU*Q13LBxtSARPx7 zSphtw`4Cqpvikf6Z#Cl^zrs8&g_0jBm2_`vCm;u1w}BD~(Vjr$j1YYi!V~d!4~c|CmF*Sm+?VOF1q0BwZ79 zZKN^uAWSDKbVl;;eI3o+FRSSudZ5Wam<+YXQVwZ(f~lyo)l-&caj2-ZWlHVJTuw!+ ztD{PSw98diSw!07YFJsr`H^<@MA<~TXlqcquRbGP?zY)$PvOUitz6k#b%OaZ{+|+a ztfdX&jsGa`$Bs#5`6BeWQnUfyz|~1z;){W(HLe%!T7fUc4p(QiF}@u8quo}R!2@C? z617h2lp>EX8^tk4ceOZb@ZFVJv{$HsRPSU;;1sEUQaK@t^R_bB8^{SUWE=i(*g-%+o=Q=E?hS6B2-aRIWl zwN~d-{e-v>Zx=dJjhxto#3DyCjqBoK47*xsjET({X#(iG&tRYNT3mv{VyE?lu}*A3 zXS1W5#wsjF!PR$TgeB3p)XF}v1AH7w4A^qEFp1l?9$|>}Q&z~|S@YOiQAX25F^y_1 zs;I_LPjxODsn%gh{=$ac(*m!;8?WE#c(=CjxanBv*0+cGz`;)DF(R78N%>Q$&7%J^ p{nP&r&HU0?&cV!uicRD2FLN0e=+Tbc(~hto)m&vf-|}IC{RNXZ!+8Jz diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 241ecf97..c924a672 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -95,6 +95,7 @@ private void FormMain_Shown(object sender, EventArgs e) try { + int progress = 0; for (var index = 0; index < entries.Count; index++) { if (_backgroundWorker.CancellationPending) @@ -110,6 +111,7 @@ private void FormMain_Shown(object sender, EventArgs e) #else string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FilenameInZip); #endif + _backgroundWorker.ReportProgress(progress, currentFile); int retries = 0; bool notCopied = true; while (notCopied) @@ -117,7 +119,7 @@ private void FormMain_Shown(object sender, EventArgs e) try { #if NET45 - entry.ExtractToFile(Path.Combine(path, entry.FullName)); + entry.ExtractToFile(Path.Combine(path, entry.FullName), true); #else zip.ExtractFile(entry, Path.Combine(path, entry.FilenameInZip)); #endif @@ -144,7 +146,7 @@ private void FormMain_Shown(object sender, EventArgs e) } } - int progress = (index + 1) * 100 / entries.Count; + progress = (index + 1) * 100 / entries.Count; _backgroundWorker.ReportProgress(progress, currentFile); _logBuilder.AppendLine($"{currentFile} [{progress}%]"); diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 82572694..1a0eee42 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -15,7 +15,6 @@ ZipExtractor.ico app.manifest true - ..\AutoUpdater.NET\Resources ZipExtractor.snk en none From cea902946e2a45db927a2a3edfbeb677fed8b4fa Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 26 Aug 2020 19:19:10 +0530 Subject: [PATCH 14/93] Now ZipExtractor will suggest process that is holding lock on the file so user can exit from it. --- AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 106496 -> 109568 bytes ZipExtractor/FileUtil.cs | 151 ++++++++++++++++++ ZipExtractor/FormMain.cs | 44 ++++- ZipExtractor/Properties/Resources.Designer.cs | 24 ++- ZipExtractor/Properties/Resources.resx | 6 + 5 files changed, 220 insertions(+), 5 deletions(-) create mode 100644 ZipExtractor/FileUtil.cs diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe index 7ea4a4107e3a4b68dfe77866ead2177a0baee56b..cacc36155a446d3f5e861edd082f4610b612755c 100644 GIT binary patch delta 16831 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 delta 13755 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 diff --git a/ZipExtractor/FileUtil.cs b/ZipExtractor/FileUtil.cs new file mode 100644 index 00000000..34d6d045 --- /dev/null +++ b/ZipExtractor/FileUtil.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace ZipExtractor +{ + // https://stackoverflow.com/a/20623302/1273550 + public static class FileUtil + { + [StructLayout(LayoutKind.Sequential)] + struct RM_UNIQUE_PROCESS + { + public int dwProcessId; + public System.Runtime.InteropServices.ComTypes.FILETIME ProcessStartTime; + } + + const int RmRebootReasonNone = 0; + const int CCH_RM_MAX_APP_NAME = 255; + const int CCH_RM_MAX_SVC_NAME = 63; + + enum RM_APP_TYPE + { + RmUnknownApp = 0, + RmMainWindow = 1, + RmOtherWindow = 2, + RmService = 3, + RmExplorer = 4, + RmConsole = 5, + RmCritical = 1000 + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct RM_PROCESS_INFO + { + public RM_UNIQUE_PROCESS Process; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCH_RM_MAX_APP_NAME + 1)] + public string strAppName; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCH_RM_MAX_SVC_NAME + 1)] + public string strServiceShortName; + + public RM_APP_TYPE ApplicationType; + public uint AppStatus; + public uint TSSessionId; + [MarshalAs(UnmanagedType.Bool)] public bool bRestartable; + } + + [DllImport("rstrtmgr.dll", CharSet = CharSet.Unicode)] + static extern int RmRegisterResources(uint pSessionHandle, + UInt32 nFiles, + string[] rgsFilenames, + UInt32 nApplications, + [In] RM_UNIQUE_PROCESS[] rgApplications, + UInt32 nServices, + string[] rgsServiceNames); + + [DllImport("rstrtmgr.dll", CharSet = CharSet.Auto)] + static extern int RmStartSession(out uint pSessionHandle, int dwSessionFlags, string strSessionKey); + + [DllImport("rstrtmgr.dll")] + static extern int RmEndSession(uint pSessionHandle); + + [DllImport("rstrtmgr.dll")] + static extern int RmGetList(uint dwSessionHandle, + out uint pnProcInfoNeeded, + ref uint pnProcInfo, + [In, Out] RM_PROCESS_INFO[] rgAffectedApps, + ref uint lpdwRebootReasons); + + /// + /// Find out what process(es) have a lock on the specified file. + /// + /// Path of the file. + /// Processes locking the file + /// See also: + /// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373661(v=vs.85).aspx + /// http://wyupdate.googlecode.com/svn-history/r401/trunk/frmFilesInUse.cs (no copyright in code at time of viewing) + /// + /// + public static List WhoIsLocking(string path) + { + string key = Guid.NewGuid().ToString(); + List processes = new List(); + + int res = RmStartSession(out var handle, 0, key); + + if (res != 0) + throw new Exception("Could not begin restart session. Unable to determine file locker."); + + try + { + const int ERROR_MORE_DATA = 234; + uint pnProcInfo = 0, + lpdwRebootReasons = RmRebootReasonNone; + + string[] resources = new string[] {path}; // Just checking on one resource. + + res = RmRegisterResources(handle, (uint) resources.Length, resources, 0, null, 0, null); + + if (res != 0) + throw new Exception("Could not register resource."); + + //Note: there's a race condition here -- the first call to RmGetList() returns + // the total number of process. However, when we call RmGetList() again to get + // the actual processes this number may have increased. + res = RmGetList(handle, out var pnProcInfoNeeded, ref pnProcInfo, null, ref lpdwRebootReasons); + + if (res == ERROR_MORE_DATA) + { + // Create an array to store the process results + RM_PROCESS_INFO[] processInfo = new RM_PROCESS_INFO[pnProcInfoNeeded]; + pnProcInfo = pnProcInfoNeeded; + + // Get the list + res = RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, processInfo, ref lpdwRebootReasons); + + if (res == 0) + { + processes = new List((int) pnProcInfo); + + // Enumerate all of the results and add them to the + // list to be returned + for (int i = 0; i < pnProcInfo; i++) + { + try + { + processes.Add(Process.GetProcessById(processInfo[i].Process.dwProcessId)); + } + // catch the error -- in case the process is no longer running + catch (ArgumentException) + { + } + } + } + else + throw new Exception("Could not list processes locking resource."); + } + else if (res != 0) + throw new Exception("Could not list processes locking resource. Failed to get size of result."); + } + finally + { + RmEndSession(handle); + } + + return processes; + } + } +} \ No newline at end of file diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index c924a672..59eb4fcf 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; @@ -86,7 +87,7 @@ private void FormMain_Shown(object sender, EventArgs e) #else // Open an existing zip file for reading. var zip = ZipStorer.Open(args[1], FileAccess.Read); - + // Read the central directory collection. var entries = zip.ReadCentralDir(); #endif @@ -116,12 +117,15 @@ private void FormMain_Shown(object sender, EventArgs e) bool notCopied = true; while (notCopied) { + string filePath = String.Empty; try { #if NET45 - entry.ExtractToFile(Path.Combine(path, entry.FullName), true); + filePath = Path.Combine(path, entry.FullName); + entry.ExtractToFile(filePath, true); #else - zip.ExtractFile(entry, Path.Combine(path, entry.FilenameInZip)); + filePath = Path.Combine(path, entry.FilenameInZip); + zip.ExtractFile(entry, filePath); #endif notCopied = false; } @@ -132,12 +136,44 @@ private void FormMain_Shown(object sender, EventArgs e) var errorCode = Marshal.GetHRForException(exception) & 0x0000FFFF; if (errorCode == errorSharingViolation || errorCode == errorLockViolation) { - Thread.Sleep(5000); retries++; if (retries > MaxRetries) { throw; } + + List lockingProcesses = null; + if (Environment.OSVersion.Version.Major >= 6 && retries >= 2) + { + try + { + lockingProcesses = FileUtil.WhoIsLocking(filePath); + } + catch (Exception) + { + // ignored + } + } + + if (lockingProcesses == null) + { + Thread.Sleep(5000); + } + else + { + foreach (var lockingProcess in lockingProcesses) + { + var dialogResult = MessageBox.Show( + string.Format(Resources.FileStillInUseMessage, + lockingProcess.ProcessName, filePath), + Resources.FileStillInUseCaption, + MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); + if (dialogResult == DialogResult.Cancel) + { + throw; + } + } + } } else { diff --git a/ZipExtractor/Properties/Resources.Designer.cs b/ZipExtractor/Properties/Resources.Designer.cs index e8a92fb0..d09e6b07 100644 --- a/ZipExtractor/Properties/Resources.Designer.cs +++ b/ZipExtractor/Properties/Resources.Designer.cs @@ -68,7 +68,29 @@ internal static string CurrentFileExtracting { return ResourceManager.GetString("CurrentFileExtracting", resourceCulture); } } - + + /// + /// Looks up a localized string similar to {0} is still open and it is using "{1}". Please close the process manually and press Retry.. + /// + internal static string FileStillInUseMessage + { + get + { + return ResourceManager.GetString("FileStillInUseMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to update the file!. + /// + internal static string FileStillInUseCaption + { + get + { + return ResourceManager.GetString("FileStillInUseCaption", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/ZipExtractor/Properties/Resources.resx b/ZipExtractor/Properties/Resources.resx index abcb5970..2ac2a95e 100644 --- a/ZipExtractor/Properties/Resources.resx +++ b/ZipExtractor/Properties/Resources.resx @@ -120,6 +120,12 @@ Extracting {0} + + Unable to update the file! + + + {0} is still open and it is using "{1}". Please close the process manually and press Retry. + ..\Resources\ZipExtractor.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a From ab12ab702b4633f20b8b10e574400c75de5910e2 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 28 Aug 2020 12:13:12 +0530 Subject: [PATCH 15/93] Updated NuGet api_key in appveyor.yml. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 68a29177..6739ddb5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,7 +42,7 @@ deploy: - provider: NuGet api_key: - secure: LzLwDiKGUZvNI6CmSFpyjba1mpKYeb6o8SDBejNO0EHY1SgC8xNTuh2nzBWkY7EV + secure: tmlnRHVMwKGZ1B+ua5hte55Ig+gfbTi4DjKzzTiRjNwpy9nYgQpDZCnQZB0H9IdS skip_symbols: false artifact: Autoupdater.NET.Official.%my_version%.nupkg on: From cbd1bd1019d91c2dd8dc8a171e4fe5678334b03d Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 28 Aug 2020 18:07:53 +0530 Subject: [PATCH 16/93] Fixed #404. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 6 +++--- AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 109568 -> 109568 bytes ZipExtractor/ExtensionMethods.cs | 16 +++++++++++++++ ZipExtractor/FormMain.cs | 10 +++++++++- ZipExtractor/ZipExtractor.csproj | 22 +++++++++++++-------- appveyor.yml | 4 ++-- 6 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 ZipExtractor/ExtensionMethods.cs diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 9ac7a032..4ad67922 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -10,15 +10,15 @@ RBSoft AutoUpdater.NET Copyright © 2012-2020 RBSoft - 1.6.1.0 - 1.6.1.0 + 1.6.2.0 + 1.6.2.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.6.1 + 1.6.2 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe index cacc36155a446d3f5e861edd082f4610b612755c..72551efc4ab43ac2eaebcebc93def7e54c429182 100644 GIT binary patch delta 5053 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 delta 5023 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 diff --git a/ZipExtractor/ExtensionMethods.cs b/ZipExtractor/ExtensionMethods.cs new file mode 100644 index 00000000..be9bcf3d --- /dev/null +++ b/ZipExtractor/ExtensionMethods.cs @@ -0,0 +1,16 @@ +#if NET45 +using System.IO.Compression; +#endif + +namespace ZipExtractor +{ + public static class ExtensionMethod + { +#if NET45 + public static bool IsDirectory(this ZipArchiveEntry entry) + { + return string.IsNullOrEmpty(entry.Name) && (entry.FullName.EndsWith("/") || entry.FullName.EndsWith(@"\")); + } +#endif + } +} diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 59eb4fcf..6a6654bc 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -122,7 +122,15 @@ private void FormMain_Shown(object sender, EventArgs e) { #if NET45 filePath = Path.Combine(path, entry.FullName); - entry.ExtractToFile(filePath, true); + if (!entry.IsDirectory()) + { + var parentDirectory = Path.GetDirectoryName(filePath); + if (!Directory.Exists(parentDirectory)) + { + Directory.CreateDirectory(parentDirectory); + } + entry.ExtractToFile(filePath, true); + } #else filePath = Path.Combine(path, entry.FilenameInZip); zip.ExtractFile(entry, filePath); diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 1a0eee42..9ed8705d 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,35 +9,41 @@ RBSoft ZipExtractor Copyright © 2012-2020 RBSoft - 1.2.0.0 - 1.2.0.0 - 1.2.0.0 + 1.2.1.0 + 1.2.1.0 + 1.2.1.0 ZipExtractor.ico app.manifest true ZipExtractor.snk en - none + 1.2.1 + + + full + true ..\AutoUpdater.NET\Resources false + none + false NET45 - + all - - + + - + diff --git a/appveyor.yml b/appveyor.yml index 6739ddb5..52fbb65e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.6.1.{build} +version: 1.6.2.{build} environment: - my_version: 1.6.1 + my_version: 1.6.2 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From f112bca2d0231f48e39413d58e1769320a6d3578 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 28 Aug 2020 18:10:31 +0530 Subject: [PATCH 17/93] Updated version to v1.6.2 in nuspec file. --- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 95b4e248..a879e6c9 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.6.1 + 1.6.2 AutoUpdater.NET rbsoft false From fc443c8b10681bf4b81edc0ce127da659b509e16 Mon Sep 17 00:00:00 2001 From: KK Su Date: Tue, 15 Sep 2020 15:22:59 +1000 Subject: [PATCH 18/93] Now ZipExtractor only checks processes with executable name. (#409) --- ZipExtractor/FormMain.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 6a6654bc..1d9e9be9 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -51,7 +51,7 @@ private void FormMain_Shown(object sender, EventArgs e) _backgroundWorker.DoWork += (o, eventArgs) => { - foreach (var process in Process.GetProcesses()) + foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(executablePath))) { try { @@ -275,4 +275,4 @@ private void FormMain_FormClosing(object sender, FormClosingEventArgs e) _logBuilder.ToString()); } } -} \ No newline at end of file +} From 058f8b56776e9785319f1d61f9910306ca1d4785 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Tue, 15 Sep 2020 11:04:26 +0530 Subject: [PATCH 19/93] Updated version to v1.6.3. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 6 +++--- AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 109568 -> 109568 bytes .../build/Autoupdater.NET.Official.nuspec | 2 +- ZipExtractor/ZipExtractor.csproj | 8 ++++---- appveyor.yml | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 4ad67922..ad92517c 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -10,15 +10,15 @@ RBSoft AutoUpdater.NET Copyright © 2012-2020 RBSoft - 1.6.2.0 - 1.6.2.0 + 1.6.3.0 + 1.6.3.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.6.2 + 1.6.3 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe index 72551efc4ab43ac2eaebcebc93def7e54c429182..be8bd9538b2b4c3bca38631eaa7fba3c2f7383c4 100644 GIT binary patch delta 7412 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 diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index a879e6c9..a10c1b94 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.6.2 + 1.6.3 AutoUpdater.NET rbsoft false diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 9ed8705d..d56a14cb 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,15 +9,15 @@ RBSoft ZipExtractor Copyright © 2012-2020 RBSoft - 1.2.1.0 - 1.2.1.0 - 1.2.1.0 + 1.2.2.0 + 1.2.2.0 + 1.2.2.0 ZipExtractor.ico app.manifest true ZipExtractor.snk en - 1.2.1 + 1.2.2 full diff --git a/appveyor.yml b/appveyor.yml index 52fbb65e..7e31cf06 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.6.2.{build} +version: 1.6.3.{build} environment: - my_version: 1.6.2 + my_version: 1.6.3 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 5fd30a3b15fe7a6cc8d0991cbfdf04751977d911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Proch=C3=A1zka?= Date: Wed, 30 Sep 2020 07:30:28 +0200 Subject: [PATCH 20/93] Added [cs - czechia] translations. (#414) --- AutoUpdater.NET/DownloadUpdateDialog.cs.resx | 129 +++++++++++++++ AutoUpdater.NET/Properties/Resources.cs.resx | 147 +++++++++++++++++ AutoUpdater.NET/Properties/Resources.sk.resx | 2 +- AutoUpdater.NET/RemindLaterForm.cs.resx | 156 +++++++++++++++++++ AutoUpdater.NET/UpdateForm.cs.resx | 150 ++++++++++++++++++ 5 files changed, 583 insertions(+), 1 deletion(-) create mode 100644 AutoUpdater.NET/DownloadUpdateDialog.cs.resx create mode 100644 AutoUpdater.NET/Properties/Resources.cs.resx create mode 100644 AutoUpdater.NET/RemindLaterForm.cs.resx create mode 100644 AutoUpdater.NET/UpdateForm.cs.resx diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs.resx b/AutoUpdater.NET/DownloadUpdateDialog.cs.resx new file mode 100644 index 00000000..6909b795 --- /dev/null +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 132, 15 + + + Stahuji aktualizaci... + + + Aktualizace programu + + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.cs.resx b/AutoUpdater.NET/Properties/Resources.cs.resx new file mode 100644 index 00000000..edf36046 --- /dev/null +++ b/AutoUpdater.NET/Properties/Resources.cs.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aktualizace není k dospozici. Kontrolu zopakujte, prosím, později. + + + Aktualizace není k dispozici. + + + Nastala chyba při připojení k aktualizačnímu serveru. Zkontrolujte internetové připojení a zkuste aktualizovat později. + + + Kontrola aktualizace se nezdařila. + + + Odlišné kontrolní číslo + + + Neúspěšná kontrola integrity, byly hlášené chyby. + + + Nepodporovaný hashovací algoritmus + + + Hashovací algoritmus uvedený v XML není podporovaný. + + + Stahování na {0}/s + + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.sk.resx b/AutoUpdater.NET/Properties/Resources.sk.resx index 9b3e8595..cb4cb1f6 100644 --- a/AutoUpdater.NET/Properties/Resources.sk.resx +++ b/AutoUpdater.NET/Properties/Resources.sk.resx @@ -139,7 +139,7 @@ Nepodporovaný hashovací algoritmus
- Hashovací algoritmus uvedený v XMLnie je podporovaný. + Hashovací algoritmus uvedený v XML nie je podporovaný. Sťahovanie na {0}/s diff --git a/AutoUpdater.NET/RemindLaterForm.cs.resx b/AutoUpdater.NET/RemindLaterForm.cs.resx new file mode 100644 index 00000000..b7c44556 --- /dev/null +++ b/AutoUpdater.NET/RemindLaterForm.cs.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Přejete si stáhnout aktualizaci později? + + + Měli byste program aktualizovat nyní. Trvá to jenom krátkou chvíli v závislosti na rychlosti internetového připojení a umožní používání nejnovější verze programu. + + + Ano, připomenou aktualizaci později: + + + Ne, aktualizovat nyní (doporučeno) + + + o 30 minut + + + o 12 hodin + + + o 1 den + + + o 2 dny + + + o 4 dny + + + o 8 dní + + + o 10 dní + + + Připomenout aktualizaci později + + \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.cs.resx b/AutoUpdater.NET/UpdateForm.cs.resx new file mode 100644 index 00000000..ce350b42 --- /dev/null +++ b/AutoUpdater.NET/UpdateForm.cs.resx @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 212, 19 + + + Nová verze {0} je k dispozici! + + + 489, 15 + + + Je k dispozici verze {0} {1}. Nainstalovaná je verze {2}. Přejete si aktualizovat na novou verzi? + + + 139, 17 + + + Poznámky k vydání: + + + Aktualizovat + + + Připomenout později + + + Přeskočit tuto verzi + + + {0} {1} je k dispozici! + + From 22f6511192a5abd1a523a89baa3184f00fcb3776 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 30 Sep 2020 13:38:06 +0530 Subject: [PATCH 21/93] Now CheckForUpdateEvent will report the exception as Error property in case of failure. This closes #410 and closes #365. --- AutoUpdater.NET/AutoUpdater.cs | 34 ++++++---- AutoUpdater.NET/UpdateInfoEventArgs.cs | 11 ++-- AutoUpdaterTest/FormMain.cs | 19 ++++-- README.md | 88 ++++++++++++++++---------- 4 files changed, 94 insertions(+), 58 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index dc41ab87..cc4d8578 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -74,6 +74,7 @@ public static class AutoUpdater /// You can set this field to your current version if you don't want to determine the version from the assembly. /// public static Version InstalledVersion; + /// /// Set it to folder path where you want to download the update file. If not provided then it defaults to Temp folder. /// @@ -359,7 +360,7 @@ private static object CheckUpdate(Assembly mainAssembly) using (MyWebClient client = GetWebClient(BaseUri, BasicAuthXML)) { string xml = client.DownloadString(BaseUri); - + if (ParseUpdateInfoEvent == null) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdateInfoEventArgs)); @@ -488,19 +489,26 @@ private static bool StartUpdate(object result) private static void ShowError(Exception exception) { - if (ReportErrors) + if (CheckForUpdateEvent != null) { - if (exception is WebException) - { - MessageBox.Show( - Resources.UpdateCheckFailedMessage, - Resources.UpdateCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else + CheckForUpdateEvent(new UpdateInfoEventArgs {Error = exception}); + } + else + { + if (ReportErrors) { - MessageBox.Show(exception.ToString(), - exception.GetType().ToString(), MessageBoxButtons.OK, - MessageBoxIcon.Error); + if (exception is WebException) + { + MessageBox.Show( + Resources.UpdateCheckFailedMessage, + Resources.UpdateCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(exception.Message, + exception.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } } } } @@ -540,7 +548,7 @@ private static void Exit() } } } - + if (ApplicationExitEvent != null) { ApplicationExitEvent(); diff --git a/AutoUpdater.NET/UpdateInfoEventArgs.cs b/AutoUpdater.NET/UpdateInfoEventArgs.cs index 75ea0264..c4779da5 100644 --- a/AutoUpdater.NET/UpdateInfoEventArgs.cs +++ b/AutoUpdater.NET/UpdateInfoEventArgs.cs @@ -22,6 +22,12 @@ public UpdateInfoEventArgs() /// If new update is available then returns true otherwise false. /// public bool IsUpdateAvailable { get; set; } + + /// + /// If there is an error while checking for update then this property won't be null. + /// + [XmlIgnore] + public Exception Error { get; set; } /// /// Download URL of the update file. @@ -72,11 +78,6 @@ public string ChangelogURL [XmlElement("checksum")] public CheckSum CheckSum { get; set; } - /// - /// Hash algorithm that generated the checksum provided in the XML file. - /// - public string HashingAlgorithm { get; set; } - internal static string GetURL(Uri baseUri, string url) { if (!string.IsNullOrEmpty(url) && Uri.IsWellFormedUriString(url, UriKind.Relative)) diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 85738a16..6f079a62 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -159,7 +159,7 @@ private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) { - if (args != null) + if (args.Error == null) { if (args.IsUpdateAvailable) { @@ -213,9 +213,18 @@ private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) } else { - MessageBox.Show( - @"There is a problem reaching update server. Please check your internet connection and try again later.", - @"Update Check Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + if (args.Error is WebException) + { + MessageBox.Show( + @"There is a problem reaching update server. Please check your internet connection and try again later.", + @"Update Check Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(args.Error.Message, + args.Error.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } } } @@ -235,4 +244,4 @@ private void ButtonCheckForUpdate_Click(object sender, EventArgs e) AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } } -} +} \ No newline at end of file diff --git a/README.md b/README.md index d0dd08e0..e8f06f90 100644 --- a/README.md +++ b/README.md @@ -310,51 +310,69 @@ AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) { - if (args.IsUpdateAvailable) + if (args.Error == null) { - DialogResult dialogResult; - if (args.Mandatory.Value) + if (args.IsUpdateAvailable) { - dialogResult = - MessageBox.Show( - $@"There is new version {args.CurrentVersion} available. You are using version {args.InstalledVersion}. This is required update. Press Ok to begin updating the application.", @"Update Available", - MessageBoxButtons.OK, - MessageBoxIcon.Information); - } - else - { - dialogResult = - MessageBox.Show( - $@"There is new version {args.CurrentVersion} available. You are using version { - args.InstalledVersion - }. Do you want to update the application now?", @"Update Available", - MessageBoxButtons.YesNo, - MessageBoxIcon.Information); - } - - // Uncomment the following line if you want to show standard update dialog instead. - // AutoUpdater.ShowUpdateForm(args); - - if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK)) - { - try + DialogResult dialogResult; + if (args.Mandatory.Value) { - if (AutoUpdater.DownloadUpdate(args)) - { - Application.Exit(); - } + dialogResult = + MessageBox.Show( + $@"There is new version {args.CurrentVersion} available. You are using version {args.InstalledVersion}. This is required update. Press Ok to begin updating the application.", @"Update Available", + MessageBoxButtons.OK, + MessageBoxIcon.Information); } - catch (Exception exception) + else { - MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK, - MessageBoxIcon.Error); + dialogResult = + MessageBox.Show( + $@"There is new version {args.CurrentVersion} available. You are using version { + args.InstalledVersion + }. Do you want to update the application now?", @"Update Available", + MessageBoxButtons.YesNo, + MessageBoxIcon.Information); } + + // Uncomment the following line if you want to show standard update dialog instead. + // AutoUpdater.ShowUpdateForm(args); + + if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK)) + { + try + { + if (AutoUpdater.DownloadUpdate(args)) + { + Application.Exit(); + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + else + { + MessageBox.Show(@"There is no update available please try again later.", @"No update available", + MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { - MessageBox.Show(@"There is no update available please try again later.", @"No update available", - MessageBoxButtons.OK, MessageBoxIcon.Information); + if (args.Error is WebException) + { + MessageBox.Show( + @"There is a problem reaching update server. Please check your internet connection and try again later.", + @"Update Check Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(args.Error.Message, + args.Error.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); + } } } ```` From ccde36da06e85b626410f36eed6745e9f2867998 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 5 Nov 2020 11:42:10 +0530 Subject: [PATCH 22/93] Updated version to 1.6.4. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 6 +++--- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- appveyor.yml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index ad92517c..fd3fae06 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -10,15 +10,15 @@ RBSoft AutoUpdater.NET Copyright © 2012-2020 RBSoft - 1.6.3.0 - 1.6.3.0 + 1.6.4.0 + 1.6.4.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.6.3 + 1.6.4 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index a10c1b94..19c57877 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.6.3 + 1.6.4 AutoUpdater.NET rbsoft false diff --git a/appveyor.yml b/appveyor.yml index 7e31cf06..31cd6c5e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.6.3.{build} +version: 1.6.4.{build} environment: - my_version: 1.6.3 + my_version: 1.6.4 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 098e620f89261203e74400e8831089b33e58c285 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sat, 23 Jan 2021 11:19:28 +0530 Subject: [PATCH 23/93] Fixed an issue where setting UpdateMode to Forced or ForcedDownload can prevent app from closing. This fixes #440. --- AutoUpdater.NET/DownloadUpdateDialog.cs | 2 +- AutoUpdater.NET/UpdateForm.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 7dd85dfb..1a3c0f84 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -259,7 +259,7 @@ private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArg { if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) { - if (e.CloseReason == CloseReason.UserClosing) + if (ModifierKeys == Keys.Alt || ModifierKeys == Keys.F4) { e.Cancel = true; return; diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index d3e35394..ee2816db 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -183,7 +183,7 @@ private void UpdateForm_FormClosing(object sender, FormClosingEventArgs e) { if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) { - e.Cancel = e.CloseReason == CloseReason.UserClosing; + e.Cancel = ModifierKeys == Keys.Alt || ModifierKeys == Keys.F4; } } } From 22f9061a5d3f5aa63b99d8df9e3a70c3bbd01d57 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 29 Jan 2021 14:18:37 +0530 Subject: [PATCH 24/93] Updated version to 1.6.5. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 6 +++--- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 4 ++-- ZipExtractor/ZipExtractor.csproj | 2 +- appveyor.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index fd3fae06..e150fe6f 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -9,9 +9,9 @@ AutoUpdater.NET RBSoft AutoUpdater.NET - Copyright © 2012-2020 RBSoft - 1.6.4.0 - 1.6.4.0 + Copyright © 2012-2021 RBSoft + 1.6.5.0 + 1.6.5.0 true AutoUpdater.NET.snk en diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 19c57877..90638b52 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.6.4 + 1.6.5 AutoUpdater.NET rbsoft false @@ -11,7 +11,7 @@ https://github.com/ravibpatel/AutoUpdater.NET AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. https://github.com/ravibpatel/AutoUpdater.NET/releases - Copyright © 2012-2020 RBSoft + Copyright © 2012-2021 RBSoft autoupdate updater c# vb wpf winforms diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index d56a14cb..2d78f35f 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -8,7 +8,7 @@ ZipExtractor RBSoft ZipExtractor - Copyright © 2012-2020 RBSoft + Copyright © 2012-2021 RBSoft 1.2.2.0 1.2.2.0 1.2.2.0 diff --git a/appveyor.yml b/appveyor.yml index 31cd6c5e..659150bc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.6.4.{build} +version: 1.6.5.{build} environment: - my_version: 1.6.4 + my_version: 1.6.5 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 9e612c2606e6ec63824dc384010624cf72c16f98 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 11 Feb 2021 12:16:19 +0530 Subject: [PATCH 25/93] Fixed an issue with download size label on higher DPI scaling. --- AutoUpdater.NET/DownloadUpdateDialog.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.resx b/AutoUpdater.NET/DownloadUpdateDialog.resx index b61f397f..0efed1e4 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.resx @@ -205,7 +205,7 @@ 1 - Right + Left, Right 265, 14 From ecfe76b43ae454aeddc315aefe47f54823f02435 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 4 Jul 2021 13:33:14 +0530 Subject: [PATCH 26/93] Added support for .NET Core 3.1 and .NET 5.0. (#469) --- AutoUpdater.NET/AutoUpdater.NET.csproj | 35 +++++--------- .../AutoUpdater.NET.csproj.DotSettings | 2 + AutoUpdater.NET/AutoUpdater.cs | 15 ++---- AutoUpdater.NET/DownloadUpdateDialog.cs | 12 ++--- .../JsonFilePersistenceProvider.cs | 6 +-- .../RegistryPersistenceProvider.cs | 2 +- AutoUpdater.NET/Resources/ZipExtractor.exe | Bin 109568 -> 0 bytes .../Resources/ZipExtractor.exe.config | 6 --- .../build/Autoupdater.NET.Official.nuspec | 25 +++++----- ZipExtractor/ExtensionMethods.cs | 6 +-- ZipExtractor/FormMain.cs | 43 ++++++------------ ZipExtractor/ZipExtractor.csproj | 36 +++++++-------- appveyor.yml | 14 +++--- 13 files changed, 78 insertions(+), 124 deletions(-) create mode 100644 AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings delete mode 100644 AutoUpdater.NET/Resources/ZipExtractor.exe delete mode 100644 AutoUpdater.NET/Resources/ZipExtractor.exe.config diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index e150fe6f..1fe370c9 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -1,24 +1,26 @@  - + {FB9E7E6B-B19F-4F37-A708-2996190CEF13} library - net20;net35;net40;net45 + net45;netcoreapp3.1;net5.0-windows true + true AutoUpdaterDotNET AutoUpdater.NET RBSoft AutoUpdater.NET Copyright © 2012-2021 RBSoft - 1.6.5.0 - 1.6.5.0 + 1.7.0.0 + 1.7.0.0 + 1.7.0.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.6.4 + 1.7.0.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. @@ -27,40 +29,27 @@ https://github.com/ravibpatel/AutoUpdater.NET/releases build $(OutputPath)\$(Configuration)\AutoUpdater.NET.xml + default build\lib pdbonly - full + full - - NETWPF - - + - - - - - - - + + all - - - - - - \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings b/AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings new file mode 100644 index 00000000..b9fd6ee4 --- /dev/null +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings @@ -0,0 +1,2 @@ + + CSharp80 \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index cc4d8578..82bb57e9 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -299,14 +299,14 @@ public static void Start(string appCast, Assembly myAssembly = null) { using (var backgroundWorker = new BackgroundWorker()) { - backgroundWorker.DoWork += (sender, args) => + backgroundWorker.DoWork += (_, args) => { Assembly mainAssembly = args.Argument as Assembly; args.Result = CheckUpdate(mainAssembly); }; - backgroundWorker.RunWorkerCompleted += (sender, args) => + backgroundWorker.RunWorkerCompleted += (_, args) => { if (args.Error != null) { @@ -349,10 +349,7 @@ private static object CheckUpdate(Assembly mainAssembly) ? $@"Software\{appCompany}\{AppTitle}\AutoUpdater" : $@"Software\{AppTitle}\AutoUpdater"; - if (PersistenceProvider == null) - { - PersistenceProvider = new RegistryPersistenceProvider(registryLocation); - } + PersistenceProvider ??= new RegistryPersistenceProvider(registryLocation); BaseUri = new Uri(AppCastURL); @@ -375,7 +372,7 @@ private static object CheckUpdate(Assembly mainAssembly) } } - if (string.IsNullOrEmpty(args.CurrentVersion) || string.IsNullOrEmpty(args.DownloadURL)) + if (string.IsNullOrEmpty(args?.CurrentVersion) || string.IsNullOrEmpty(args.DownloadURL)) { throw new MissingFieldException(); } @@ -560,13 +557,11 @@ private static void Exit() MethodInvoker methodInvoker = Application.Exit; methodInvoker.Invoke(); } -#if NETWPF else if (System.Windows.Application.Current != null) { System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => System.Windows.Application.Current.Shutdown())); } -#endif else { Environment.Exit(0); @@ -609,7 +604,7 @@ internal static void SetTimer(DateTime remindLater) { try { - context.Send(state => Start(), null); + context.Send(_ => Start(), null); } catch (InvalidAsynchronousStateException) { diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 1a3c0f84..42c7722c 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -102,7 +102,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } ContentDisposition contentDisposition = null; - if (_webClient.ResponseHeaders["Content-Disposition"] != null) + if (_webClient.ResponseHeaders?["Content-Disposition"] != null) { contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); } @@ -127,24 +127,24 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent if (!string.IsNullOrEmpty(_args.InstallerArgs)) { installerArgs = _args.InstallerArgs.Replace("%path%", - Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)); + Path.GetDirectoryName(Process.GetCurrentProcess().MainModule?.FileName)); } var processStartInfo = new ProcessStartInfo { FileName = tempPath, UseShellExecute = true, - Arguments = installerArgs + Arguments = installerArgs ?? string.Empty }; var extension = Path.GetExtension(tempPath); if (extension.Equals(".zip", StringComparison.OrdinalIgnoreCase)) { - string installerPath = Path.Combine(Path.GetDirectoryName(tempPath), "ZipExtractor.exe"); + string installerPath = Path.Combine(Path.GetDirectoryName(tempPath) ?? throw new InvalidOperationException(), "ZipExtractor.exe"); File.WriteAllBytes(installerPath, Resources.ZipExtractor); - string executablePath = Process.GetCurrentProcess().MainModule.FileName; + string executablePath = Process.GetCurrentProcess().MainModule?.FileName; string extractionPath = Path.GetDirectoryName(executablePath); if (!string.IsNullOrEmpty(AutoUpdater.InstallationPath) && @@ -265,7 +265,7 @@ private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArg return; } } - if (_webClient != null && _webClient.IsBusy) + if (_webClient is {IsBusy: true}) { _webClient.CancelAsync(); DialogResult = DialogResult.Cancel; diff --git a/AutoUpdater.NET/JsonFilePersistenceProvider.cs b/AutoUpdater.NET/JsonFilePersistenceProvider.cs index b05ad199..d10307f7 100644 --- a/AutoUpdater.NET/JsonFilePersistenceProvider.cs +++ b/AutoUpdater.NET/JsonFilePersistenceProvider.cs @@ -14,12 +14,12 @@ public class JsonFilePersistenceProvider : IPersistenceProvider /// /// Path for the Json formatted file. /// - public string FileName { get; set; } + private string FileName { get; set; } /// /// /// - public PersistedValues PersistedValues { get; set; } + private PersistedValues PersistedValues { get; set; } /// /// Initializes a new instance of the JsonFilePersistenceProvider class. @@ -57,7 +57,7 @@ private void Save() /// Reads a Json formatted file and returns an initialized instance of the class PersistedValues. /// /// The function creates a new instance, initialized with default parameters, in case the file does not exist. - public void ReadFile() + private void ReadFile() { PersistedValues jsonFile = null; diff --git a/AutoUpdater.NET/RegistryPersistenceProvider.cs b/AutoUpdater.NET/RegistryPersistenceProvider.cs index 6f0282f4..0577bec6 100644 --- a/AutoUpdater.NET/RegistryPersistenceProvider.cs +++ b/AutoUpdater.NET/RegistryPersistenceProvider.cs @@ -12,7 +12,7 @@ public class RegistryPersistenceProvider : IPersistenceProvider /// /// Gets/sets the path for the Windows Registry key that will contain the data. /// - public string RegistryLocation { get; } + private string RegistryLocation { get; } private const string RemindLaterValueName = "RemindLaterAt"; diff --git a/AutoUpdater.NET/Resources/ZipExtractor.exe b/AutoUpdater.NET/Resources/ZipExtractor.exe deleted file mode 100644 index be8bd9538b2b4c3bca38631eaa7fba3c2f7383c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109568 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 - - - - - \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 90638b52..d0610310 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.6.5 + 1.7.0.0 AutoUpdater.NET rbsoft false @@ -14,21 +14,20 @@ Copyright © 2012-2021 RBSoft autoupdate updater c# vb wpf winforms - - - + + - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/ZipExtractor/ExtensionMethods.cs b/ZipExtractor/ExtensionMethods.cs index be9bcf3d..ffd15402 100644 --- a/ZipExtractor/ExtensionMethods.cs +++ b/ZipExtractor/ExtensionMethods.cs @@ -1,16 +1,12 @@ -#if NET45 -using System.IO.Compression; -#endif +using System.IO.Compression; namespace ZipExtractor { public static class ExtensionMethod { -#if NET45 public static bool IsDirectory(this ZipArchiveEntry entry) { return string.IsNullOrEmpty(entry.Name) && (entry.FullName.EndsWith("/") || entry.FullName.EndsWith(@"\")); } -#endif } } diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 1d9e9be9..f3cfe109 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -49,13 +49,13 @@ private void FormMain_Shown(object sender, EventArgs e) WorkerSupportsCancellation = true }; - _backgroundWorker.DoWork += (o, eventArgs) => + _backgroundWorker.DoWork += (_, eventArgs) => { foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(executablePath))) { try { - if (process.MainModule != null && process.MainModule.FileName.Equals(executablePath)) + if (process.MainModule is {FileName: { }} && process.MainModule.FileName.Equals(executablePath)) { _logBuilder.AppendLine("Waiting for application process to exit..."); @@ -78,19 +78,12 @@ private void FormMain_Shown(object sender, EventArgs e) // Without this, a malicious zip file could try to traverse outside of the expected // extraction path. if (!path.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) + { path += Path.DirectorySeparatorChar; - -#if NET45 + } var archive = ZipFile.OpenRead(args[1]); var entries = archive.Entries; -#else - // Open an existing zip file for reading. - var zip = ZipStorer.Open(args[1], FileAccess.Read); - - // Read the central directory collection. - var entries = zip.ReadCentralDir(); -#endif _logBuilder.AppendLine($"Found total of {entries.Count} files and folders inside the zip file."); @@ -106,12 +99,8 @@ private void FormMain_Shown(object sender, EventArgs e) } var entry = entries[index]; - -#if NET45 + string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FullName); -#else - string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FilenameInZip); -#endif _backgroundWorker.ReportProgress(progress, currentFile); int retries = 0; bool notCopied = true; @@ -120,7 +109,6 @@ private void FormMain_Shown(object sender, EventArgs e) string filePath = String.Empty; try { -#if NET45 filePath = Path.Combine(path, entry.FullName); if (!entry.IsDirectory()) { @@ -131,10 +119,6 @@ private void FormMain_Shown(object sender, EventArgs e) } entry.ExtractToFile(filePath, true); } -#else - filePath = Path.Combine(path, entry.FilenameInZip); - zip.ExtractFile(entry, filePath); -#endif notCopied = false; } catch (IOException exception) @@ -198,23 +182,22 @@ private void FormMain_Shown(object sender, EventArgs e) } finally { -#if NET45 archive.Dispose(); -#else - zip.Close(); -#endif } }; - _backgroundWorker.ProgressChanged += (o, eventArgs) => + _backgroundWorker.ProgressChanged += (_, eventArgs) => { progressBar.Value = eventArgs.ProgressPercentage; - textBoxInformation.Text = eventArgs.UserState.ToString(); - textBoxInformation.SelectionStart = textBoxInformation.Text.Length; - textBoxInformation.SelectionLength = 0; + textBoxInformation.Text = eventArgs.UserState?.ToString(); + if (textBoxInformation.Text != null) + { + textBoxInformation.SelectionStart = textBoxInformation.Text.Length; + textBoxInformation.SelectionLength = 0; + } }; - _backgroundWorker.RunWorkerCompleted += (o, eventArgs) => + _backgroundWorker.RunWorkerCompleted += (_, eventArgs) => { try { diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 2d78f35f..f8e0765e 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,21 +3,30 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net20;net35;net40;net45 + net45;netcoreapp3.1;net5.0-windows true ZipExtractor RBSoft ZipExtractor Copyright © 2012-2021 RBSoft - 1.2.2.0 - 1.2.2.0 - 1.2.2.0 + 1.3.0.0 + 1.3.0.0 + 1.3.0.0 + 1.3.0.0 ZipExtractor.ico app.manifest true ZipExtractor.snk en - 1.2.2 + default + 1.3.0.0 + + + win-x86 + true + false + false + true full @@ -29,21 +38,10 @@ none false - - NET45 - - - - - all - - - - - - - + + + diff --git a/appveyor.yml b/appveyor.yml index 659150bc..4e71b021 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.6.5.{build} +version: 1.7.0.{build} environment: - my_version: 1.6.5 + my_version: 1.7.0 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true @@ -12,14 +12,12 @@ install: - cmd: nuget restore - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.snk.enc" -secret %my_secret% - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% -- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net20;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net20;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net35;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net35;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net40;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -- msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net40;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" +- dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" +- dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" +- dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows" - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* From d6a14f88f39be3bb5fa49b51f1ce37b8899dde23 Mon Sep 17 00:00:00 2001 From: HelloKitty Date: Sun, 4 Jul 2021 03:07:00 -0500 Subject: [PATCH 27/93] Treat empty ContentDisposition header as null. (#468) --- AutoUpdater.NET/DownloadUpdateDialog.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 42c7722c..d8373c8e 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -102,7 +102,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } ContentDisposition contentDisposition = null; - if (_webClient.ResponseHeaders?["Content-Disposition"] != null) + if (!String.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) { contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); } @@ -272,4 +272,4 @@ private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArg } } } -} \ No newline at end of file +} From d80321c5d2457b967aadd4dc2a933a65eb3a74a4 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 23 Aug 2021 16:51:57 +0530 Subject: [PATCH 28/93] Now application will exit if user tries to exit the application when Mandatory is set to true and UpdateMode is set to Forced or ForcedDownload. --- AutoUpdater.NET/AutoUpdater.cs | 2 +- AutoUpdater.NET/DownloadUpdateDialog.cs | 9 +++------ AutoUpdater.NET/UpdateForm.cs | 2 +- LICENSE | 2 +- README.md | 10 ++++++++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 82bb57e9..efd5e0ba 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -513,7 +513,7 @@ private static void ShowError(Exception exception) ///

/// Detects and exits all instances of running assembly, including current. /// - private static void Exit() + internal static void Exit() { var currentProcess = Process.GetCurrentProcess(); foreach (var process in Process.GetProcessesByName(currentProcess.ProcessName)) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index d8373c8e..a1e2e6e2 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -179,7 +179,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent processStartInfo = new ProcessStartInfo { FileName = "msiexec", - Arguments = $"/i \"{tempPath}\"" + Arguments = $"/i \"{tempPath}\"", }; if (!string.IsNullOrEmpty(installerArgs)) { @@ -259,11 +259,8 @@ private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArg { if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) { - if (ModifierKeys == Keys.Alt || ModifierKeys == Keys.F4) - { - e.Cancel = true; - return; - } + AutoUpdater.Exit(); + return; } if (_webClient is {IsBusy: true}) { diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index ee2816db..0225dbd3 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -183,7 +183,7 @@ private void UpdateForm_FormClosing(object sender, FormClosingEventArgs e) { if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) { - e.Cancel = ModifierKeys == Keys.Alt || ModifierKeys == Keys.F4; + AutoUpdater.Exit(); } } } diff --git a/LICENSE b/LICENSE index a92bcc40..b0bc4f99 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2020 RBSoft +Copyright (c) 2012-2021 RBSoft Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index e8f06f90..9ecc9ccd 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,12 @@ AutoUpdater.NET is a class library that allows .NET developers to easily add aut PM> Install-Package Autoupdater.NET.Official ```` +## Supported .NET versions + +* .NET Framework 4.5 or above +* .NET Core 3.1 +* .NET 5.0 or above + ## How it works AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the information about the latest version of the software. If the latest version of the software is greater than the current version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the update button to update the software then It downloads the update file (Installer) from URL provided in XML file and executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application directory. @@ -220,7 +226,7 @@ AutoUpdater.Proxy = proxy; You can specify where you want to download the update file by assigning DownloadPath field as shown below. It will be used for ZipExtractor too. ````csharp -AutoUpdater.DownloadPath = Environment.CurrentDirectory; +AutoUpdater.DownloadPath = Application.StartupPath; ```` ### Specify where to extract zip file containing updated files @@ -228,7 +234,7 @@ AutoUpdater.DownloadPath = Environment.CurrentDirectory; If you are using a zip file as an update file then you can set the "InstallationPath" equal to the path where your app is installed. This is only necessary when your installation directory differs from your executable path. ````csharp -var currentDirectory = new DirectoryInfo(Environment.CurrentDirectory); +var currentDirectory = new DirectoryInfo(Application.StartupPath); if (currentDirectory.Parent != null) { AutoUpdater.InstallationPath = currentDirectory.Parent.FullName; From 2b5fc274c13db2368f89e58c83d94a60548bb0f6 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 9 Dec 2021 21:41:59 +0530 Subject: [PATCH 29/93] Fixed #498. --- AutoUpdater.NET/UpdateForm.nl.resx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/UpdateForm.nl.resx b/AutoUpdater.NET/UpdateForm.nl.resx index ebad24b8..c7f17676 100644 --- a/AutoUpdater.NET/UpdateForm.nl.resx +++ b/AutoUpdater.NET/UpdateForm.nl.resx @@ -130,7 +130,7 @@ Herinner me later
- Sla deze versie + Sla over {0} {1} is beschikbaar! @@ -138,4 +138,4 @@ Release Opmerkingen: - \ No newline at end of file + From faed8d4340fbca5c74643a05336e111e60e4244b Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 13 Jan 2022 18:07:48 +0530 Subject: [PATCH 30/93] Added ability to clear application directory before extracting update. This resolves #506. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 12 ++--- AutoUpdater.NET/AutoUpdater.cs | 5 ++ AutoUpdater.NET/DownloadUpdateDialog.cs | 6 +++ .../build/Autoupdater.NET.Official.nuspec | 8 ++-- AutoUpdaterTest/FormMain.cs | 11 +++-- LICENSE | 2 +- README.md | 32 ++++++++----- ZipExtractor/FormMain.cs | 46 ++++++++++++++----- ZipExtractor/Properties/Resources.Designer.cs | 9 ++++ ZipExtractor/Properties/Resources.resx | 3 ++ ZipExtractor/ZipExtractor.csproj | 15 +++--- appveyor.yml | 6 +-- 12 files changed, 107 insertions(+), 48 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 1fe370c9..e10c139f 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -1,4 +1,4 @@ - + {FB9E7E6B-B19F-4F37-A708-2996190CEF13} @@ -10,17 +10,17 @@ AutoUpdater.NET RBSoft AutoUpdater.NET - Copyright © 2012-2021 RBSoft - 1.7.0.0 - 1.7.0.0 - 1.7.0.0 + Copyright © 2012-2022 RBSoft + 1.7.1.0 + 1.7.1.0 + 1.7.1.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.0.0 + 1.7.1.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index efd5e0ba..162a3697 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -161,6 +161,11 @@ public static class AutoUpdater ///
public static bool Synchronous = false; + /// + /// Set this to true if you want to clear application directory before extracting update. + /// + public static bool ClearAppDirectory = false; + /// /// Set this to true if you want to ignore previously assigned Remind Later and Skip settings. It will also hide Remind Later and Skip buttons. /// diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index a1e2e6e2..72b78667 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -155,6 +155,12 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent StringBuilder arguments = new StringBuilder($"\"{tempPath}\" \"{extractionPath}\" \"{executablePath}\""); + + if (AutoUpdater.ClearAppDirectory) + { + arguments.Append(" -c"); + } + string[] args = Environment.GetCommandLineArgs(); for (int i = 1; i < args.Length; i++) { diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index d0610310..da1e1704 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,21 +2,21 @@ Autoupdater.NET.Official - 1.7.0.0 + 1.7.1.0 AutoUpdater.NET rbsoft false MIT https://licenses.nuget.org/MIT https://github.com/ravibpatel/AutoUpdater.NET - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. https://github.com/ravibpatel/AutoUpdater.NET/releases - Copyright © 2012-2021 RBSoft + Copyright © 2012-2022 RBSoft autoupdate updater c# vb wpf winforms - + diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 6f079a62..31d98afb 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -124,6 +124,9 @@ private void FormMain_Load(object sender, EventArgs e) //Uncomment following line if you don't want the library to determine the installed version from assembly. //AutoUpdater.InstalledVersion = new Version("2.0.0.1"); + //Uncomment following line if you want to clear application directory before update zip is extracted. + //AutoUpdater.ClearAppDirectory = true; + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } @@ -169,8 +172,8 @@ private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) dialogResult = MessageBox.Show( $@"There is new version {args.CurrentVersion} available. You are using version { - args.InstalledVersion - }. This is required update. Press Ok to begin updating the application.", + args.InstalledVersion + }. This is required update. Press Ok to begin updating the application.", @"Update Available", MessageBoxButtons.OK, MessageBoxIcon.Information); @@ -180,8 +183,8 @@ private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) dialogResult = MessageBox.Show( $@"There is new version {args.CurrentVersion} available. You are using version { - args.InstalledVersion - }. Do you want to update the application now?", @"Update Available", + args.InstalledVersion + }. Do you want to update the application now?", @"Update Available", MessageBoxButtons.YesNo, MessageBoxIcon.Information); } diff --git a/LICENSE b/LICENSE index b0bc4f99..96325811 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2021 RBSoft +Copyright (c) 2012-2022 RBSoft Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9ecc9ccd..c026e72c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ PM> Install-Package Autoupdater.NET.Official * .NET Core 3.1 * .NET 5.0 or above +This library only works for WinForms or WPF application projects. + ## How it works AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the information about the latest version of the software. If the latest version of the software is greater than the current version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the update button to update the software then It downloads the update file (Installer) from URL provided in XML file and executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application directory. @@ -29,10 +31,10 @@ AutoUpdater.NET uses XML file located on a server to get the release information ````xml - 2.0.0.0 - http://rbsoft.org/downloads/AutoUpdaterTest.zip - https://github.com/ravibpatel/AutoUpdater.NET/releases - false + 2.0.0.0 + https://rbsoft.org/downloads/AutoUpdaterTest.zip + https://github.com/ravibpatel/AutoUpdater.NET/releases + false ```` @@ -48,7 +50,7 @@ There are two things you need to provide in XML file as you can see above. true ```` - * minVersion (Attribute, Optional): You can also prvoide minVersion attribute on mandatory element. When you provide it, Mandatory option will be triggered only if the installed version of the app is less than the mininum version you specified here. + * minVersion (Attribute, Optional): You can also provide minVersion attribute on mandatory element. When you provide it, Mandatory option will be triggered only if the installed version of the app is less than the minimum version you specified here. ````xml true @@ -72,7 +74,7 @@ using AutoUpdaterDotNET; Now you just need to add following line to your main form constructor or in Form_Load event. You can add this line anywhere you like. If you don't like to check for update when application starts then you can create a Check for update button and add this line to Button_Click event. ````csharp -AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml"); +AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); ```` Start method of AutoUpdater class takes URL of the XML file you uploaded to server as a parameter. @@ -90,7 +92,7 @@ Version specified in XML file should be higher than Assembly version to trigger If you want to provide your own Assembly then you can do it by providing second argument of Start method as shown below. ````csharp -AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml", myAssembly); +AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml", myAssembly); ```` ## Configuration Options @@ -241,6 +243,14 @@ if (currentDirectory.Parent != null) } ```` +### Clear application directory before extracting update file + +Sometimes it is necessary to clear previous version files before doing an update. In this case, you can specify whether to clear the application directory before extracting the update file using the below code. + +````csharp +AutoUpdater.ClearAppDirectory = true; +```` + ### Specify size of the UpdateForm You can specify the size of the update form by using below code. @@ -276,7 +286,7 @@ System.Timers.Timer timer = new System.Timers.Timer }; timer.Elapsed += delegate { - AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.xml"); + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); }; timer.Start(); ```` @@ -287,7 +297,7 @@ timer.Start(); DispatcherTimer timer = new DispatcherTimer {Interval = TimeSpan.FromMinutes(2)}; timer.Tick += delegate { - AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTestWPF.xml"); + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTestWPF.xml"); }; timer.Start(); ```` @@ -398,7 +408,7 @@ If you want to use other format instead of XML as an AppCast file then you need ````csharp AutoUpdater.ParseUpdateInfoEvent += AutoUpdaterOnParseUpdateInfoEvent; -AutoUpdater.Start("http://rbsoft.org/updates/AutoUpdaterTest.json"); +AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.json"); private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) { @@ -428,7 +438,7 @@ private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) ````json { "version":"2.0.0.0", - "url":"http://rbsoft.org/downloads/AutoUpdaterTest.zip", + "url":"https://rbsoft.org/downloads/AutoUpdaterTest.zip", "changelog":"https://github.com/ravibpatel/AutoUpdater.NET/releases", "mandatory":{ "value":true, diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index f3cfe109..ff7aa812 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -16,7 +16,7 @@ public partial class FormMain : Form { private const int MaxRetries = 2; private BackgroundWorker _backgroundWorker; - private readonly StringBuilder _logBuilder = new StringBuilder(); + private readonly StringBuilder _logBuilder = new(); public FormMain() { @@ -40,7 +40,11 @@ private void FormMain_Shown(object sender, EventArgs e) if (args.Length >= 4) { + string zipPath = args[1]; + string extractionPath = args[2]; string executablePath = args[3]; + bool clearAppDirectory = args.Length > 4 && args[4] == "-c"; + string commandLineArgs = args.Length > 5 ? args[5] : string.Empty; // Extract all the files. _backgroundWorker = new BackgroundWorker @@ -70,26 +74,44 @@ private void FormMain_Shown(object sender, EventArgs e) } _logBuilder.AppendLine("BackgroundWorker started successfully."); - - var path = args[2]; // Ensures that the last character on the extraction path // is the directory separator char. // Without this, a malicious zip file could try to traverse outside of the expected // extraction path. - if (!path.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) + if (!extractionPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) { - path += Path.DirectorySeparatorChar; + extractionPath += Path.DirectorySeparatorChar; } - var archive = ZipFile.OpenRead(args[1]); + var archive = ZipFile.OpenRead(zipPath); var entries = archive.Entries; - _logBuilder.AppendLine($"Found total of {entries.Count} files and folders inside the zip file."); - try { int progress = 0; + + if (clearAppDirectory) + { + _logBuilder.AppendLine($"Removing all files and folders from {extractionPath}."); + DirectoryInfo directoryInfo = new DirectoryInfo(extractionPath); + + foreach (FileInfo file in directoryInfo.GetFiles()) + { + _logBuilder.AppendLine($"Removing a file located at {file.FullName}."); + _backgroundWorker.ReportProgress(0, string.Format(Resources.Removing, file.FullName)); + file.Delete(); + } + foreach (DirectoryInfo directory in directoryInfo.GetDirectories()) + { + _logBuilder.AppendLine($"Removing a directory located at {directory.FullName} and all its contents."); + _backgroundWorker.ReportProgress(0, string.Format(Resources.Removing, directory.FullName)); + directory.Delete(true); + } + } + + _logBuilder.AppendLine($"Found total of {entries.Count} files and folders inside the zip file."); + for (var index = 0; index < entries.Count; index++) { if (_backgroundWorker.CancellationPending) @@ -109,7 +131,7 @@ private void FormMain_Shown(object sender, EventArgs e) string filePath = String.Empty; try { - filePath = Path.Combine(path, entry.FullName); + filePath = Path.Combine(extractionPath, entry.FullName); if (!entry.IsDirectory()) { var parentDirectory = Path.GetDirectoryName(filePath); @@ -126,7 +148,7 @@ private void FormMain_Shown(object sender, EventArgs e) const int errorSharingViolation = 0x20; const int errorLockViolation = 0x21; var errorCode = Marshal.GetHRForException(exception) & 0x0000FFFF; - if (errorCode == errorSharingViolation || errorCode == errorLockViolation) + if (errorCode is errorSharingViolation or errorLockViolation) { retries++; if (retries > MaxRetries) @@ -212,9 +234,9 @@ private void FormMain_Shown(object sender, EventArgs e) try { ProcessStartInfo processStartInfo = new ProcessStartInfo(executablePath); - if (args.Length > 4) + if (!string.IsNullOrEmpty(commandLineArgs)) { - processStartInfo.Arguments = args[4]; + processStartInfo.Arguments = commandLineArgs; } Process.Start(processStartInfo); diff --git a/ZipExtractor/Properties/Resources.Designer.cs b/ZipExtractor/Properties/Resources.Designer.cs index d09e6b07..4cd731a4 100644 --- a/ZipExtractor/Properties/Resources.Designer.cs +++ b/ZipExtractor/Properties/Resources.Designer.cs @@ -90,6 +90,15 @@ internal static string FileStillInUseCaption return ResourceManager.GetString("FileStillInUseCaption", resourceCulture); } } + + /// + /// Looks up a localized string similar to Removing {0}. + /// + internal static string Removing { + get { + return ResourceManager.GetString("Removing", resourceCulture); + } + } /// /// Looks up a localized resource of type System.Drawing.Bitmap. diff --git a/ZipExtractor/Properties/Resources.resx b/ZipExtractor/Properties/Resources.resx index 2ac2a95e..4392475a 100644 --- a/ZipExtractor/Properties/Resources.resx +++ b/ZipExtractor/Properties/Resources.resx @@ -130,4 +130,7 @@ ..\Resources\ZipExtractor.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Removing {0} + \ No newline at end of file diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index f8e0765e..59d859ef 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -1,4 +1,4 @@ - + {91DE558C-6DB8-429B-A069-C0491DCFF15B} @@ -8,18 +8,18 @@ ZipExtractor RBSoft ZipExtractor - Copyright © 2012-2021 RBSoft - 1.3.0.0 - 1.3.0.0 - 1.3.0.0 - 1.3.0.0 + Copyright © 2012-2022 RBSoft + 1.3.1.0 + 1.3.1.0 + 1.3.1.0 + 1.3.1.0 ZipExtractor.ico app.manifest true ZipExtractor.snk en default - 1.3.0.0 + false win-x86 @@ -35,6 +35,7 @@ ..\AutoUpdater.NET\Resources false + false none false diff --git a/appveyor.yml b/appveyor.yml index 4e71b021..48f29738 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.0.{build} +version: 1.7.1.{build} environment: - my_version: 1.7.0 + my_version: 1.7.1 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true @@ -17,7 +17,7 @@ install: - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" -- dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows" +- dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* From 2cda90433b835d9a5b8f7613fa769c08b9baf571 Mon Sep 17 00:00:00 2001 From: dummy3k Date: Wed, 9 Feb 2022 17:13:33 +0100 Subject: [PATCH 31/93] Fixed race condition in SetTimer() (#516) Co-authored-by: Lennart Wagner --- AutoUpdater.NET/AutoUpdater.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 162a3697..59c3308a 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -598,7 +598,7 @@ internal static void SetTimer(DateTime remindLater) _remindLaterTimer = new System.Timers.Timer { - Interval = (int) timeSpan.TotalMilliseconds, + Interval = Math.Max(1, timeSpan.TotalMilliseconds), AutoReset = false }; From 11d049232c6a116a1d9b10191e8f9ed1510ba13f Mon Sep 17 00:00:00 2001 From: bokspro Date: Sat, 19 Feb 2022 07:51:51 +0200 Subject: [PATCH 32/93] Added Latvian translation (#518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Emīls Didzis --- AutoUpdater.NET/DownloadUpdateDialog.lv.resx | 126 +++++++++++++++ AutoUpdater.NET/Properties/Resources.lv.resx | 147 +++++++++++++++++ AutoUpdater.NET/RemindLaterForm.lv.resx | 156 +++++++++++++++++++ AutoUpdater.NET/UpdateForm.lv.resx | 141 +++++++++++++++++ 4 files changed, 570 insertions(+) create mode 100644 AutoUpdater.NET/DownloadUpdateDialog.lv.resx create mode 100644 AutoUpdater.NET/Properties/Resources.lv.resx create mode 100644 AutoUpdater.NET/RemindLaterForm.lv.resx create mode 100644 AutoUpdater.NET/UpdateForm.lv.resx diff --git a/AutoUpdater.NET/DownloadUpdateDialog.lv.resx b/AutoUpdater.NET/DownloadUpdateDialog.lv.resx new file mode 100644 index 00000000..5704759f --- /dev/null +++ b/AutoUpdater.NET/DownloadUpdateDialog.lv.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Programmatūras atjauninājums + + + Lejupielādē atjauninājumu... + + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.lv.resx b/AutoUpdater.NET/Properties/Resources.lv.resx new file mode 100644 index 00000000..09ac5046 --- /dev/null +++ b/AutoUpdater.NET/Properties/Resources.lv.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Nav pieejamu atjauninājumi! Lūdzu mēģiniet vēlāk! + + + Nav pieejami atjauninājumi! + + + Radās problēmas sazinoties ar atjauninājumu serveri, lūdzu pārbaudiet interneta savienojumu un mēģiniet vēlāk! + + + Atjauninājumu pārbaude neizdevās + + + Kontrolsumma(Checksum) atšķirās + + + Failu integritātes pārbaude neizdevās un ir dažas kļūdas. + + + Neatbalstīts Hash algoritms + + + Norādītais Hash algoritms XML failā netiek atbalstīts. + + + Lejupielādē ar ātrumu {0}/s + + diff --git a/AutoUpdater.NET/RemindLaterForm.lv.resx b/AutoUpdater.NET/RemindLaterForm.lv.resx new file mode 100644 index 00000000..fdc76b69 --- /dev/null +++ b/AutoUpdater.NET/RemindLaterForm.lv.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Nē, lejupielādēt atjauninājumus tagad (Ieteicams) + + + Pēc 30 minūtēm + + + Pēc 12 stundām + + + Pēc 1 dienas + + + Pēc 2 dienām + + + Pēc 4 dienām + + + Pēc 8 dienām + + + Pēc 10 dienām + + + Jā, lūdzu atgādiniet man vēlāk: + + + Jums vajadzētu lejupielādēt atjauninājumus tagad. Tas aizņems tikai pāris minūtes, atkarība no jūsu interneta savienojuma ātrumu, un nodrošinās jūs ar jaunāko programmatūras versiju. + + + Vai jūs vēlaties lejupielādēt atjauninājumus vēlāk? + + + Atgādināt vēlāk par atjauninājumu + + \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.lv.resx b/AutoUpdater.NET/UpdateForm.lv.resx new file mode 100644 index 00000000..d4384f32 --- /dev/null +++ b/AutoUpdater.NET/UpdateForm.lv.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0} ir pieejams jauns atjauninājums! + + + {0} {1} atjauninājums ir peejams. Pašlaik jums ir ieinstalēta versija {2}. Vai jūs vēlaties lejupielādēt atjauninājumu tagad? + + + Atjaunināt + + + Atgādināt vēlāk + + + Izlaist šo atjauninājumu + + + {0} {1} atjauninājums ir pieejams! + + + Atjauninājuma piezīmes: + + \ No newline at end of file From 653737c9c715d2a6e8111001ca83584540f0d20f Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 21 Feb 2022 11:51:49 +0530 Subject: [PATCH 33/93] Fixed a scaling issue in update form on higher DPI. This resolves #510 and fixes #497. --- AutoUpdater.NET/UpdateForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 0225dbd3..fa759af9 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -99,7 +99,7 @@ private void UpdateFormLoad(object sender, EventArgs e) } } - var labelSize = new Size(Width - 110, 0); + var labelSize = new Size(webBrowser.Width, 0); labelDescription.MaximumSize = labelUpdate.MaximumSize = labelSize; } From 098b0d7eff569322810dcaaa7aa5a19d51a339aa Mon Sep 17 00:00:00 2001 From: Mark Young Date: Sun, 29 May 2022 12:55:28 +0100 Subject: [PATCH 34/93] Now WebView2 control will be used instead of WebBrowser when it's available. (#534) --- AutoUpdater.NET/AutoUpdater.NET.csproj | 111 +- AutoUpdater.NET/UpdateForm.Designer.cs | 17 +- AutoUpdater.NET/UpdateForm.cs | 73 +- AutoUpdater.NET/UpdateForm.resx | 1932 ++++++++++++------------ 4 files changed, 1103 insertions(+), 1030 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index e10c139f..6066297c 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -1,55 +1,58 @@ - - - - {FB9E7E6B-B19F-4F37-A708-2996190CEF13} - library - net45;netcoreapp3.1;net5.0-windows - true - true - AutoUpdaterDotNET - AutoUpdater.NET - RBSoft - AutoUpdater.NET - Copyright © 2012-2022 RBSoft - 1.7.1.0 - 1.7.1.0 - 1.7.1.0 - true - AutoUpdater.NET.snk - en - Autoupdater.NET.Official - true - MIT - 1.7.1.0 - AutoUpdater.NET - rbsoft - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. - https://github.com/ravibpatel/AutoUpdater.NET - autoupdate updater c# vb wpf winforms - https://github.com/ravibpatel/AutoUpdater.NET/releases - build - $(OutputPath)\$(Configuration)\AutoUpdater.NET.xml - default - - - build\lib - pdbonly - - - full - - - - - - - - - - - - - all - - + + + + {FB9E7E6B-B19F-4F37-A708-2996190CEF13} + library + net45;netcoreapp3.1;net5.0-windows + true + true + AutoUpdaterDotNET + AutoUpdater.NET + RBSoft + AutoUpdater.NET + Copyright © 2012-2022 RBSoft + 1.7.1.0 + 1.7.1.0 + 1.7.1.0 + true + AutoUpdater.NET.snk + en + Autoupdater.NET.Official + true + MIT + 1.7.1.0 + AutoUpdater.NET + rbsoft + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. + https://github.com/ravibpatel/AutoUpdater.NET + autoupdate updater c# vb wpf winforms + https://github.com/ravibpatel/AutoUpdater.NET/releases + build + $(OutputPath)\$(Configuration)\AutoUpdater.NET.xml + default + + + build\lib + pdbonly + + + full + + + + + + + + + + + + + all + + + + + \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.Designer.cs b/AutoUpdater.NET/UpdateForm.Designer.cs index 216e8274..e56d1b56 100644 --- a/AutoUpdater.NET/UpdateForm.Designer.cs +++ b/AutoUpdater.NET/UpdateForm.Designer.cs @@ -39,7 +39,9 @@ private void InitializeComponent() this.buttonRemindLater = new System.Windows.Forms.Button(); this.pictureBoxIcon = new System.Windows.Forms.PictureBox(); this.buttonSkip = new System.Windows.Forms.Button(); + this.webView2 = new Microsoft.Web.WebView2.WinForms.WebView2(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.webView2)).BeginInit(); this.SuspendLayout(); // // webBrowser @@ -95,6 +97,15 @@ private void InitializeComponent() this.buttonSkip.UseVisualStyleBackColor = true; this.buttonSkip.Click += new System.EventHandler(this.ButtonSkipClick); // + // webView2 + // + this.webView2.AllowExternalDrop = true; + this.webView2.CreationProperties = null; + this.webView2.DefaultBackgroundColor = System.Drawing.Color.White; + resources.ApplyResources(this.webView2, "webView2"); + this.webView2.Name = "webView2"; + this.webView2.ZoomFactor = 1D; + // // UpdateForm // this.AcceptButton = this.buttonUpdate; @@ -104,10 +115,11 @@ private void InitializeComponent() this.Controls.Add(this.labelReleaseNotes); this.Controls.Add(this.labelDescription); this.Controls.Add(this.labelUpdate); - this.Controls.Add(this.webBrowser); this.Controls.Add(this.buttonUpdate); this.Controls.Add(this.buttonSkip); this.Controls.Add(this.buttonRemindLater); + this.Controls.Add(this.webView2); + this.Controls.Add(this.webBrowser); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; @@ -116,6 +128,7 @@ private void InitializeComponent() this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.UpdateForm_FormClosed); this.Load += new System.EventHandler(this.UpdateFormLoad); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.webView2)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -131,6 +144,6 @@ private void InitializeComponent() private System.Windows.Forms.Label labelDescription; private System.Windows.Forms.Label labelReleaseNotes; private System.Windows.Forms.PictureBox pictureBoxIcon; - + private Microsoft.Web.WebView2.WinForms.WebView2 webView2; } } \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index fa759af9..6a0efc30 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.IO; using System.Windows.Forms; +using Microsoft.Web.WebView2.Core; using Microsoft.Win32; namespace AutoUpdaterDotNET @@ -16,6 +17,7 @@ public UpdateForm(UpdateInfoEventArgs args) { _args = args; InitializeComponent(); + InitializeBrowserControl(); UseLatestIE(); buttonSkip.Visible = AutoUpdater.ShowSkipButton; buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton; @@ -34,6 +36,57 @@ public UpdateForm(UpdateInfoEventArgs args) } } + private void InitializeBrowserControl() + { + if (string.IsNullOrEmpty(_args.ChangelogURL)) + { + var reduceHeight = labelReleaseNotes.Height + webBrowser.Height; + labelReleaseNotes.Hide(); + webBrowser.Hide(); + webView2.Hide(); + Height -= reduceHeight; + } + else + { + if (string.IsNullOrEmpty(CoreWebView2Environment.GetAvailableBrowserVersionString())) + { + if (null != AutoUpdater.BasicAuthChangeLog) + { + webBrowser.Navigate(_args.ChangelogURL, "", null, + $"Authorization: {AutoUpdater.BasicAuthChangeLog}"); + } + else + { + webBrowser.Navigate(_args.ChangelogURL); + } + } + else + { + webBrowser.Hide(); + webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; + webView2.EnsureCoreWebView2Async(); + } + } + } + + private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) + { + webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; + webView2.CoreWebView2.Settings.IsStatusBarEnabled = false; + webView2.CoreWebView2.Settings.AreDevToolsEnabled = Debugger.IsAttached; + webView2.Show(); + webView2.BringToFront(); + if (null != AutoUpdater.BasicAuthChangeLog) + { + var resourceRequest = webView2.CoreWebView2.Environment.CreateWebResourceRequest(_args.ChangelogURL, "GET", Stream.Null, $"Authorization: {AutoUpdater.BasicAuthChangeLog}"); + webView2.CoreWebView2.NavigateWithWebResourceRequest(resourceRequest); + } + else + { + webView2.CoreWebView2.Navigate(_args.ChangelogURL); + } + } + private void UseLatestIE() { int ieValue = 0; @@ -79,26 +132,6 @@ private void UseLatestIE() private void UpdateFormLoad(object sender, EventArgs e) { - if (string.IsNullOrEmpty(_args.ChangelogURL)) - { - var reduceHeight = labelReleaseNotes.Height + webBrowser.Height; - labelReleaseNotes.Hide(); - webBrowser.Hide(); - Height -= reduceHeight; - } - else - { - if (null != AutoUpdater.BasicAuthChangeLog) - { - webBrowser.Navigate(_args.ChangelogURL, "", null, - $"Authorization: {AutoUpdater.BasicAuthChangeLog}"); - } - else - { - webBrowser.Navigate(_args.ChangelogURL); - } - } - var labelSize = new Size(webBrowser.Width, 0); labelDescription.MaximumSize = labelUpdate.MaximumSize = labelSize; } diff --git a/AutoUpdater.NET/UpdateForm.resx b/AutoUpdater.NET/UpdateForm.resx index ee6bddc4..5dfd9a19 100644 --- a/AutoUpdater.NET/UpdateForm.resx +++ b/AutoUpdater.NET/UpdateForm.resx @@ -1,955 +1,979 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Top, Bottom, Left, Right - - - - 94, 120 - - - 2, 2, 2, 2 - - - 23, 23 - - - 538, 432 - - - - 0 - - - webBrowser - - - System.Windows.Forms.WebBrowser, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - True - - - Segoe UI, 10.5pt, style=Bold - - - 91, 14 - - - 550, 0 - - - 227, 19 - - - 5 - - - A new version of {0} is available! - - - labelUpdate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - Segoe UI, 9pt - - - 91, 50 - - - 550, 0 - - - 479, 15 - - - 6 - - - {0} {1} is now available. You have version {2} installed. Would you like to download it now? - - - labelDescription - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - True - - - Segoe UI, 9.75pt, style=Bold - - - 91, 90 - - - 98, 17 - - - 7 - - - Release Notes: - - - labelReleaseNotes - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Bottom, Right - - - Segoe UI, 9pt - - - 479, 573 - - - 2, 2, 2, 2 - - - 153, 28 - - - 2 - - - Update - - - MiddleRight - - - ImageBeforeText - - - buttonUpdate - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 5 - - - Bottom, Right - - - Segoe UI, 9pt - - - 322, 573 - - - 2, 2, 2, 2 - - - 153, 28 - - - 3 - - - Remind me later - - - MiddleRight - - - ImageBeforeText - - - buttonRemindLater - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 7 - - - 12, 14 - - - 70, 66 - - - CenterImage - - - 8 - - - pictureBoxIcon - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - Bottom, Left - - - Segoe UI, 9pt - - - 95, 573 - - - 2, 2, 2, 2 - - - 153, 28 - - - 1 - - - Skip this version - - - MiddleRight - - - ImageBeforeText - - - buttonSkip - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 6 - - - True - - - 7, 15 - - - 643, 612 - - - Segoe UI, 9pt - - - - AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA - IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// - /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af// - /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA/// - /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA - AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT - u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5 - 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N - 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R - 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz - +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6//// - //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un - +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h - +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv - +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf - z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA - //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA - AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA - AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA - AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA - ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA - ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA - AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj - 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA - AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA - ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA - ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA - AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA - AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA - AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO - 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af// - /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL - 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR - +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af// - /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW - +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ - +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ - +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc - zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su - +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK - 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ - +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU - +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af// - /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8//// - ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af// - /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY - +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af// - /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus - +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q - +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt - 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7 - 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN - 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW - 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu - +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW - +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv - 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf// - /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb - zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb - zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA - AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA - AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA - ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA - AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA - ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA - AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA - ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA - ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1 - dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t - 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA - AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi - 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA - AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA - AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA - ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA - ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf - ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA - ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT - 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA - ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af// - /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA - ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM - 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA - AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA - AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK - 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw - bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA - AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT - 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK - 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S - +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB - 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j - +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI - 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS - 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO - 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss - +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9 - /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92 - 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C - /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb - zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc - +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR - 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue - +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO - 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd - +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2 - /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi - 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v////////////// - ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H - 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs - /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E - 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS - 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL - 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn - +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ - 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i - +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY - +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax - +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+//// - ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu - 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY - +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc - zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY - ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip - +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP - 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks - +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR - +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv - 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV - 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic - +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf - +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c - 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf - +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo - 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo - +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa - zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd - zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu - +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm - +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc - zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af// - /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD/// - /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb - zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ - zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l - 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd - zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA - AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA - AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA - AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA - AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA - AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA - AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA - AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA - AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA - AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA - AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA - ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA - AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA - AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA - ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA - ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA - ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi - 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA - AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5 - eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA - AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA - AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA - AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA - ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA - ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA - AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA - ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA - AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA - AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA - AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ - 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB - 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA - AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA - ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe - z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA - ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA - ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP - JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA - AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA - AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA - AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY - +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv - 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA - AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M - 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH - 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc - zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA - ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf - +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc - zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA - AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO - 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc - zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA - AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA - AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ - +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ - 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA - AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd - zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO - 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS - 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA - AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S - +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD - 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb - yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV - +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ - 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc - zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW - +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP - 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA - AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm - +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3///////// - ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM - 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T - +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq - /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI - 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll - 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic - +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP - 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc - +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+ - //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa - +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7///////////////// - ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl - +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1 - 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0 - /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN - 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i - +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9 - +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc - z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h - +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f////////////////////////////////////////////// - ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD - 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT - 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7///////////////////////// - /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK - 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm - +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM - 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p - 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao - +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E - 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k - +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk - +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5//////////////////// - ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP - 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u - +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo - +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM - 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd - z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus - +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T - +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq - +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY - +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj - +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f////////////// - /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc - zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn - +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ - 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO - 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq - 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep - +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U - +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt - 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+ - +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V - +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe - 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5 - 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ - 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj - +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO - 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i - +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig - +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov - 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY - +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd - 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye - +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my - 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E - +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb - zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic - +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC - +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd - z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc - zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV - +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV - qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb - zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA - vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf - 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC - +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc - zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb - zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x - 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - - - - 2, 2, 2, 2 - - - CenterParent - - - {0} {1} is available! - - - UpdateForm - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Top, Bottom, Left, Right + + + + 94, 120 + + + 2, 2, 2, 2 + + + 23, 23 + + + 538, 432 + + + + 4 + + + webBrowser + + + System.Windows.Forms.WebBrowser, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 8 + + + True + + + Segoe UI, 10.5pt, style=Bold + + + 91, 14 + + + 550, 0 + + + 227, 19 + + + 5 + + + A new version of {0} is available! + + + labelUpdate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + Segoe UI, 9pt + + + 91, 50 + + + 550, 0 + + + 479, 15 + + + 6 + + + {0} {1} is now available. You have version {2} installed. Would you like to download it now? + + + labelDescription + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + Segoe UI, 9.75pt, style=Bold + + + 91, 90 + + + 98, 17 + + + 7 + + + Release Notes: + + + labelReleaseNotes + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Bottom, Right + + + Segoe UI, 9pt + + + 479, 573 + + + 2, 2, 2, 2 + + + 153, 28 + + + 0 + + + Update + + + MiddleRight + + + ImageBeforeText + + + buttonUpdate + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Bottom, Right + + + Segoe UI, 9pt + + + 322, 573 + + + 2, 2, 2, 2 + + + 153, 28 + + + 1 + + + Remind me later + + + MiddleRight + + + ImageBeforeText + + + buttonRemindLater + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + + 12, 14 + + + 70, 66 + + + CenterImage + + + 8 + + + pictureBoxIcon + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + Bottom, Left + + + Segoe UI, 9pt + + + 95, 573 + + + 2, 2, 2, 2 + + + 153, 28 + + + 2 + + + Skip this version + + + MiddleRight + + + ImageBeforeText + + + buttonSkip + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + 95, 120 + + + 536, 432 + + + 3 + + + False + + + webView2 + + + Microsoft.Web.WebView2.WinForms.WebView2, Microsoft.Web.WebView2.WinForms, Version=1.0.1210.39, Culture=neutral, PublicKeyToken=2a8ab48044d2601e + + + $this + + + 7 + + + True + + + 7, 15 + + + 643, 612 + + + Segoe UI, 9pt + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af// + /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA/// + /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA + AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT + u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5 + 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N + 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R + 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz + +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6//// + //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un + +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h + +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv + +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf + z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA + AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA + ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA + ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA + AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj + 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA + AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA + ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA + ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA + AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA + AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA + AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO + 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af// + /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL + 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR + +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af// + /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW + +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ + +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ + +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc + zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su + +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK + 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ + +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU + +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af// + /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8//// + ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af// + /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY + +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af// + /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus + +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q + +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt + 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7 + 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN + 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW + 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu + +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW + +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv + 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf// + /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb + zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb + zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA + AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA + ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA + AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA + ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA + AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA + ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA + ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1 + dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t + 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA + AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi + 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA + AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA + AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA + ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA + ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf + ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA + ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT + 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA + ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA + ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM + 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA + AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK + 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw + bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA + AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT + 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK + 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S + +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB + 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j + +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI + 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS + 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO + 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss + +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9 + /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92 + 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C + /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb + zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc + +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR + 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue + +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO + 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd + +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2 + /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi + 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v////////////// + ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H + 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs + /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E + 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS + 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL + 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn + +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ + 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i + +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY + +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax + +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+//// + ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu + 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY + +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc + zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY + ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip + +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP + 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks + +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR + +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv + 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV + 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic + +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf + +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c + 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf + +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo + 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo + +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa + zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd + zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu + +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm + +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc + zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af// + /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD/// + /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb + zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ + zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l + 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd + zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA + AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA + AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA + AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA + AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA + AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA + AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA + AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA + AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA + ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA + AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA + ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA + ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA + ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi + 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA + AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5 + eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA + AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA + AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA + AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA + ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA + ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA + AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA + ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA + AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA + AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ + 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB + 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA + AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA + ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe + z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA + ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA + ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP + JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA + AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA + AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY + +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv + 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA + AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M + 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH + 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc + zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA + ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf + +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc + zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA + AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO + 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc + zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ + +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ + 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA + AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd + zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO + 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS + 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA + AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S + +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD + 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb + yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV + +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ + 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc + zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW + +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP + 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm + +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3///////// + ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM + 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T + +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq + /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI + 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll + 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic + +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP + 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc + +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+ + //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa + +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7///////////////// + ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl + +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1 + 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0 + /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN + 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i + +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9 + +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc + z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h + +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f////////////////////////////////////////////// + ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD + 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT + 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7///////////////////////// + /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK + 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm + +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM + 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p + 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao + +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E + 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k + +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk + +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5//////////////////// + ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP + 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u + +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo + +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM + 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd + z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus + +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T + +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq + +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY + +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj + +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f////////////// + /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc + zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn + +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ + 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO + 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq + 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep + +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U + +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt + 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+ + +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V + +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe + 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5 + 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ + 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj + +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO + 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i + +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig + +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov + 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY + +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd + 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye + +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my + 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E + +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb + zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic + +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC + +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd + z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc + zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV + +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV + qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb + zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA + vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf + 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC + +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc + zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb + zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x + 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + + 2, 2, 2, 2 + + + CenterParent + + + {0} {1} is available! + + + UpdateForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file From aac14de20528671466246926d9ae2c339fdd109c Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 29 May 2022 19:49:07 +0530 Subject: [PATCH 35/93] Updated nuspec file. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 2 +- .../build/Autoupdater.NET.Official.nuspec | 29 ++++++++++++++----- appveyor.yml | 3 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 6066297c..a85d31a6 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -23,7 +23,7 @@ 1.7.1.0 AutoUpdater.NET rbsoft - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. https://github.com/ravibpatel/AutoUpdater.NET autoupdate updater c# vb wpf winforms https://github.com/ravibpatel/AutoUpdater.NET/releases diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index da1e1704..468b9b9f 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -1,5 +1,5 @@  - + Autoupdater.NET.Official 1.7.1.0 @@ -14,20 +14,35 @@ Copyright © 2012-2022 RBSoft autoupdate updater c# vb wpf winforms - - - + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 48f29738..ca644681 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,8 +18,9 @@ install: - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" -- nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* +- ps: Remove-Item -path %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse +- nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" artifacts: - path: AutoUpdater.NET-%my_version%.zip From d62ff6329895be3d82c2f2eadd365a66dbacefc8 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 29 May 2022 19:52:31 +0530 Subject: [PATCH 36/93] Updated appveyor.yml. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ca644681..98692ea8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ install: - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* -- ps: Remove-Item -path %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse +- ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" artifacts: From ee91865345319568ebc6a5ab7e1bfa709b20dfdb Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 29 May 2022 22:29:37 +0530 Subject: [PATCH 37/93] Fixed an issue causing it to crash if there is no compatible WebView2 Runtime available on the system. --- AutoUpdater.NET/UpdateForm.cs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 6a0efc30..e740b26e 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -48,7 +48,28 @@ private void InitializeBrowserControl() } else { - if (string.IsNullOrEmpty(CoreWebView2Environment.GetAvailableBrowserVersionString())) + bool webView2RuntimeFound = false; + try + { + string availableBrowserVersion = CoreWebView2Environment.GetAvailableBrowserVersionString(); + string requiredMinBrowserVersion = "86.0.616.0"; + if (!string.IsNullOrEmpty(availableBrowserVersion) + && CoreWebView2Environment.CompareBrowserVersions(availableBrowserVersion, requiredMinBrowserVersion) >= 0) + { + webView2RuntimeFound = true; + } + } + catch (WebView2RuntimeNotFoundException) + { + // ignored + } + if (webView2RuntimeFound) + { + webBrowser.Hide(); + webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; + webView2.EnsureCoreWebView2Async(); + } + else { if (null != AutoUpdater.BasicAuthChangeLog) { @@ -60,12 +81,6 @@ private void InitializeBrowserControl() webBrowser.Navigate(_args.ChangelogURL); } } - else - { - webBrowser.Hide(); - webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; - webView2.EnsureCoreWebView2Async(); - } } } From cb1901820463e33ac6d7f3459d6a5c4389a8d662 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 1 Jun 2022 11:46:00 +0530 Subject: [PATCH 38/93] Fixed an issue causing UpdateForm to not show up again even if Start method was called again. This fixes #520. --- AutoUpdater.NET/AutoUpdater.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 59c3308a..2d84bc64 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -293,7 +293,12 @@ public static void Start(string appCast, Assembly myAssembly = null) { var result = CheckUpdate(assembly); - Running = StartUpdate(result); + if (StartUpdate(result)) + { + return; + } + + Running = false; } catch (Exception exception) { From 98c1c8cf6714837af9fffb5801b66a7635dc63b4 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 1 Jun 2022 11:58:15 +0530 Subject: [PATCH 39/93] Updated appveyor.yml. --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 98692ea8..6a27fb3e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -32,7 +32,7 @@ deploy: description: '// TODO: Write Release Notes' artifact: AutoUpdater.NET-%my_version%.zip auth_token: - secure: WHW27Nvc8zNhfyhxIYdl/NwbrkFzvSX0vE4/CS8iByPXM6rcztWhUrDXJ7eejLBY + secure: 7mWsHdYoJjOZChmTq6NVAycMaurs/tAoHZUG6nBmdNKHLtqJ4c58mItRuSKUMJua draft: false prerelease: false on: @@ -41,7 +41,7 @@ deploy: - provider: NuGet api_key: - secure: tmlnRHVMwKGZ1B+ua5hte55Ig+gfbTi4DjKzzTiRjNwpy9nYgQpDZCnQZB0H9IdS + secure: EA3GtBMLgZneFXYFhyTQ+8ppC0bvjJl3CwE9sQ31gLQUI/4cpETFgPt6ql7uYD9/ skip_symbols: false artifact: Autoupdater.NET.Official.%my_version%.nupkg on: From 1fe5303220ca8ce29fbdb048e627e62ee10d8223 Mon Sep 17 00:00:00 2001 From: Mark Young Date: Mon, 6 Jun 2022 17:38:51 +0100 Subject: [PATCH 40/93] Resolve #535, correctly anchor and size WebView2 (#536) --- AutoUpdater.NET/UpdateForm.resx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/AutoUpdater.NET/UpdateForm.resx b/AutoUpdater.NET/UpdateForm.resx index 5dfd9a19..d516e197 100644 --- a/AutoUpdater.NET/UpdateForm.resx +++ b/AutoUpdater.NET/UpdateForm.resx @@ -387,8 +387,17 @@ 5 + + Top, Bottom, Left, Right + - 95, 120 + 94, 120 + + + 2, 2, 2, 2 + + + 23, 23 536, 432 From dc9c38a9923ed057db2e6e62791118c601d86c53 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 6 Jun 2022 22:25:39 +0530 Subject: [PATCH 41/93] Changed WebView2 size to same size as WebBrowser control. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++++---- AutoUpdater.NET/UpdateForm.resx | 2 +- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- appveyor.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index a85d31a6..8238495c 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2022 RBSoft - 1.7.1.0 - 1.7.1.0 - 1.7.1.0 + 1.7.2.0 + 1.7.2.0 + 1.7.2.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.1.0 + 1.7.2.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. diff --git a/AutoUpdater.NET/UpdateForm.resx b/AutoUpdater.NET/UpdateForm.resx index d516e197..d68e3ec0 100644 --- a/AutoUpdater.NET/UpdateForm.resx +++ b/AutoUpdater.NET/UpdateForm.resx @@ -400,7 +400,7 @@ 23, 23 - 536, 432 + 538, 432 3 diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 468b9b9f..92058874 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.1.0 + 1.7.2.0 AutoUpdater.NET rbsoft false diff --git a/appveyor.yml b/appveyor.yml index 6a27fb3e..6f542435 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.1.{build} +version: 1.7.2.{build} environment: - my_version: 1.7.1 + my_version: 1.7.2 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From f90cc88d4575a153377b7c33c6b9566e75bb2ca1 Mon Sep 17 00:00:00 2001 From: ptdev Date: Mon, 13 Jun 2022 12:33:06 +0100 Subject: [PATCH 42/93] Fixed an issue with WebView2 when changelog has linked files and basic authentication is enabled (#537) --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++++---- AutoUpdater.NET/BasicAuthentication.cs | 4 ++-- AutoUpdater.NET/UpdateForm.cs | 14 ++++++++------ .../build/Autoupdater.NET.Official.nuspec | 2 +- appveyor.yml | 4 ++-- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 8238495c..0846ffd3 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2022 RBSoft - 1.7.2.0 - 1.7.2.0 - 1.7.2.0 + 1.7.3.0 + 1.7.3.0 + 1.7.3.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.2.0 + 1.7.3.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. diff --git a/AutoUpdater.NET/BasicAuthentication.cs b/AutoUpdater.NET/BasicAuthentication.cs index b9ff985f..621c9955 100644 --- a/AutoUpdater.NET/BasicAuthentication.cs +++ b/AutoUpdater.NET/BasicAuthentication.cs @@ -9,9 +9,9 @@ namespace AutoUpdaterDotNET /// public class BasicAuthentication : IAuthentication { - private string Username { get; } + public string Username { get; } - private string Password { get; } + public string Password { get; } /// /// Initializes credentials for Basic Authentication. diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index e740b26e..e5e8b2be 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -93,13 +93,15 @@ private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebV webView2.BringToFront(); if (null != AutoUpdater.BasicAuthChangeLog) { - var resourceRequest = webView2.CoreWebView2.Environment.CreateWebResourceRequest(_args.ChangelogURL, "GET", Stream.Null, $"Authorization: {AutoUpdater.BasicAuthChangeLog}"); - webView2.CoreWebView2.NavigateWithWebResourceRequest(resourceRequest); - } - else - { - webView2.CoreWebView2.Navigate(_args.ChangelogURL); + webView2.CoreWebView2.BasicAuthenticationRequested += delegate ( + object sender, + CoreWebView2BasicAuthenticationRequestedEventArgs args) + { + args.Response.UserName = ((BasicAuthentication)AutoUpdater.BasicAuthChangeLog).Username; + args.Response.Password = ((BasicAuthentication)AutoUpdater.BasicAuthChangeLog).Password; + }; } + webView2.CoreWebView2.Navigate(_args.ChangelogURL); } private void UseLatestIE() diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 92058874..041b1a46 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.2.0 + 1.7.3.0 AutoUpdater.NET rbsoft false diff --git a/appveyor.yml b/appveyor.yml index 6f542435..ef5e94f2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.2.{build} +version: 1.7.3.{build} environment: - my_version: 1.7.2 + my_version: 1.7.3 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 95555d322127a55c37b86779ab72ce8c0ce106b7 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 13 Jun 2022 17:11:57 +0530 Subject: [PATCH 43/93] Changed Username and Password field of BasicAuthentication to internal. --- AutoUpdater.NET/BasicAuthentication.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/BasicAuthentication.cs b/AutoUpdater.NET/BasicAuthentication.cs index 621c9955..de4b41de 100644 --- a/AutoUpdater.NET/BasicAuthentication.cs +++ b/AutoUpdater.NET/BasicAuthentication.cs @@ -9,9 +9,9 @@ namespace AutoUpdaterDotNET /// public class BasicAuthentication : IAuthentication { - public string Username { get; } + internal string Username { get; } - public string Password { get; } + internal string Password { get; } /// /// Initializes credentials for Basic Authentication. From f6797c4aebad6e455432ec57c754072d68f59bc1 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sat, 9 Jul 2022 14:37:36 +0530 Subject: [PATCH 44/93] Fixed #546. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 10 +- AutoUpdater.NET/DownloadUpdateDialog.cs | 6 +- .../build/Autoupdater.NET.Official.nuspec | 8 +- AutoUpdaterTest/FormMain.cs | 6 +- AutoUpdaterTest/Properties/AssemblyInfo.cs | 2 +- AutoUpdaterTest/packages.config | 2 +- AutoUpdaterTestWPF/Properties/AssemblyInfo.cs | 2 +- ZipExtractor/FormMain.cs | 362 +++++++++--------- ZipExtractor/ZipExtractor.csproj | 8 +- appveyor.yml | 4 +- 10 files changed, 216 insertions(+), 194 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 0846ffd3..f06f84de 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2022 RBSoft - 1.7.3.0 - 1.7.3.0 - 1.7.3.0 + 1.7.4.0 + 1.7.4.0 + 1.7.4.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.3.0 + 1.7.4.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. @@ -53,6 +53,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 72b78667..9d358f7b 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -154,11 +154,11 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } StringBuilder arguments = - new StringBuilder($"\"{tempPath}\" \"{extractionPath}\" \"{executablePath}\""); + new StringBuilder($"--input \"{tempPath}\" --output \"{extractionPath}\" --executable \"{executablePath}\""); if (AutoUpdater.ClearAppDirectory) { - arguments.Append(" -c"); + arguments.Append(" --clear"); } string[] args = Environment.GetCommandLineArgs(); @@ -166,7 +166,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent { if (i.Equals(1)) { - arguments.Append(" \""); + arguments.Append(" --args \""); } arguments.Append(args[i]); diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 041b1a46..94fc64d8 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.3.0 + 1.7.4.0 AutoUpdater.NET rbsoft false @@ -15,13 +15,13 @@ autoupdate updater c# vb wpf winforms - + - + - + diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 31d98afb..13969a73 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -127,7 +127,9 @@ private void FormMain_Load(object sender, EventArgs e) //Uncomment following line if you want to clear application directory before update zip is extracted. //AutoUpdater.ClearAppDirectory = true; - AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); + //AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); + + MessageBox.Show(string.Join(Environment.NewLine, Environment.GetCommandLineArgs())); } private void AutoUpdater_ApplicationExitEvent() @@ -243,7 +245,7 @@ private void ButtonCheckForUpdate_Click(object sender, EventArgs e) // AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); //} - AutoUpdater.Mandatory = true; + AutoUpdater.ClearAppDirectory = false; AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } } diff --git a/AutoUpdaterTest/Properties/AssemblyInfo.cs b/AutoUpdaterTest/Properties/AssemblyInfo.cs index c946e79b..9db0a84e 100644 --- a/AutoUpdaterTest/Properties/AssemblyInfo.cs +++ b/AutoUpdaterTest/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("RBSoft")] [assembly: AssemblyProduct("AutoUpdaterTest")] -[assembly: AssemblyCopyright("Copyright © 2012-2020 RBSoft")] +[assembly: AssemblyCopyright("Copyright © 2012-2022 RBSoft")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/AutoUpdaterTest/packages.config b/AutoUpdaterTest/packages.config index 7c080311..ea29129e 100644 --- a/AutoUpdaterTest/packages.config +++ b/AutoUpdaterTest/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/AutoUpdaterTestWPF/Properties/AssemblyInfo.cs b/AutoUpdaterTestWPF/Properties/AssemblyInfo.cs index f9ba92f6..4a6bc94e 100644 --- a/AutoUpdaterTestWPF/Properties/AssemblyInfo.cs +++ b/AutoUpdaterTestWPF/Properties/AssemblyInfo.cs @@ -12,7 +12,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("RBSoft")] [assembly: AssemblyProduct("AutoUpdaterTestWPF")] -[assembly: AssemblyCopyright("Copyright © 2012-2020 RBSoft")] +[assembly: AssemblyCopyright("Copyright © 2012-2022 RBSoft")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index ff7aa812..ec004fc3 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -25,6 +25,12 @@ public FormMain() private void FormMain_Shown(object sender, EventArgs e) { + string zipPath = null; + string extractionPath = null; + string executablePath = null; + bool clearAppDirectory = false; + string commandLineArgs = null; + _logBuilder.AppendLine(DateTime.Now.ToString("F")); _logBuilder.AppendLine(); _logBuilder.AppendLine("ZipExtractor started with following command line arguments."); @@ -32,243 +38,257 @@ private void FormMain_Shown(object sender, EventArgs e) string[] args = Environment.GetCommandLineArgs(); for (var index = 0; index < args.Length; index++) { - var arg = args[index]; + var arg = args[index].ToLower(); + switch (arg) + { + case "--input": + zipPath = args[index + 1]; + break; + case "--output": + extractionPath = args[index + 1]; + break; + case "--executable": + executablePath = args[index + 1]; + break; + case "--clear": + clearAppDirectory = true; + break; + case "--args": + commandLineArgs = args[index + 1]; + break; + } _logBuilder.AppendLine($"[{index}] {arg}"); } _logBuilder.AppendLine(); - if (args.Length >= 4) + if (string.IsNullOrEmpty(zipPath) || string.IsNullOrEmpty(extractionPath) || string.IsNullOrEmpty(executablePath)) { - string zipPath = args[1]; - string extractionPath = args[2]; - string executablePath = args[3]; - bool clearAppDirectory = args.Length > 4 && args[4] == "-c"; - string commandLineArgs = args.Length > 5 ? args[5] : string.Empty; - - // Extract all the files. - _backgroundWorker = new BackgroundWorker - { - WorkerReportsProgress = true, - WorkerSupportsCancellation = true - }; + return; + } - _backgroundWorker.DoWork += (_, eventArgs) => + // Extract all the files. + _backgroundWorker = new BackgroundWorker + { + WorkerReportsProgress = true, + WorkerSupportsCancellation = true + }; + + _backgroundWorker.DoWork += (_, eventArgs) => + { + foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(executablePath))) { - foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(executablePath))) + try { - try + if (process.MainModule is { FileName: { } } && process.MainModule.FileName.Equals(executablePath)) { - if (process.MainModule is {FileName: { }} && process.MainModule.FileName.Equals(executablePath)) - { - _logBuilder.AppendLine("Waiting for application process to exit..."); + _logBuilder.AppendLine("Waiting for application process to exit..."); - _backgroundWorker.ReportProgress(0, "Waiting for application to exit..."); - process.WaitForExit(); - } - } - catch (Exception exception) - { - Debug.WriteLine(exception.Message); + _backgroundWorker.ReportProgress(0, "Waiting for application to exit..."); + process.WaitForExit(); } } + catch (Exception exception) + { + Debug.WriteLine(exception.Message); + } + } + + _logBuilder.AppendLine("BackgroundWorker started successfully."); - _logBuilder.AppendLine("BackgroundWorker started successfully."); - // Ensures that the last character on the extraction path // is the directory separator char. // Without this, a malicious zip file could try to traverse outside of the expected // extraction path. if (!extractionPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) + { + extractionPath += Path.DirectorySeparatorChar; + } + var archive = ZipFile.OpenRead(zipPath); + + var entries = archive.Entries; + + try + { + int progress = 0; + + if (clearAppDirectory) { - extractionPath += Path.DirectorySeparatorChar; + _logBuilder.AppendLine($"Removing all files and folders from \"{extractionPath}\"."); + DirectoryInfo directoryInfo = new DirectoryInfo(extractionPath); + + foreach (FileInfo file in directoryInfo.GetFiles()) + { + _logBuilder.AppendLine($"Removing a file located at \"{file.FullName}\"."); + _backgroundWorker.ReportProgress(0, string.Format(Resources.Removing, file.FullName)); + file.Delete(); + } + foreach (DirectoryInfo directory in directoryInfo.GetDirectories()) + { + _logBuilder.AppendLine($"Removing a directory located at \"{directory.FullName}\" and all its contents."); + _backgroundWorker.ReportProgress(0, string.Format(Resources.Removing, directory.FullName)); + directory.Delete(true); + } } - var archive = ZipFile.OpenRead(zipPath); - - var entries = archive.Entries; - try + _logBuilder.AppendLine($"Found total of {entries.Count} files and folders inside the zip file."); + + for (var index = 0; index < entries.Count; index++) { - int progress = 0; - - if (clearAppDirectory) + if (_backgroundWorker.CancellationPending) { - _logBuilder.AppendLine($"Removing all files and folders from {extractionPath}."); - DirectoryInfo directoryInfo = new DirectoryInfo(extractionPath); - - foreach (FileInfo file in directoryInfo.GetFiles()) - { - _logBuilder.AppendLine($"Removing a file located at {file.FullName}."); - _backgroundWorker.ReportProgress(0, string.Format(Resources.Removing, file.FullName)); - file.Delete(); - } - foreach (DirectoryInfo directory in directoryInfo.GetDirectories()) - { - _logBuilder.AppendLine($"Removing a directory located at {directory.FullName} and all its contents."); - _backgroundWorker.ReportProgress(0, string.Format(Resources.Removing, directory.FullName)); - directory.Delete(true); - } + eventArgs.Cancel = true; + break; } - _logBuilder.AppendLine($"Found total of {entries.Count} files and folders inside the zip file."); - - for (var index = 0; index < entries.Count; index++) - { - if (_backgroundWorker.CancellationPending) - { - eventArgs.Cancel = true; - break; - } + var entry = entries[index]; - var entry = entries[index]; - - string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FullName); - _backgroundWorker.ReportProgress(progress, currentFile); - int retries = 0; - bool notCopied = true; - while (notCopied) + string currentFile = string.Format(Resources.CurrentFileExtracting, entry.FullName); + _backgroundWorker.ReportProgress(progress, currentFile); + int retries = 0; + bool notCopied = true; + while (notCopied) + { + string filePath = String.Empty; + try { - string filePath = String.Empty; - try + filePath = Path.Combine(extractionPath, entry.FullName); + if (!entry.IsDirectory()) { - filePath = Path.Combine(extractionPath, entry.FullName); - if (!entry.IsDirectory()) + var parentDirectory = Path.GetDirectoryName(filePath); + if (!Directory.Exists(parentDirectory)) { - var parentDirectory = Path.GetDirectoryName(filePath); - if (!Directory.Exists(parentDirectory)) - { - Directory.CreateDirectory(parentDirectory); - } - entry.ExtractToFile(filePath, true); + Directory.CreateDirectory(parentDirectory); } - notCopied = false; + entry.ExtractToFile(filePath, true); } - catch (IOException exception) + notCopied = false; + } + catch (IOException exception) + { + const int errorSharingViolation = 0x20; + const int errorLockViolation = 0x21; + var errorCode = Marshal.GetHRForException(exception) & 0x0000FFFF; + if (errorCode is errorSharingViolation or errorLockViolation) { - const int errorSharingViolation = 0x20; - const int errorLockViolation = 0x21; - var errorCode = Marshal.GetHRForException(exception) & 0x0000FFFF; - if (errorCode is errorSharingViolation or errorLockViolation) + retries++; + if (retries > MaxRetries) + { + throw; + } + + List lockingProcesses = null; + if (Environment.OSVersion.Version.Major >= 6 && retries >= 2) { - retries++; - if (retries > MaxRetries) + try { - throw; + lockingProcesses = FileUtil.WhoIsLocking(filePath); } - - List lockingProcesses = null; - if (Environment.OSVersion.Version.Major >= 6 && retries >= 2) + catch (Exception) { - try - { - lockingProcesses = FileUtil.WhoIsLocking(filePath); - } - catch (Exception) - { // ignored } - } + } - if (lockingProcesses == null) - { - Thread.Sleep(5000); - } - else + if (lockingProcesses == null) + { + Thread.Sleep(5000); + } + else + { + foreach (var lockingProcess in lockingProcesses) { - foreach (var lockingProcess in lockingProcesses) + var dialogResult = MessageBox.Show( + string.Format(Resources.FileStillInUseMessage, + lockingProcess.ProcessName, filePath), + Resources.FileStillInUseCaption, + MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); + if (dialogResult == DialogResult.Cancel) { - var dialogResult = MessageBox.Show( - string.Format(Resources.FileStillInUseMessage, - lockingProcess.ProcessName, filePath), - Resources.FileStillInUseCaption, - MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); - if (dialogResult == DialogResult.Cancel) - { - throw; - } + throw; } } } - else - { - throw; - } + } + else + { + throw; } } + } - progress = (index + 1) * 100 / entries.Count; - _backgroundWorker.ReportProgress(progress, currentFile); + progress = (index + 1) * 100 / entries.Count; + _backgroundWorker.ReportProgress(progress, currentFile); - _logBuilder.AppendLine($"{currentFile} [{progress}%]"); - } - } - finally - { - archive.Dispose(); + _logBuilder.AppendLine($"{currentFile} [{progress}%]"); } - }; + } + finally + { + archive.Dispose(); + } + }; - _backgroundWorker.ProgressChanged += (_, eventArgs) => + _backgroundWorker.ProgressChanged += (_, eventArgs) => + { + progressBar.Value = eventArgs.ProgressPercentage; + textBoxInformation.Text = eventArgs.UserState?.ToString(); + if (textBoxInformation.Text != null) { - progressBar.Value = eventArgs.ProgressPercentage; - textBoxInformation.Text = eventArgs.UserState?.ToString(); - if (textBoxInformation.Text != null) - { - textBoxInformation.SelectionStart = textBoxInformation.Text.Length; - textBoxInformation.SelectionLength = 0; - } - }; + textBoxInformation.SelectionStart = textBoxInformation.Text.Length; + textBoxInformation.SelectionLength = 0; + } + }; - _backgroundWorker.RunWorkerCompleted += (_, eventArgs) => + _backgroundWorker.RunWorkerCompleted += (_, eventArgs) => + { + try { - try + if (eventArgs.Error != null) { - if (eventArgs.Error != null) - { - throw eventArgs.Error; - } + throw eventArgs.Error; + } - if (!eventArgs.Cancelled) + if (!eventArgs.Cancelled) + { + textBoxInformation.Text = @"Finished"; + try { - textBoxInformation.Text = @"Finished"; - try + ProcessStartInfo processStartInfo = new ProcessStartInfo(executablePath); + if (!string.IsNullOrEmpty(commandLineArgs)) { - ProcessStartInfo processStartInfo = new ProcessStartInfo(executablePath); - if (!string.IsNullOrEmpty(commandLineArgs)) - { - processStartInfo.Arguments = commandLineArgs; - } + processStartInfo.Arguments = commandLineArgs; + } - Process.Start(processStartInfo); + Process.Start(processStartInfo); - _logBuilder.AppendLine("Successfully launched the updated application."); - } - catch (Win32Exception exception) + _logBuilder.AppendLine("Successfully launched the updated application."); + } + catch (Win32Exception exception) + { + if (exception.NativeErrorCode != 1223) { - if (exception.NativeErrorCode != 1223) - { - throw; - } + throw; } } } - catch (Exception exception) - { - _logBuilder.AppendLine(); - _logBuilder.AppendLine(exception.ToString()); + } + catch (Exception exception) + { + _logBuilder.AppendLine(); + _logBuilder.AppendLine(exception.ToString()); - MessageBox.Show(exception.Message, exception.GetType().ToString(), - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - finally - { - _logBuilder.AppendLine(); - Application.Exit(); - } - }; + MessageBox.Show(exception.Message, exception.GetType().ToString(), + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + _logBuilder.AppendLine(); + Application.Exit(); + } + }; - _backgroundWorker.RunWorkerAsync(); - } + _backgroundWorker.RunWorkerAsync(); } private void FormMain_FormClosing(object sender, FormClosingEventArgs e) diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 59d859ef..18894b75 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2022 RBSoft - 1.3.1.0 - 1.3.1.0 - 1.3.1.0 - 1.3.1.0 + 1.3.2.0 + 1.3.2.0 + 1.3.2.0 + 1.3.2.0 ZipExtractor.ico app.manifest true diff --git a/appveyor.yml b/appveyor.yml index ef5e94f2..ab162922 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.3.{build} +version: 1.7.4.{build} environment: - my_version: 1.7.3 + my_version: 1.7.4 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From be241529c00b7f4b6f11bd298a9ecebf6bf0e063 Mon Sep 17 00:00:00 2001 From: ptdev Date: Wed, 13 Jul 2022 07:18:24 +0100 Subject: [PATCH 45/93] Clear cache and add user-agent on WebView2 changelog request (#550) --- AutoUpdater.NET/UpdateForm.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index e5e8b2be..664e37c3 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -89,6 +89,8 @@ private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebV webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; webView2.CoreWebView2.Settings.IsStatusBarEnabled = false; webView2.CoreWebView2.Settings.AreDevToolsEnabled = Debugger.IsAttached; + webView2.CoreWebView2.Settings.UserAgent = AutoUpdater.GetUserAgent(); + webView2.CoreWebView2.Profile.ClearBrowsingDataAsync(); webView2.Show(); webView2.BringToFront(); if (null != AutoUpdater.BasicAuthChangeLog) From 28a17bc9a662af7ab348b89bbf75ae99b571ffda Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 18 Aug 2022 12:25:35 +0530 Subject: [PATCH 46/93] Added build steps for local development in README. --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index c026e72c..bcf9aa22 100644 --- a/README.md +++ b/README.md @@ -451,3 +451,25 @@ private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) } } ```` + +## Steps to build it for further development + +You can follow below steps to build the project on your local development environment. + +* Disable signing from project properties of both AutoUpdater.NET and ZipExtractor. +* Edit both .csproj file of AutoUpdater.NET and ZipExtractor and change following line. Use .NET version you prefer. + + Before + + ```xml + net45;netcoreapp3.1;net5.0-windows + ``` + + After + + ```xml + net5.0-windows + ``` + +* Build ZipExtractor project in "Release" configuration to create the executable in Resources folder. +* VS2022 doesn't allow building .NET Framework 4.5 by default, so if you are using it then you can just change it to any supported .NET version, or you have to follow steps from [here](https://stackoverflow.com/a/70109092/1273550) to use .NET Framework 4.5. From 4e033871c45be17076b64ef69b683903e17b1532 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 21 Aug 2022 15:02:17 +0530 Subject: [PATCH 47/93] Fixed an issue where command line arguments with spaces wasn't passed correctly to the ZipExtractor. This resolves #562. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++++---- AutoUpdater.NET/DownloadUpdateDialog.cs | 2 +- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- appveyor.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index f06f84de..ed6425b6 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2022 RBSoft - 1.7.4.0 - 1.7.4.0 - 1.7.4.0 + 1.7.5.0 + 1.7.5.0 + 1.7.5.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.4.0 + 1.7.5.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 9d358f7b..ce7741fb 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -169,7 +169,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent arguments.Append(" --args \""); } - arguments.Append(args[i]); + arguments.Append($"\"{args[i]}\""); arguments.Append(i.Equals(args.Length - 1) ? "\"" : " "); } diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 94fc64d8..e4cf5378 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.4.0 + 1.7.5.0 AutoUpdater.NET rbsoft false diff --git a/appveyor.yml b/appveyor.yml index ab162922..df8eb149 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.4.{build} +version: 1.7.5.{build} environment: - my_version: 1.7.4 + my_version: 1.7.5 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 72fcdec5e200041c13f41fd02411769de2cf12b4 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Tue, 23 Aug 2022 21:44:30 +0530 Subject: [PATCH 48/93] Now using temporary folder as WebView2 user data folder to avoid issues when using it with VSTO addin. This resolves #558. --- AutoUpdater.NET/UpdateForm.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 664e37c3..b97a4b64 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -18,7 +18,6 @@ public UpdateForm(UpdateInfoEventArgs args) _args = args; InitializeComponent(); InitializeBrowserControl(); - UseLatestIE(); buttonSkip.Visible = AutoUpdater.ShowSkipButton; buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton; var resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm)); @@ -36,7 +35,7 @@ public UpdateForm(UpdateInfoEventArgs args) } } - private void InitializeBrowserControl() + private async void InitializeBrowserControl() { if (string.IsNullOrEmpty(_args.ChangelogURL)) { @@ -67,10 +66,11 @@ private void InitializeBrowserControl() { webBrowser.Hide(); webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; - webView2.EnsureCoreWebView2Async(); + await webView2.EnsureCoreWebView2Async(await CoreWebView2Environment.CreateAsync(null, Path.GetTempPath())); } else { + UseLatestIE(); if (null != AutoUpdater.BasicAuthChangeLog) { webBrowser.Navigate(_args.ChangelogURL, "", null, @@ -86,6 +86,15 @@ private void InitializeBrowserControl() private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { + if (!e.IsSuccess) + { + if (AutoUpdater.ReportErrors) + { + MessageBox.Show(e.InitializationException.Message, e.InitializationException.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); + } + return; + } + webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; webView2.CoreWebView2.Settings.IsStatusBarEnabled = false; webView2.CoreWebView2.Settings.AreDevToolsEnabled = Debugger.IsAttached; From bc7ea8c26d6d6b48d37cd1907e83a40211e7558b Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 24 Aug 2022 19:21:21 +0530 Subject: [PATCH 49/93] Updated WebView2 to latest version. --- .gitignore | 8 ++++++++ AutoUpdater.NET/AutoUpdater.NET.csproj | 2 +- AutoUpdater.NET/AutoUpdater.cs | 2 +- AutoUpdater.NET/DownloadUpdateDialog.cs | 2 +- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 6 +++--- ZipExtractor/FormMain.cs | 2 +- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 1930c402..2f97a261 100644 --- a/.gitignore +++ b/.gitignore @@ -251,4 +251,12 @@ paket-files/ .idea/ *.sln.iml *.snk + +# AutoUpdater.NET /AutoUpdater.NET/build/lib/ +/AutoUpdater.NET/Resources/ZipExtractor.exe +/AutoUpdater.NET/Resources/ZipExtractor.exe.config +/AutoUpdater.NET/Resources/ZipExtractor.runtimeconfig.json +/AutoUpdater.NET/Resources/ZipExtractor.runtimeconfig.dev.json +/AutoUpdater.NET/Resources/ZipExtractor.dll +/AutoUpdater.NET/Resources/ZipExtractor.deps.json diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index ed6425b6..d32faaff 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -53,6 +53,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 2d84bc64..3f21c949 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -387,7 +387,7 @@ private static object CheckUpdate(Assembly mainAssembly) throw new MissingFieldException(); } - args.InstalledVersion = InstalledVersion != null ? InstalledVersion : mainAssembly.GetName().Version; + args.InstalledVersion = InstalledVersion ?? mainAssembly.GetName().Version; args.IsUpdateAvailable = new Version(args.CurrentVersion) > args.InstalledVersion; if (!Mandatory) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index ce7741fb..7f0c2a9f 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -102,7 +102,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } ContentDisposition contentDisposition = null; - if (!String.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) + if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) { contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); } diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index e4cf5378..4e58c46b 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -15,13 +15,13 @@ autoupdate updater c# vb wpf winforms - + - + - + diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index ec004fc3..882ae216 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -149,7 +149,7 @@ private void FormMain_Shown(object sender, EventArgs e) bool notCopied = true; while (notCopied) { - string filePath = String.Empty; + string filePath = string.Empty; try { filePath = Path.Combine(extractionPath, entry.FullName); From 51bd61ab6b17427cc024d937c41912170af26d88 Mon Sep 17 00:00:00 2001 From: przemo20 Date: Wed, 24 Aug 2022 16:00:41 +0200 Subject: [PATCH 50/93] Updated Polish translation (#563) --- AutoUpdater.NET/DownloadUpdateDialog.pl.resx | 4 +- AutoUpdater.NET/Properties/Resources.pl.resx | 292 +++++++++---------- AutoUpdater.NET/RemindLaterForm.pl.resx | 29 +- AutoUpdater.NET/UpdateForm.pl.resx | 14 +- 4 files changed, 171 insertions(+), 168 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.pl.resx b/AutoUpdater.NET/DownloadUpdateDialog.pl.resx index eccbbbc8..513f1191 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.pl.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.pl.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Pobieranie aktualizacji... diff --git a/AutoUpdater.NET/Properties/Resources.pl.resx b/AutoUpdater.NET/Properties/Resources.pl.resx index 2d64036b..92c59a8a 100644 --- a/AutoUpdater.NET/Properties/Resources.pl.resx +++ b/AutoUpdater.NET/Properties/Resources.pl.resx @@ -1,147 +1,147 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Nie ma dostępnej aktualizacji. Spróbuj ponownie później. - - - Aktualizacja niedostępna - - - Wystąpił problem z aktualizacją serwera. Sprawdź połączenie internetowe i spróbuj ponownie później. - - - Aktualizacja nie powiodła się - - - Różne sumy kontrolne - - - Sprawdzenie integralności plików nie powiodło się i odnotowano pewne błędy. - - - Nieuzupełniony Algorytm Hasha Algorytmu - - - Algorytm Hash dostarczony w pliku XML nie jest obsługiwany. - - - Pobranie pod adresem {0}/s - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Brak dostępnych aktualizacji. Spróbuj ponownie później. + + + Aktualizacja niedostępna + + + Nie można nawiązać połączenia z serwerem aktualizacji. Sprawdź połączenie internetowe i spróbuj ponownie później. + + + Sprawdzanie aktualizacji nieudane + + + Algorytm wyznaczania wartości skrótu podany w pliku XML jest nieobsługiwany. + + + Nieobsługiwany algorytm skrótu + + + Weryfikacja spójności plików nie powiodła się i zwróciła błędy. + + + Różne sumy kontrolne + + + Szybkość pobierania: {0}/s + \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.pl.resx b/AutoUpdater.NET/RemindLaterForm.pl.resx index 15e2d48a..242ba341 100644 --- a/AutoUpdater.NET/RemindLaterForm.pl.resx +++ b/AutoUpdater.NET/RemindLaterForm.pl.resx @@ -112,45 +112,48 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Nie, Pobierz aktualizacje teraz (zalecane) + Nie, pobierz aktualizacje teraz (zalecane) - Po 30 minutach + 30 minut - Po 12 godzinach + 12 godzin - Po 1 dniu + 1 dzień - Po 2 dniach + 2 dni - Po 4 dniach + 4 dni - Po 8 dniach + 8 dni - Po 10 dniach + 10 dni - Tak, proszę przypomnij mi później: + Tak, przypomnij mi za: - Należy pobrać aktualizacje teraz. To zajmuje tylko kilka minut, w zależności od połączenia internetowego i zapewnia, masz najnowszą wersję aplikacji. + Zaleca się pobranie aktualizacji już teraz. Ten proces może potrwać kilka minut, w zależności od szybkości połączenia internetowego, i zapewnia, że masz najnowszą wersję programu. + + + OK Czy chcesz pobrać aktualizacje później? - Przypomnij mi później do aktualizacji + Przypomnij mi później \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.pl.resx b/AutoUpdater.NET/UpdateForm.pl.resx index 431fd3a1..31b88037 100644 --- a/AutoUpdater.NET/UpdateForm.pl.resx +++ b/AutoUpdater.NET/UpdateForm.pl.resx @@ -121,21 +121,21 @@ Nowa wersja programu {0} jest dostępna! - Program {0} {1} jest już dostępny. Masz zainstalowaną wersję {2}. Chcesz ją ściągnąć? + Program {0} jest dostępny w wersji {1} (obecnie masz wersję {2}). Czy chcesz teraz pobrać nową wersję? + + + Informacje o wersji: - Aktualizacja + Zainstaluj aktualizację Przypomnij mi później - Pominąć tę wersję + Pomiń tę wersję - Aktualizacja programu {0} {1} jest dostępna! - - - Release Uwagi: + {0} {1} już jest! \ No newline at end of file From 882495a2273ca760bae2f66b22ee7f89cf4b4f7e Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 8 Sep 2022 11:36:20 +0530 Subject: [PATCH 51/93] Fixed an issue preventing it from downloading the XML file if previous attempt was resulted in an error. This resolves #574. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 10 +++++----- AutoUpdater.NET/AutoUpdater.cs | 6 ++++-- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 8 ++++---- appveyor.yml | 4 ++-- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index d32faaff..5446a107 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2022 RBSoft - 1.7.5.0 - 1.7.5.0 - 1.7.5.0 + 1.7.6.0 + 1.7.6.0 + 1.7.6.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.5.0 + 1.7.6.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. @@ -53,6 +53,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 3f21c949..00a7d927 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -331,9 +331,9 @@ public static void Start(string appCast, Assembly myAssembly = null) return; } } - } - Running = false; + Running = false; + } }; backgroundWorker.RunWorkerAsync(assembly); @@ -518,6 +518,8 @@ private static void ShowError(Exception exception) } } } + + Running = false; } /// diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 4e58c46b..4bcc3e67 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.5.0 + 1.7.6.0 AutoUpdater.NET rbsoft false @@ -15,13 +15,13 @@ autoupdate updater c# vb wpf winforms - + - + - + diff --git a/appveyor.yml b/appveyor.yml index df8eb149..6e219c5d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.5.{build} +version: 1.7.6.{build} environment: - my_version: 1.7.5 + my_version: 1.7.6 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 223d4af11a8cbcadfdf97ae2f58546846d0ad9f8 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 8 Sep 2022 16:36:41 +0530 Subject: [PATCH 52/93] Added support for .NET 6.0. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 2 +- AutoUpdater.NET/RegistryPersistenceProvider.cs | 11 +++++++++-- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 6 ++++++ ZipExtractor/ZipExtractor.csproj | 2 +- appveyor.yml | 2 ++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 5446a107..2a23da74 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -3,7 +3,7 @@ {FB9E7E6B-B19F-4F37-A708-2996190CEF13} library - net45;netcoreapp3.1;net5.0-windows + net45;netcoreapp3.1;net5.0-windows;net6.0-windows true true AutoUpdaterDotNET diff --git a/AutoUpdater.NET/RegistryPersistenceProvider.cs b/AutoUpdater.NET/RegistryPersistenceProvider.cs index 0577bec6..4fd6eeb6 100644 --- a/AutoUpdater.NET/RegistryPersistenceProvider.cs +++ b/AutoUpdater.NET/RegistryPersistenceProvider.cs @@ -60,8 +60,15 @@ public Version GetSkippedVersion() if (remindLaterValue != null) { - return Convert.ToDateTime(remindLaterValue.ToString(), - CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat); + try + { + return Convert.ToDateTime(remindLaterValue.ToString(), + CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat); + } + catch (FormatException) + { + // ignored + } } return null; diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 4bcc3e67..dfda8b9c 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -23,6 +23,9 @@ + + + @@ -31,6 +34,9 @@ + + + diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 18894b75..4d0ac9a4 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,7 +3,7 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net45;netcoreapp3.1;net5.0-windows + net45;netcoreapp3.1;net5.0-windows;net6.0-windows true ZipExtractor RBSoft diff --git a/appveyor.yml b/appveyor.yml index 6e219c5d..c3f640fb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,6 +18,8 @@ install: - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" +- dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" +- dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" From 100f3281589c3ded46b0c57714c50a5fcb7d87be Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 8 Sep 2022 16:42:01 +0530 Subject: [PATCH 53/93] Now using Visual Studio 2022 image for appveyor build. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index c3f640fb..7a57f32f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,7 @@ environment: my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true -image: Visual Studio 2019 +image: Visual Studio 2022 clone_folder: c:\projects\AutoUpdater.NET build: off install: From 173c66a239e0d155d5ba1744a3e9a61afb0f1297 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 9 Oct 2022 17:08:33 +0530 Subject: [PATCH 54/93] Renamed zh-tw to zh-TW to prevent warnings when using .NET 7. This resolves #581. --- ...oadUpdateDialog.zh-tw.resx => DownloadUpdateDialog.zh-TW.resx} | 0 .../Properties/{Resources.zh-tw.resx => Resources.zh-TW.resx} | 0 .../{RemindLaterForm.zh-tw.resx => RemindLaterForm.zh-TW.resx} | 0 AutoUpdater.NET/{UpdateForm.zh-tw.resx => UpdateForm.zh-TW.resx} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename AutoUpdater.NET/{DownloadUpdateDialog.zh-tw.resx => DownloadUpdateDialog.zh-TW.resx} (100%) rename AutoUpdater.NET/Properties/{Resources.zh-tw.resx => Resources.zh-TW.resx} (100%) rename AutoUpdater.NET/{RemindLaterForm.zh-tw.resx => RemindLaterForm.zh-TW.resx} (100%) rename AutoUpdater.NET/{UpdateForm.zh-tw.resx => UpdateForm.zh-TW.resx} (100%) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.zh-tw.resx b/AutoUpdater.NET/DownloadUpdateDialog.zh-TW.resx similarity index 100% rename from AutoUpdater.NET/DownloadUpdateDialog.zh-tw.resx rename to AutoUpdater.NET/DownloadUpdateDialog.zh-TW.resx diff --git a/AutoUpdater.NET/Properties/Resources.zh-tw.resx b/AutoUpdater.NET/Properties/Resources.zh-TW.resx similarity index 100% rename from AutoUpdater.NET/Properties/Resources.zh-tw.resx rename to AutoUpdater.NET/Properties/Resources.zh-TW.resx diff --git a/AutoUpdater.NET/RemindLaterForm.zh-tw.resx b/AutoUpdater.NET/RemindLaterForm.zh-TW.resx similarity index 100% rename from AutoUpdater.NET/RemindLaterForm.zh-tw.resx rename to AutoUpdater.NET/RemindLaterForm.zh-TW.resx diff --git a/AutoUpdater.NET/UpdateForm.zh-tw.resx b/AutoUpdater.NET/UpdateForm.zh-TW.resx similarity index 100% rename from AutoUpdater.NET/UpdateForm.zh-tw.resx rename to AutoUpdater.NET/UpdateForm.zh-TW.resx From ab843aa8e7a8786276edf10a2dce13c0af274dee Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Tue, 1 Nov 2022 21:44:29 +0530 Subject: [PATCH 55/93] Removed packages.config from the project because it is no longer necessary. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 6 ++---- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 8 ++++---- AutoUpdater.NET/packages.config | 4 ---- 3 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 AutoUpdater.NET/packages.config diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 2a23da74..96730dba 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -48,11 +48,9 @@ - - all - + - + \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index dfda8b9c..877eaf40 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -15,16 +15,16 @@ autoupdate updater c# vb wpf winforms - + - + - + - + diff --git a/AutoUpdater.NET/packages.config b/AutoUpdater.NET/packages.config deleted file mode 100644 index 86ad4c1e..00000000 --- a/AutoUpdater.NET/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From f746142c497d8807ae1adc43d4e6cfc5fb2b0440 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 24 Feb 2023 14:17:08 +0530 Subject: [PATCH 56/93] Now handling any exception thrown while checking for WebView2. This resolves #605. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 12 ++++++------ AutoUpdater.NET/UpdateForm.cs | 2 +- .../build/Autoupdater.NET.Official.nuspec | 12 ++++++------ LICENSE | 2 +- ZipExtractor/ZipExtractor.csproj | 2 +- appveyor.yml | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 96730dba..09d2c779 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -10,17 +10,17 @@ AutoUpdater.NET RBSoft AutoUpdater.NET - Copyright © 2012-2022 RBSoft - 1.7.6.0 - 1.7.6.0 - 1.7.6.0 + Copyright © 2012-2023 RBSoft + 1.7.7.0 + 1.7.7.0 + 1.7.7.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.6.0 + 1.7.7.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. @@ -51,6 +51,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index b97a4b64..c10d73e7 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -58,7 +58,7 @@ private async void InitializeBrowserControl() webView2RuntimeFound = true; } } - catch (WebView2RuntimeNotFoundException) + catch (Exception) { // ignored } diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 877eaf40..86c41500 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.6.0 + 1.7.7.0 AutoUpdater.NET rbsoft false @@ -11,20 +11,20 @@ https://github.com/ravibpatel/AutoUpdater.NET AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. https://github.com/ravibpatel/AutoUpdater.NET/releases - Copyright © 2012-2022 RBSoft + Copyright © 2012-2023 RBSoft autoupdate updater c# vb wpf winforms - + - + - + - + diff --git a/LICENSE b/LICENSE index 96325811..3e4ea36b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2022 RBSoft +Copyright (c) 2012-2023 RBSoft Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 4d0ac9a4..09df56fe 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -8,7 +8,7 @@ ZipExtractor RBSoft ZipExtractor - Copyright © 2012-2022 RBSoft + Copyright © 2012-2023 RBSoft 1.3.2.0 1.3.2.0 1.3.2.0 diff --git a/appveyor.yml b/appveyor.yml index 7a57f32f..534b32fb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.6.{build} +version: 1.7.7.{build} environment: - my_version: 1.7.6 + my_version: 1.7.7 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From fc9686ca520e6d133a03261fbb78d2fa8773321f Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 10 Mar 2023 10:58:07 +0530 Subject: [PATCH 57/93] Fixed an issue causing ZipExtractor to fail with System.UnauthorizedAccessException if the files it is trying to replace are hidden. This fixes #601. --- README.md | 2 ++ ZipExtractor/FormMain.cs | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bcf9aa22..adfd8403 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,8 @@ There are two things you need to provide in XML file as you can see above. Update file Checksum ```` +You can also use the XML creator tool created by one of the user to create the XML file. You can download it from [here](https://github.com/DwainSnickles/AutoUpdater.NET.XML-Creator-master/blob/master/AutoUpdaterXML.zip). + ### Adding one line to make it work After you done creating and uploading XML file, It is very easy to add a auto update functionality to your application. First you need to add following line at the top of your form. diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 882ae216..124a61df 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -160,7 +160,15 @@ private void FormMain_Shown(object sender, EventArgs e) { Directory.CreateDirectory(parentDirectory); } - entry.ExtractToFile(filePath, true); + using (Stream destination = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) + { + using Stream stream = entry.Open(); + stream.CopyTo(destination); + stream.Flush(); + destination.SetLength(destination.Position); + } + + File.SetLastWriteTime(filePath, entry.LastWriteTime.DateTime); } notCopied = false; } From 7da937ec7ebfba96161066cbf137fae67610a25e Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 13 Mar 2023 14:07:48 +0530 Subject: [PATCH 58/93] No longer flushing the stream while extracing files from zip. --- ZipExtractor/FormMain.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 124a61df..5053d2e4 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -164,7 +164,6 @@ private void FormMain_Shown(object sender, EventArgs e) { using Stream stream = entry.Open(); stream.CopyTo(destination); - stream.Flush(); destination.SetLength(destination.Position); } From 36b569c7357b270f24eb55f6c218364e38c979f0 Mon Sep 17 00:00:00 2001 From: Aeon512 Date: Fri, 31 Mar 2023 07:58:52 +0200 Subject: [PATCH 59/93] Fall-back for wrongly formated content-disposition headers (#610) Co-authored-by: Florian Hug --- AutoUpdater.NET/DownloadUpdateDialog.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 7f0c2a9f..0c5bcc8d 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -101,10 +101,19 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent CompareChecksum(_tempFile, _args.CheckSum); } + // try to parse the content disposition header if it exists ContentDisposition contentDisposition = null; - if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) + try + { + if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) + { + contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); + } + } + catch (FormatException) { - contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); + // ignore content disposition header if it is wrongly formated + contentDisposition = null; } var fileName = string.IsNullOrEmpty(contentDisposition?.FileName) From ee34a9695bcf2993d27f9cbde405b0b81f640128 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 31 Mar 2023 17:33:08 +0530 Subject: [PATCH 60/93] Now showing an error dialog if it can't determine the filename of the update file. This resolves #589. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++-- AutoUpdater.NET/DownloadUpdateDialog.cs | 21 +++++---- AutoUpdater.NET/DownloadUpdateDialog.de.resx | 2 +- AutoUpdater.NET/DownloadUpdateDialog.lv.resx | 2 +- .../DownloadUpdateDialog.pt-BR.resx | 2 +- AutoUpdater.NET/DownloadUpdateDialog.pt.resx | 2 +- .../Properties/Resources.Designer.cs | 9 ++++ AutoUpdater.NET/Properties/Resources.ar.resx | 3 ++ AutoUpdater.NET/Properties/Resources.cs.resx | 3 ++ AutoUpdater.NET/Properties/Resources.da.resx | 3 ++ AutoUpdater.NET/Properties/Resources.de.resx | 3 ++ AutoUpdater.NET/Properties/Resources.es.resx | 3 ++ AutoUpdater.NET/Properties/Resources.fr.resx | 3 ++ AutoUpdater.NET/Properties/Resources.it.resx | 3 ++ .../Properties/Resources.ja-JP.resx | 3 ++ AutoUpdater.NET/Properties/Resources.ko.resx | 3 ++ AutoUpdater.NET/Properties/Resources.lv.resx | 3 ++ AutoUpdater.NET/Properties/Resources.nl.resx | 3 ++ AutoUpdater.NET/Properties/Resources.pl.resx | 3 ++ .../Properties/Resources.pt-BR.resx | 5 ++- AutoUpdater.NET/Properties/Resources.pt.resx | 44 +++++++++++++++++++ AutoUpdater.NET/Properties/Resources.resx | 3 ++ AutoUpdater.NET/Properties/Resources.ru.resx | 3 ++ AutoUpdater.NET/Properties/Resources.sk.resx | 3 ++ AutoUpdater.NET/Properties/Resources.sv.resx | 3 ++ AutoUpdater.NET/Properties/Resources.th.resx | 3 ++ AutoUpdater.NET/Properties/Resources.tr.resx | 44 +++++++++++++++++++ AutoUpdater.NET/Properties/Resources.zh.resx | 3 ++ AutoUpdater.NET/RemindLaterForm.pl.resx | 3 -- AutoUpdater.NET/RemindLaterForm.pt-BR.resx | 3 -- AutoUpdater.NET/RemindLaterForm.pt.resx | 3 -- .../build/Autoupdater.NET.Official.nuspec | 2 +- ZipExtractor/ZipExtractor.csproj | 8 ++-- appveyor.yml | 4 +- 34 files changed, 183 insertions(+), 33 deletions(-) create mode 100644 AutoUpdater.NET/Properties/Resources.pt.resx create mode 100644 AutoUpdater.NET/Properties/Resources.tr.resx diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 09d2c779..c00df5a4 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2023 RBSoft - 1.7.7.0 - 1.7.7.0 - 1.7.7.0 + 1.7.8.0 + 1.7.8.0 + 1.7.8.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.7.0 + 1.7.8.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 0c5bcc8d..04903096 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -101,25 +101,30 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent CompareChecksum(_tempFile, _args.CheckSum); } - // try to parse the content disposition header if it exists + // Try to parse the content disposition header if it exists. ContentDisposition contentDisposition = null; - try + if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) { - if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) + try { contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); } - } - catch (FormatException) - { - // ignore content disposition header if it is wrongly formated - contentDisposition = null; + catch (FormatException) + { + // Ignore content disposition header if it is wrongly formatted. + contentDisposition = null; + } } var fileName = string.IsNullOrEmpty(contentDisposition?.FileName) ? Path.GetFileName(_webClient.ResponseUri.LocalPath) : contentDisposition.FileName; + if (string.IsNullOrWhiteSpace(fileName)) + { + throw new WebException(Resources.UnableToDetermineFilenameMessage); + } + var tempPath = Path.Combine( string.IsNullOrEmpty(AutoUpdater.DownloadPath) ? Path.GetTempPath() : AutoUpdater.DownloadPath, diff --git a/AutoUpdater.NET/DownloadUpdateDialog.de.resx b/AutoUpdater.NET/DownloadUpdateDialog.de.resx index a59e4c05..62819d26 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.de.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.de.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Software Update + Software-Aktualisierung Update wird heruntergeladen... diff --git a/AutoUpdater.NET/DownloadUpdateDialog.lv.resx b/AutoUpdater.NET/DownloadUpdateDialog.lv.resx index 5704759f..b91587ae 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.lv.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.lv.resx @@ -120,7 +120,7 @@ Programmatūras atjauninājums - + Lejupielādē atjauninājumu... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx b/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx index d7d4cb33..55a683b1 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx @@ -120,7 +120,7 @@ Atualização de software - + Baixando a atualização... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.pt.resx b/AutoUpdater.NET/DownloadUpdateDialog.pt.resx index ef25e36e..9366b5c2 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.pt.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.pt.resx @@ -120,7 +120,7 @@ Atualização de software - + A transferir a atualização... \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.Designer.cs b/AutoUpdater.NET/Properties/Resources.Designer.cs index 6dbf3f9d..195b9e6f 100644 --- a/AutoUpdater.NET/Properties/Resources.Designer.cs +++ b/AutoUpdater.NET/Properties/Resources.Designer.cs @@ -175,6 +175,15 @@ internal static System.Drawing.Bitmap update { } } + /// + /// Looks up a localized string similar to Unable to determine the filename of the update file!. + /// + internal static string UnableToDetermineFilenameMessage { + get { + return ResourceManager.GetString("UnableToDetermineFilenameMessage", resourceCulture); + } + } + /// /// Looks up a localized string similar to Update Check Failed. /// diff --git a/AutoUpdater.NET/Properties/Resources.ar.resx b/AutoUpdater.NET/Properties/Resources.ar.resx index d7647462..37e67eb9 100644 --- a/AutoUpdater.NET/Properties/Resources.ar.resx +++ b/AutoUpdater.NET/Properties/Resources.ar.resx @@ -144,4 +144,7 @@ لا يوجد تحديث متاح. الرجاء معاودة المحاولة في وقت لاحق. + + تعذر تحديد اسم ملف التحديث! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.cs.resx b/AutoUpdater.NET/Properties/Resources.cs.resx index edf36046..2fd65c15 100644 --- a/AutoUpdater.NET/Properties/Resources.cs.resx +++ b/AutoUpdater.NET/Properties/Resources.cs.resx @@ -144,4 +144,7 @@ Stahování na {0}/s + + Nelze určit název souboru aktualizace! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.da.resx b/AutoUpdater.NET/Properties/Resources.da.resx index 03888146..7cafdb4e 100644 --- a/AutoUpdater.NET/Properties/Resources.da.resx +++ b/AutoUpdater.NET/Properties/Resources.da.resx @@ -144,4 +144,7 @@ Downloader ved {0}/s + + Kan ikke bestemme filnavnet på opdateringsfilen! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.de.resx b/AutoUpdater.NET/Properties/Resources.de.resx index 89006339..c6542d47 100644 --- a/AutoUpdater.NET/Properties/Resources.de.resx +++ b/AutoUpdater.NET/Properties/Resources.de.resx @@ -144,4 +144,7 @@ Herunterladen bei {0}/s + + Der Dateiname der Update-Datei kann nicht ermittelt werden! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.es.resx b/AutoUpdater.NET/Properties/Resources.es.resx index 78546781..19f54519 100644 --- a/AutoUpdater.NET/Properties/Resources.es.resx +++ b/AutoUpdater.NET/Properties/Resources.es.resx @@ -144,4 +144,7 @@ Descargando a {0}/s + + ¡No se puede determinar el nombre de archivo del archivo de actualización! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.fr.resx b/AutoUpdater.NET/Properties/Resources.fr.resx index 6fec1b0f..edbfd0b0 100644 --- a/AutoUpdater.NET/Properties/Resources.fr.resx +++ b/AutoUpdater.NET/Properties/Resources.fr.resx @@ -144,4 +144,7 @@ Téléchargement à {0}/s + + Impossible de déterminer le nom de fichier du fichier de mise à jour ! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.it.resx b/AutoUpdater.NET/Properties/Resources.it.resx index 2da7b218..3de31178 100644 --- a/AutoUpdater.NET/Properties/Resources.it.resx +++ b/AutoUpdater.NET/Properties/Resources.it.resx @@ -144,4 +144,7 @@ Download in {0}/s + + Impossibile determinare il nome file del file di aggiornamento! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ja-JP.resx b/AutoUpdater.NET/Properties/Resources.ja-JP.resx index 39cde2a3..f31cf297 100644 --- a/AutoUpdater.NET/Properties/Resources.ja-JP.resx +++ b/AutoUpdater.NET/Properties/Resources.ja-JP.resx @@ -144,4 +144,7 @@ {0}/秒でダウンロード中 + + 更新ファイルのファイル名を特定できません! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ko.resx b/AutoUpdater.NET/Properties/Resources.ko.resx index efe07f0a..b316b2f8 100644 --- a/AutoUpdater.NET/Properties/Resources.ko.resx +++ b/AutoUpdater.NET/Properties/Resources.ko.resx @@ -144,4 +144,7 @@ {0}/s에서 다운로드 중 + + 업데이트 파일의 파일 이름을 확인할 수 없습니다! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.lv.resx b/AutoUpdater.NET/Properties/Resources.lv.resx index 09ac5046..a7f328b5 100644 --- a/AutoUpdater.NET/Properties/Resources.lv.resx +++ b/AutoUpdater.NET/Properties/Resources.lv.resx @@ -144,4 +144,7 @@ Lejupielādē ar ātrumu {0}/s + + Nevar noteikt atjaunināšanas faila nosaukumu! + diff --git a/AutoUpdater.NET/Properties/Resources.nl.resx b/AutoUpdater.NET/Properties/Resources.nl.resx index 32b6622c..640b8738 100644 --- a/AutoUpdater.NET/Properties/Resources.nl.resx +++ b/AutoUpdater.NET/Properties/Resources.nl.resx @@ -144,4 +144,7 @@ Downloaden op {0}/s + + Kan de bestandsnaam van het updatebestand niet bepalen! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.pl.resx b/AutoUpdater.NET/Properties/Resources.pl.resx index 92c59a8a..44f76b2e 100644 --- a/AutoUpdater.NET/Properties/Resources.pl.resx +++ b/AutoUpdater.NET/Properties/Resources.pl.resx @@ -144,4 +144,7 @@ Szybkość pobierania: {0}/s + + Nie można określić nazwy pliku aktualizacji! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.pt-BR.resx b/AutoUpdater.NET/Properties/Resources.pt-BR.resx index eb39e62c..feab8436 100644 --- a/AutoUpdater.NET/Properties/Resources.pt-BR.resx +++ b/AutoUpdater.NET/Properties/Resources.pt-BR.resx @@ -131,7 +131,7 @@ Falha ao verificar atualização - Hash algorithm provided in the XML file is not supported. + O algoritmo de hash fornecido no arquivo XML não é compatível. Algoritmo de hash não suportado. @@ -145,4 +145,7 @@ Baixando a {0}/s + + Não foi possível determinar o nome do arquivo de atualização! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.pt.resx b/AutoUpdater.NET/Properties/Resources.pt.resx new file mode 100644 index 00000000..507eee61 --- /dev/null +++ b/AutoUpdater.NET/Properties/Resources.pt.resx @@ -0,0 +1,44 @@ + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Baixando em {0}/s + + + Soma de verificação difere + + + A verificação da integridade do arquivo falhou e relatou alguns erros. + + + Algoritmo de Hash Não Suportado + + + O algoritmo de hash fornecido no arquivo XML não é suportado. + + + Não foi possível determinar o nome do arquivo de atualização! + + + Falha na verificação de atualização + + + Há um problema ao acessar o servidor de atualização. Verifique sua conexão com a Internet e tente novamente mais tarde. + + + Atualização indisponível + + + Não há atualização disponível. Por favor, tente novamente mais tarde. + + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.resx b/AutoUpdater.NET/Properties/Resources.resx index 28057942..e30354f8 100644 --- a/AutoUpdater.NET/Properties/Resources.resx +++ b/AutoUpdater.NET/Properties/Resources.resx @@ -169,4 +169,7 @@ Downloading at {0}/s + + Unable to determine the filename of the update file! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ru.resx b/AutoUpdater.NET/Properties/Resources.ru.resx index 246ff4a1..7ec1b864 100644 --- a/AutoUpdater.NET/Properties/Resources.ru.resx +++ b/AutoUpdater.NET/Properties/Resources.ru.resx @@ -144,4 +144,7 @@ Загрузка на {0}/s + + Невозможно определить имя файла обновления! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.sk.resx b/AutoUpdater.NET/Properties/Resources.sk.resx index cb4cb1f6..7ece8430 100644 --- a/AutoUpdater.NET/Properties/Resources.sk.resx +++ b/AutoUpdater.NET/Properties/Resources.sk.resx @@ -144,4 +144,7 @@ Sťahovanie na {0}/s + + Nie je možné určiť názov súboru aktualizácie! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.sv.resx b/AutoUpdater.NET/Properties/Resources.sv.resx index a0b6720d..1f3255e5 100644 --- a/AutoUpdater.NET/Properties/Resources.sv.resx +++ b/AutoUpdater.NET/Properties/Resources.sv.resx @@ -144,4 +144,7 @@ Nedladdning vid {0}/s + + Det går inte att bestämma filnamnet på uppdateringsfilen! + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.th.resx b/AutoUpdater.NET/Properties/Resources.th.resx index 8c360282..c20392b8 100644 --- a/AutoUpdater.NET/Properties/Resources.th.resx +++ b/AutoUpdater.NET/Properties/Resources.th.resx @@ -145,4 +145,7 @@ กำลังดาวน์โหลด ด้วยความเร็ว {0}/s + + ไม่สามารถระบุชื่อไฟล์ของไฟล์อัพเดตได้! + diff --git a/AutoUpdater.NET/Properties/Resources.tr.resx b/AutoUpdater.NET/Properties/Resources.tr.resx new file mode 100644 index 00000000..56754766 --- /dev/null +++ b/AutoUpdater.NET/Properties/Resources.tr.resx @@ -0,0 +1,44 @@ + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}/sn hızında indiriliyor + + + Sağlama toplamı farklıdır + + + Dosya bütünlüğü denetimi başarısız oldu ve bazı hatalar bildirdi. + + + Desteklenmeyen Hash Algoritması + + + XML dosyasında sağlanan karma algoritma desteklenmiyor. + + + Güncelleme dosyasının dosya adı belirlenemiyor! + + + Güncelleme Kontrolü Başarısız + + + Güncelleme sunucusuna erişirken bir sorun oluştu. Lütfen internet bağlantınızı kontrol edin ve daha sonra tekrar deneyin. + + + Güncelleme Kullanılamıyor + + + Mevcut bir güncelleme yok. Lütfen daha sonra tekrar deneyiniz. + + \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.zh.resx b/AutoUpdater.NET/Properties/Resources.zh.resx index 2cc82b18..90f41218 100644 --- a/AutoUpdater.NET/Properties/Resources.zh.resx +++ b/AutoUpdater.NET/Properties/Resources.zh.resx @@ -144,4 +144,7 @@ 以{0}/s下载 + + 无法确定更新文件的文件名! + \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.pl.resx b/AutoUpdater.NET/RemindLaterForm.pl.resx index 242ba341..f9cfbf37 100644 --- a/AutoUpdater.NET/RemindLaterForm.pl.resx +++ b/AutoUpdater.NET/RemindLaterForm.pl.resx @@ -147,9 +147,6 @@ Zaleca się pobranie aktualizacji już teraz. Ten proces może potrwać kilka minut, w zależności od szybkości połączenia internetowego, i zapewnia, że masz najnowszą wersję programu. - - OK - Czy chcesz pobrać aktualizacje później? diff --git a/AutoUpdater.NET/RemindLaterForm.pt-BR.resx b/AutoUpdater.NET/RemindLaterForm.pt-BR.resx index 09232149..225ec399 100644 --- a/AutoUpdater.NET/RemindLaterForm.pt-BR.resx +++ b/AutoUpdater.NET/RemindLaterForm.pt-BR.resx @@ -120,9 +120,6 @@ Lembrar mais tarde - - OK - Em 30 minutos diff --git a/AutoUpdater.NET/RemindLaterForm.pt.resx b/AutoUpdater.NET/RemindLaterForm.pt.resx index 4c8731dd..a2e94c14 100644 --- a/AutoUpdater.NET/RemindLaterForm.pt.resx +++ b/AutoUpdater.NET/RemindLaterForm.pt.resx @@ -120,9 +120,6 @@ Recordar-me mais tarde - - OK - Daqui a 30 minutos diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 86c41500..992f86b8 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.7.0 + 1.7.8.0 AutoUpdater.NET rbsoft false diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 09df56fe..a630afe2 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2023 RBSoft - 1.3.2.0 - 1.3.2.0 - 1.3.2.0 - 1.3.2.0 + 1.3.3.0 + 1.3.3.0 + 1.3.3.0 + 1.3.3.0 ZipExtractor.ico app.manifest true diff --git a/appveyor.yml b/appveyor.yml index 534b32fb..f3d653c6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.7.{build} +version: 1.7.8.{build} environment: - my_version: 1.7.7 + my_version: 1.7.8 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From b847605cec49fbdf05df7a162d541916bf156b0b Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 2 Apr 2023 11:41:08 +0530 Subject: [PATCH 61/93] Added ability to define executable location in XML file if it differs from the older version executable. This resolves #128, resolves #243 and resolves #609. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 10 ++--- AutoUpdater.NET/DownloadUpdateDialog.cs | 7 ++-- AutoUpdater.NET/UpdateInfoEventArgs.cs | 6 +++ .../build/Autoupdater.NET.Official.nuspec | 10 ++--- AutoUpdaterTest/FormMain.cs | 4 +- README.md | 6 +++ ZipExtractor/FormMain.cs | 42 ++++++++++++------- ZipExtractor/ZipExtractor.csproj | 8 ++-- appveyor.yml | 4 +- 9 files changed, 61 insertions(+), 36 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index c00df5a4..65946da6 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2023 RBSoft - 1.7.8.0 - 1.7.8.0 - 1.7.8.0 + 1.8.0.0 + 1.8.0.0 + 1.8.0.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.7.8.0 + 1.8.0.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. @@ -51,6 +51,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 04903096..71de3e4b 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -158,8 +158,9 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent File.WriteAllBytes(installerPath, Resources.ZipExtractor); - string executablePath = Process.GetCurrentProcess().MainModule?.FileName; - string extractionPath = Path.GetDirectoryName(executablePath); + string currentExe = Process.GetCurrentProcess().MainModule?.FileName; + string updatedExe = _args.ExecutablePath; + string extractionPath = Path.GetDirectoryName(currentExe); if (!string.IsNullOrEmpty(AutoUpdater.InstallationPath) && Directory.Exists(AutoUpdater.InstallationPath)) @@ -168,7 +169,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } StringBuilder arguments = - new StringBuilder($"--input \"{tempPath}\" --output \"{extractionPath}\" --executable \"{executablePath}\""); + new StringBuilder($"--input \"{tempPath}\" --output \"{extractionPath}\" --current-exe \"{currentExe}\" --updated-exe \"{updatedExe}\""); if (AutoUpdater.ClearAppDirectory) { diff --git a/AutoUpdater.NET/UpdateInfoEventArgs.cs b/AutoUpdater.NET/UpdateInfoEventArgs.cs index c4779da5..870a4cea 100644 --- a/AutoUpdater.NET/UpdateInfoEventArgs.cs +++ b/AutoUpdater.NET/UpdateInfoEventArgs.cs @@ -65,6 +65,12 @@ public string ChangelogURL /// [XmlElement("mandatory")] public Mandatory Mandatory { get; set; } + + /// + /// Executable path of the updated application relative to installation directory. + /// + [XmlElement("executable")] + public string ExecutablePath { get; set; } /// /// Command line arguments used by Installer. diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 992f86b8..79013d8f 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.7.8.0 + 1.8.0.0 AutoUpdater.NET rbsoft false @@ -15,16 +15,16 @@ autoupdate updater c# vb wpf winforms - + - + - + - + diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 13969a73..26a6bc49 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -19,7 +19,7 @@ public partial class FormMain : Form public FormMain() { InitializeComponent(); - labelVersion.Text = string.Format(Resources.CurrentVersion, Assembly.GetEntryAssembly().GetName().Version); + labelVersion.Text = string.Format(Resources.CurrentVersion, Assembly.GetEntryAssembly()?.GetName().Version); } private void FormMain_Load(object sender, EventArgs e) @@ -246,7 +246,7 @@ private void ButtonCheckForUpdate_Click(object sender, EventArgs e) //} AutoUpdater.ClearAppDirectory = false; - AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); + AutoUpdater.Start("file://///rudra-pc/share/test.xml"); } } } \ No newline at end of file diff --git a/README.md b/README.md index adfd8403..026f1a59 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,12 @@ There are two things you need to provide in XML file as you can see above. true ```` +* executable (Optional): You can provide the path of the executable if it was changed in the update. It should be relative to the installation directory of the application. For example, if the new executable is located inside the bin folder of the installation directory, then you should provide it as shown below. + +````xml +bin\AutoUpdaterTest.exe +```` + * args (Optional): You can provide command line arguments for Installer between this tag. You can include %path% with your command line arguments, it will be replaced by path of the directory where currently executing application resides. * checksum (Optional): You can provide the checksum for the update file between this tag. If you do this AutoUpdater.NET will compare the checksum of the downloaded file before executing the update process to check the integrity of the file. You can provide algorithm attribute in the checksum tag to specify which algorithm should be used to generate the checksum of the downloaded file. Currently, MD5, SHA1, SHA256, SHA384, and SHA512 are supported. diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 5053d2e4..0c7a5d7c 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -27,7 +27,8 @@ private void FormMain_Shown(object sender, EventArgs e) { string zipPath = null; string extractionPath = null; - string executablePath = null; + string currentExe = null; + string updatedExe = null; bool clearAppDirectory = false; string commandLineArgs = null; @@ -47,8 +48,11 @@ private void FormMain_Shown(object sender, EventArgs e) case "--output": extractionPath = args[index + 1]; break; - case "--executable": - executablePath = args[index + 1]; + case "--current-exe": + currentExe = args[index + 1]; + break; + case "--updated-exe": + updatedExe = args[index + 1]; break; case "--clear": clearAppDirectory = true; @@ -62,7 +66,7 @@ private void FormMain_Shown(object sender, EventArgs e) _logBuilder.AppendLine(); - if (string.IsNullOrEmpty(zipPath) || string.IsNullOrEmpty(extractionPath) || string.IsNullOrEmpty(executablePath)) + if (string.IsNullOrEmpty(zipPath) || string.IsNullOrEmpty(extractionPath) || string.IsNullOrEmpty(currentExe)) { return; } @@ -76,11 +80,11 @@ private void FormMain_Shown(object sender, EventArgs e) _backgroundWorker.DoWork += (_, eventArgs) => { - foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(executablePath))) + foreach (var process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(currentExe))) { try { - if (process.MainModule is { FileName: { } } && process.MainModule.FileName.Equals(executablePath)) + if (process.MainModule is { FileName: { } } && process.MainModule.FileName.Equals(currentExe)) { _logBuilder.AppendLine("Waiting for application process to exit..."); @@ -96,11 +100,11 @@ private void FormMain_Shown(object sender, EventArgs e) _logBuilder.AppendLine("BackgroundWorker started successfully."); - // Ensures that the last character on the extraction path - // is the directory separator char. - // Without this, a malicious zip file could try to traverse outside of the expected - // extraction path. - if (!extractionPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) + // Ensures that the last character on the extraction path + // is the directory separator char. + // Without this, a malicious zip file could try to traverse outside of the expected + // extraction path. + if (!extractionPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) { extractionPath += Path.DirectorySeparatorChar; } @@ -156,9 +160,16 @@ private void FormMain_Shown(object sender, EventArgs e) if (!entry.IsDirectory()) { var parentDirectory = Path.GetDirectoryName(filePath); - if (!Directory.Exists(parentDirectory)) + if (parentDirectory != null) + { + if (!Directory.Exists(parentDirectory)) + { + Directory.CreateDirectory(parentDirectory); + } + } + else { - Directory.CreateDirectory(parentDirectory); + throw new ArgumentNullException($"parentDirectory is null for \"{filePath}\"!"); } using (Stream destination = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) { @@ -193,8 +204,8 @@ private void FormMain_Shown(object sender, EventArgs e) } catch (Exception) { - // ignored - } + // ignored + } } if (lockingProcesses == null) @@ -261,6 +272,7 @@ private void FormMain_Shown(object sender, EventArgs e) textBoxInformation.Text = @"Finished"; try { + var executablePath = updatedExe != null ? Path.Combine(extractionPath, updatedExe) : currentExe; ProcessStartInfo processStartInfo = new ProcessStartInfo(executablePath); if (!string.IsNullOrEmpty(commandLineArgs)) { diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index a630afe2..b68f5b3e 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2023 RBSoft - 1.3.3.0 - 1.3.3.0 - 1.3.3.0 - 1.3.3.0 + 1.4.0.0 + 1.4.0.0 + 1.4.0.0 + 1.4.0.0 ZipExtractor.ico app.manifest true diff --git a/appveyor.yml b/appveyor.yml index f3d653c6..47b40e13 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.7.8.{build} +version: 1.8.0.{build} environment: - my_version: 1.7.8 + my_version: 1.8.0 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 5a9ad53e8e504669f292464e485f392e3fbe22ef Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Tue, 18 Apr 2023 16:00:48 +0530 Subject: [PATCH 62/93] Added ability set updated executable path from code. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 4 +- .../AutoUpdater.NET.csproj.DotSettings | 2 - AutoUpdater.NET/AutoUpdater.cs | 196 +++++++++--------- AutoUpdater.NET/DownloadUpdateDialog.cs | 60 +++--- AutoUpdater.NET/UpdateForm.Designer.cs | 2 +- AutoUpdater.NET/UpdateForm.cs | 101 ++++----- .../build/Autoupdater.NET.Official.nuspec | 8 +- AutoUpdaterTest/FormMain.cs | 7 +- README.md | 149 +++++++++---- ZipExtractor/FormMain.cs | 100 +++++---- 10 files changed, 340 insertions(+), 289 deletions(-) delete mode 100644 AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 65946da6..d4920bc9 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -29,7 +29,7 @@ https://github.com/ravibpatel/AutoUpdater.NET/releases build $(OutputPath)\$(Configuration)\AutoUpdater.NET.xml - default + latest build\lib @@ -51,6 +51,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings b/AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings deleted file mode 100644 index b9fd6ee4..00000000 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - CSharp80 \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 00a7d927..90a51156 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -85,6 +85,11 @@ public static class AutoUpdater /// public static string InstallationPath; + /// + /// If you are using a zip file as an update file, then you can set this value to a new executable path relative to the installation directory. + /// + public static string ExecutablePath; + /// /// Set the Application Title shown in Update dialog. Although AutoUpdater.NET will get it automatically, you can set this property if you like to give custom Title. /// @@ -272,73 +277,71 @@ public static void Start(string appCast, Assembly myAssembly = null) _remindLaterTimer = null; } - if (!Running && _remindLaterTimer == null) - { - Running = true; + if (Running || _remindLaterTimer != null) return; - AppCastURL = appCast; + Running = true; - _isWinFormsApplication = Application.MessageLoop; + AppCastURL = appCast; - if (!_isWinFormsApplication) - { - Application.EnableVisualStyles(); - } + _isWinFormsApplication = Application.MessageLoop; - Assembly assembly = myAssembly ?? Assembly.GetEntryAssembly(); + if (!_isWinFormsApplication) + { + Application.EnableVisualStyles(); + } - if (Synchronous) - { - try - { - var result = CheckUpdate(assembly); + Assembly assembly = myAssembly ?? Assembly.GetEntryAssembly(); - if (StartUpdate(result)) - { - return; - } + if (Synchronous) + { + try + { + var result = CheckUpdate(assembly); - Running = false; - } - catch (Exception exception) + if (StartUpdate(result)) { - ShowError(exception); + return; } + + Running = false; } - else + catch (Exception exception) { - using (var backgroundWorker = new BackgroundWorker()) - { - backgroundWorker.DoWork += (_, args) => - { - Assembly mainAssembly = args.Argument as Assembly; + ShowError(exception); + } + } + else + { + using var backgroundWorker = new BackgroundWorker(); + + backgroundWorker.DoWork += (_, args) => + { + Assembly mainAssembly = args.Argument as Assembly; - args.Result = CheckUpdate(mainAssembly); - }; + args.Result = CheckUpdate(mainAssembly); + }; - backgroundWorker.RunWorkerCompleted += (_, args) => + backgroundWorker.RunWorkerCompleted += (_, args) => + { + if (args.Error != null) + { + ShowError(args.Error); + } + else + { + if (!args.Cancelled) { - if (args.Error != null) - { - ShowError(args.Error); - } - else + if (StartUpdate(args.Result)) { - if (!args.Cancelled) - { - if (StartUpdate(args.Result)) - { - return; - } - } - - Running = false; + return; } - }; + } - backgroundWorker.RunWorkerAsync(assembly); + Running = false; } - } + }; + + backgroundWorker.RunWorkerAsync(assembly); } } @@ -446,47 +449,46 @@ private static bool StartUpdate(object result) } else { - if (result is UpdateInfoEventArgs args) + if (result is not UpdateInfoEventArgs args) return false; + + if (CheckForUpdateEvent != null) { - if (CheckForUpdateEvent != null) - { - CheckForUpdateEvent(args); - } - else + CheckForUpdateEvent(args); + } + else + { + if (args.IsUpdateAvailable) { - if (args.IsUpdateAvailable) + if (Mandatory && UpdateMode == Mode.ForcedDownload) { - if (Mandatory && UpdateMode == Mode.ForcedDownload) + DownloadUpdate(args); + Exit(); + } + else + { + if (Thread.CurrentThread.GetApartmentState().Equals(ApartmentState.STA)) { - DownloadUpdate(args); - Exit(); + ShowUpdateForm(args); } else { - if (Thread.CurrentThread.GetApartmentState().Equals(ApartmentState.STA)) - { - ShowUpdateForm(args); - } - else - { - Thread thread = new Thread(new ThreadStart(delegate { ShowUpdateForm(args); })); - thread.CurrentCulture = - thread.CurrentUICulture = CultureInfo.CurrentCulture; - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - thread.Join(); - } + Thread thread = new Thread(new ThreadStart(delegate { ShowUpdateForm(args); })); + thread.CurrentCulture = + thread.CurrentUICulture = CultureInfo.CurrentCulture; + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + thread.Join(); } - - return true; } - if (ReportErrors) - { - MessageBox.Show(Resources.UpdateUnavailableMessage, - Resources.UpdateUnavailableCaption, - MessageBoxButtons.OK, MessageBoxIcon.Information); - } + return true; + } + + if (ReportErrors) + { + MessageBox.Show(Resources.UpdateUnavailableMessage, + Resources.UpdateUnavailableCaption, + MessageBoxButtons.OK, MessageBoxIcon.Information); } } } @@ -553,7 +555,7 @@ internal static void Exit() if (!process.HasExited) { - process.Kill(); //TODO show UI message asking user to close program himself instead of silently killing it + process.Kill(); //TODO: Show UI message asking user to close program himself instead of silently killing it } } } @@ -637,15 +639,14 @@ internal static void SetTimer(DateTime remindLater) /// public static bool DownloadUpdate(UpdateInfoEventArgs args) { - using (var downloadDialog = new DownloadUpdateDialog(args)) + using var downloadDialog = new DownloadUpdateDialog(args); + + try + { + return downloadDialog.ShowDialog().Equals(DialogResult.OK); + } + catch (TargetInvocationException) { - try - { - return downloadDialog.ShowDialog().Equals(DialogResult.OK); - } - catch (TargetInvocationException) - { - } } return false; @@ -656,17 +657,16 @@ public static bool DownloadUpdate(UpdateInfoEventArgs args) /// public static void ShowUpdateForm(UpdateInfoEventArgs args) { - using (var updateForm = new UpdateForm(args)) + using var updateForm = new UpdateForm(args); + + if (UpdateFormSize.HasValue) { - if (UpdateFormSize.HasValue) - { - updateForm.Size = UpdateFormSize.Value; - } + updateForm.Size = UpdateFormSize.Value; + } - if (updateForm.ShowDialog().Equals(DialogResult.OK)) - { - Exit(); - } + if (updateForm.ShowDialog().Equals(DialogResult.OK)) + { + Exit(); } } diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 71de3e4b..c29b016b 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -62,7 +62,7 @@ private void DownloadUpdateDialogLoad(object sender, EventArgs e) private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { - if (_startedAt == default(DateTime)) + if (_startedAt == default) { _startedAt = DateTime.Now; } @@ -84,10 +84,7 @@ private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEve private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEventArgs asyncCompletedEventArgs) { - if (asyncCompletedEventArgs.Cancelled) - { - return; - } + if (asyncCompletedEventArgs.Cancelled) return; try { @@ -107,7 +104,8 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent { try { - contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); + contentDisposition = + new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); } catch (FormatException) { @@ -127,7 +125,9 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent var tempPath = Path.Combine( - string.IsNullOrEmpty(AutoUpdater.DownloadPath) ? Path.GetTempPath() : AutoUpdater.DownloadPath, + string.IsNullOrEmpty(AutoUpdater.DownloadPath) + ? Path.GetTempPath() + : AutoUpdater.DownloadPath, fileName); if (File.Exists(tempPath)) @@ -154,7 +154,9 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent var extension = Path.GetExtension(tempPath); if (extension.Equals(".zip", StringComparison.OrdinalIgnoreCase)) { - string installerPath = Path.Combine(Path.GetDirectoryName(tempPath) ?? throw new InvalidOperationException(), "ZipExtractor.exe"); + string installerPath = + Path.Combine(Path.GetDirectoryName(tempPath) ?? throw new InvalidOperationException(), + "ZipExtractor.exe"); File.WriteAllBytes(installerPath, Resources.ZipExtractor); @@ -162,20 +164,32 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent string updatedExe = _args.ExecutablePath; string extractionPath = Path.GetDirectoryName(currentExe); - if (!string.IsNullOrEmpty(AutoUpdater.InstallationPath) && + if (string.IsNullOrWhiteSpace(updatedExe) && + !string.IsNullOrWhiteSpace(AutoUpdater.ExecutablePath)) + { + updatedExe = AutoUpdater.ExecutablePath; + } + + if (!string.IsNullOrWhiteSpace(AutoUpdater.InstallationPath) && Directory.Exists(AutoUpdater.InstallationPath)) { extractionPath = AutoUpdater.InstallationPath; } StringBuilder arguments = - new StringBuilder($"--input \"{tempPath}\" --output \"{extractionPath}\" --current-exe \"{currentExe}\" --updated-exe \"{updatedExe}\""); + new StringBuilder( + $"--input \"{tempPath}\" --output \"{extractionPath}\" --current-exe \"{currentExe}\""); + + if (!string.IsNullOrWhiteSpace(updatedExe)) + { + arguments.Append($" --updated-exe \"{updatedExe}\""); + } if (AutoUpdater.ClearAppDirectory) { arguments.Append(" --clear"); } - + string[] args = Environment.GetCommandLineArgs(); for (int i = 1; i < args.Length; i++) { @@ -255,25 +269,19 @@ private static string BytesToString(long byteCount) private static void CompareChecksum(string fileName, CheckSum checksum) { - using (var hashAlgorithm = + using var hashAlgorithm = HashAlgorithm.Create( - string.IsNullOrEmpty(checksum.HashingAlgorithm) ? "MD5" : checksum.HashingAlgorithm)) - { - using (var stream = File.OpenRead(fileName)) - { - if (hashAlgorithm != null) - { - var hash = hashAlgorithm.ComputeHash(stream); - var fileChecksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); + string.IsNullOrEmpty(checksum.HashingAlgorithm) ? "MD5" : checksum.HashingAlgorithm); + using var stream = File.OpenRead(fileName); - if (fileChecksum == checksum.Value.ToLower()) return; + if (hashAlgorithm == null) throw new Exception(Resources.HashAlgorithmNotSupportedMessage); - throw new Exception(Resources.FileIntegrityCheckFailedMessage); - } + var hash = hashAlgorithm.ComputeHash(stream); + var fileChecksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); - throw new Exception(Resources.HashAlgorithmNotSupportedMessage); - } - } + if (fileChecksum == checksum.Value.ToLower()) return; + + throw new Exception(Resources.FileIntegrityCheckFailedMessage); } private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArgs e) diff --git a/AutoUpdater.NET/UpdateForm.Designer.cs b/AutoUpdater.NET/UpdateForm.Designer.cs index e56d1b56..3d84968a 100644 --- a/AutoUpdater.NET/UpdateForm.Designer.cs +++ b/AutoUpdater.NET/UpdateForm.Designer.cs @@ -2,7 +2,7 @@ namespace AutoUpdaterDotNET { - partial class UpdateForm + sealed partial class UpdateForm { /// /// Required designer variable. diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index c10d73e7..07c7440b 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -9,7 +9,7 @@ namespace AutoUpdaterDotNET { - internal partial class UpdateForm : Form + internal sealed partial class UpdateForm : Form { private readonly UpdateInfoEventArgs _args; @@ -21,12 +21,12 @@ public UpdateForm(UpdateInfoEventArgs args) buttonSkip.Visible = AutoUpdater.ShowSkipButton; buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton; var resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm)); - Text = string.Format(resources.GetString("$this.Text", CultureInfo.CurrentCulture), + Text = string.Format(resources.GetString("$this.Text", CultureInfo.CurrentCulture)!, AutoUpdater.AppTitle, _args.CurrentVersion); - labelUpdate.Text = string.Format(resources.GetString("labelUpdate.Text", CultureInfo.CurrentCulture), + labelUpdate.Text = string.Format(resources.GetString("labelUpdate.Text", CultureInfo.CurrentCulture)!, AutoUpdater.AppTitle); labelDescription.Text = - string.Format(resources.GetString("labelDescription.Text", CultureInfo.CurrentCulture), + string.Format(resources.GetString("labelDescription.Text", CultureInfo.CurrentCulture)!, AutoUpdater.AppTitle, _args.CurrentVersion, _args.InstalledVersion); if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) @@ -117,45 +117,34 @@ private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebV private void UseLatestIE() { - int ieValue = 0; - switch (webBrowser.Version.Major) + int ieValue = webBrowser.Version.Major switch { - case 11: - ieValue = 11001; - break; - case 10: - ieValue = 10001; - break; - case 9: - ieValue = 9999; - break; - case 8: - ieValue = 8888; - break; - case 7: - ieValue = 7000; - break; - } + 11 => 11001, + 10 => 10001, + 9 => 9999, + 8 => 8888, + 7 => 7000, + _ => 0 + }; + + if (ieValue == 0) return; - if (ieValue != 0) + try { - try + using (RegistryKey registryKey = + Registry.CurrentUser.OpenSubKey( + @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", + true)) { - using (RegistryKey registryKey = - Registry.CurrentUser.OpenSubKey( - @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", - true)) - { - registryKey?.SetValue(Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName), - ieValue, - RegistryValueKind.DWord); - } - } - catch (Exception) - { - // ignored + registryKey?.SetValue(Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName), + ieValue, + RegistryValueKind.DWord); } } + catch (Exception) + { + // ignored + } } private void UpdateFormLoad(object sender, EventArgs e) @@ -192,42 +181,32 @@ private void ButtonRemindLaterClick(object sender, EventArgs e) { if (AutoUpdater.LetUserSelectRemindLater) { - using (var remindLaterForm = new RemindLaterForm()) - { - var dialogResult = remindLaterForm.ShowDialog(); + using var remindLaterForm = new RemindLaterForm(); + var dialogResult = remindLaterForm.ShowDialog(); - if (dialogResult.Equals(DialogResult.OK)) - { + switch (dialogResult) + { + case DialogResult.OK: AutoUpdater.RemindLaterTimeSpan = remindLaterForm.RemindLaterFormat; AutoUpdater.RemindLaterAt = remindLaterForm.RemindLaterAt; - } - else if (dialogResult.Equals(DialogResult.Abort)) - { + break; + case DialogResult.Abort: ButtonUpdateClick(sender, e); return; - } - else - { + default: return; - } } } AutoUpdater.PersistenceProvider.SetSkippedVersion(null); - DateTime remindLaterDateTime = DateTime.Now; - switch (AutoUpdater.RemindLaterTimeSpan) + DateTime remindLaterDateTime = AutoUpdater.RemindLaterTimeSpan switch { - case RemindLaterFormat.Days: - remindLaterDateTime = DateTime.Now + TimeSpan.FromDays(AutoUpdater.RemindLaterAt); - break; - case RemindLaterFormat.Hours: - remindLaterDateTime = DateTime.Now + TimeSpan.FromHours(AutoUpdater.RemindLaterAt); - break; - case RemindLaterFormat.Minutes: - remindLaterDateTime = DateTime.Now + TimeSpan.FromMinutes(AutoUpdater.RemindLaterAt); - break; - } + RemindLaterFormat.Days => DateTime.Now + TimeSpan.FromDays(AutoUpdater.RemindLaterAt), + RemindLaterFormat.Hours => DateTime.Now + TimeSpan.FromHours(AutoUpdater.RemindLaterAt), + RemindLaterFormat.Minutes => DateTime.Now + TimeSpan.FromMinutes(AutoUpdater.RemindLaterAt), + _ => DateTime.Now + }; AutoUpdater.PersistenceProvider.SetRemindLater(remindLaterDateTime); AutoUpdater.SetTimer(remindLaterDateTime); diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 79013d8f..645c77bc 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -15,16 +15,16 @@ autoupdate updater c# vb wpf winforms - + - + - + - + diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 26a6bc49..5c880850 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -35,7 +35,7 @@ private void FormMain_Load(object sender, EventArgs e) //Uncomment below line to see russian version - //Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("ru"); + Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("hi"); //If you want to open download page when user click on download button uncomment below line. @@ -245,8 +245,9 @@ private void ButtonCheckForUpdate_Click(object sender, EventArgs e) // AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); //} - AutoUpdater.ClearAppDirectory = false; - AutoUpdater.Start("file://///rudra-pc/share/test.xml"); + AutoUpdater.ExecutablePath = "bin/AutoUpdaterTest.exe"; + AutoUpdater.ClearAppDirectory = true; + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } } } \ No newline at end of file diff --git a/README.md b/README.md index 026f1a59..61497e4b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ [![Build status](https://ci.appveyor.com/api/projects/status/yng987o7dauk9gqc?svg=true)](https://ci.appveyor.com/project/ravibpatel/autoupdater-net) -AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic desktop application projects. +AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their classic +desktop application projects. ## The NuGet Package [![NuGet](https://img.shields.io/nuget/v/Autoupdater.NET.Official.svg)](https://www.nuget.org/packages/Autoupdater.NET.Official/) [![NuGet](https://img.shields.io/nuget/dt/Autoupdater.NET.Official.svg)](https://www.nuget.org/packages/Autoupdater.NET.Official/) @@ -20,13 +21,20 @@ This library only works for WinForms or WPF application projects. ## How it works -AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the information about the latest version of the software. If the latest version of the software is greater than the current version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the update button to update the software then It downloads the update file (Installer) from URL provided in XML file and executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application directory. +AutoUpdater.NET downloads the XML file containing update information from your server. It uses this XML file to get the +information about the latest version of the software. If the latest version of the software is greater than the current +version of the software installed on User's PC then AutoUpdater.NET shows update dialog to the user. If user press the +update button to update the software then It downloads the update file (Installer) from URL provided in XML file and +executes the installer file it just downloaded. It is a job of installer after this point to carry out the update. If +you provide zip file URL instead of installer then AutoUpdater.NET will extract the contents of zip file to application +directory. ## Using the code ### XML file -AutoUpdater.NET uses XML file located on a server to get the release information about the latest version of the software. You need to create XML file like below and then you need to upload it to your server. +AutoUpdater.NET uses XML file located on a server to get the release information about the latest version of the +software. You need to create XML file like below and then you need to upload it to your server. ````xml @@ -40,46 +48,66 @@ AutoUpdater.NET uses XML file located on a server to get the release information There are two things you need to provide in XML file as you can see above. -* version (Required) : You need to provide latest version of the application between version tags. Version should be in X.X.X.X format. -* url (Required): You need to provide URL of the latest version installer file or zip file between url tags. AutoUpdater.NET downloads the file provided here and install it when user press the Update button. -* changelog (Optional): You need to provide URL of the change log of your application between changelog tags. If you don't provide the URL of the changelog then update dialog won't show the change log. -* mandatory (Optional): You can set this to true if you don't want user to skip this version. This will ignore Remind Later and Skip options and hide both Skip and Remind Later button on update dialog. - * mode (Attribute, Optional): You can provide mode attribute on mandatory element to change the behaviour of the mandatory flag. If you provide "1" as the value of mode attribute then it will also hide the Close button on update dialog. If you provide "2" as the value of mode attribute then it will skip the update dialog and start downloading and updating application automatically. +* version (Required) : You need to provide latest version of the application between version tags. Version should be in + X.X.X.X format. +* url (Required): You need to provide URL of the latest version installer file or zip file between url tags. + AutoUpdater.NET downloads the file provided here and install it when user press the Update button. +* changelog (Optional): You need to provide URL of the change log of your application between changelog tags. If you + don't provide the URL of the changelog then update dialog won't show the change log. +* mandatory (Optional): You can set this to true if you don't want user to skip this version. This will ignore Remind + Later and Skip options and hide both Skip and Remind Later button on update dialog. + * mode (Attribute, Optional): You can provide mode attribute on mandatory element to change the behaviour of the + mandatory flag. If you provide "1" as the value of mode attribute then it will also hide the Close button on + update dialog. If you provide "2" as the value of mode attribute then it will skip the update dialog and start + downloading and updating application automatically. ````xml true ```` - * minVersion (Attribute, Optional): You can also provide minVersion attribute on mandatory element. When you provide it, Mandatory option will be triggered only if the installed version of the app is less than the minimum version you specified here. + * minVersion (Attribute, Optional): You can also provide minVersion attribute on mandatory element. When you provide + it, Mandatory option will be triggered only if the installed version of the app is less than the minimum version + you specified here. ````xml true ```` -* executable (Optional): You can provide the path of the executable if it was changed in the update. It should be relative to the installation directory of the application. For example, if the new executable is located inside the bin folder of the installation directory, then you should provide it as shown below. +* executable (Optional): You can provide the path of the executable if it was changed in the update. It should be + relative to the installation directory of the application. For example, if the new executable is located inside the + bin folder of the installation directory, then you should provide it as shown below. ````xml bin\AutoUpdaterTest.exe ```` -* args (Optional): You can provide command line arguments for Installer between this tag. You can include %path% with your command line arguments, it will be replaced by path of the directory where currently executing application resides. -* checksum (Optional): You can provide the checksum for the update file between this tag. If you do this AutoUpdater.NET will compare the checksum of the downloaded file before executing the update process to check the integrity of the file. You can provide algorithm attribute in the checksum tag to specify which algorithm should be used to generate the checksum of the downloaded file. Currently, MD5, SHA1, SHA256, SHA384, and SHA512 are supported. +* args (Optional): You can provide command line arguments for Installer between this tag. You can include %path% with + your command line arguments, it will be replaced by path of the directory where currently executing application + resides. +* checksum (Optional): You can provide the checksum for the update file between this tag. If you do this AutoUpdater.NET + will compare the checksum of the downloaded file before executing the update process to check the integrity of the + file. You can provide algorithm attribute in the checksum tag to specify which algorithm should be used to generate + the checksum of the downloaded file. Currently, MD5, SHA1, SHA256, SHA384, and SHA512 are supported. ````xml Update file Checksum ```` -You can also use the XML creator tool created by one of the user to create the XML file. You can download it from [here](https://github.com/DwainSnickles/AutoUpdater.NET.XML-Creator-master/blob/master/AutoUpdaterXML.zip). +You can also use the XML creator tool created by one of the user to create the XML file. You can download it +from [here](https://github.com/DwainSnickles/AutoUpdater.NET.XML-Creator-master/blob/master/AutoUpdaterXML.zip). ### Adding one line to make it work -After you done creating and uploading XML file, It is very easy to add a auto update functionality to your application. First you need to add following line at the top of your form. +After you done creating and uploading XML file, It is very easy to add a auto update functionality to your application. +First you need to add following line at the top of your form. ````csharp using AutoUpdaterDotNET; ```` -Now you just need to add following line to your main form constructor or in Form_Load event. You can add this line anywhere you like. If you don't like to check for update when application starts then you can create a Check for update button and add this line to Button_Click event. +Now you just need to add following line to your main form constructor or in Form_Load event. You can add this line +anywhere you like. If you don't like to check for update when application starts then you can create a Check for update +button and add this line to Button_Click event. ````csharp AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); @@ -91,7 +119,8 @@ Start method of AutoUpdater class takes URL of the XML file you uploaded to serv ### Current version detection -AutoUpdater.NET uses Assembly version to determine the current version of the application. You can update it by going to Properties of the project as shown in following screenshot. +AutoUpdater.NET uses Assembly version to determine the current version of the application. You can update it by going to +Properties of the project as shown in following screenshot. ![How to change assembly version of your .NET application?](https://rbsoft.org/images/assembly-version.png) @@ -107,7 +136,8 @@ AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml", myAssembly); ### Provide installed version manually -If you don't want AutoUpdater.NET to determine the installed version from assembly then you can provide your own version by assigning it to InstalledVersion field as shown below. +If you don't want AutoUpdater.NET to determine the installed version from assembly then you can provide your own version +by assigning it to InstalledVersion field as shown below. ````csharp AutoUpdater.InstalledVersion = new Version("1.2"); @@ -115,13 +145,15 @@ AutoUpdater.InstalledVersion = new Version("1.2"); ### Download Update file and XML using FTP -If you like to use ftp XML URL to check for updates or download the update file then you can provide you FTP credentials in alternative Start method as shown below. +If you like to use ftp XML URL to check for updates or download the update file then you can provide you FTP credentials +in alternative Start method as shown below. ````csharp AutoUpdater.Start("ftp://rbsoft.org/updates/AutoUpdaterTest.xml", new NetworkCredential("FtpUserName", "FtpPassword")); ```` -If you are using FTP download URL in the XML file then credentials provided here will be used to authenticate the request. +If you are using FTP download URL in the XML file then credentials provided here will be used to authenticate the +request. ### Check for updates synchronously @@ -149,7 +181,9 @@ AutoUpdater.ShowRemindLaterButton = false; ### Ignore previous Remind Later or Skip settings -If you want to ignore previously set Remind Later and Skip settings then you can set Mandatory property to true. It will also hide Skip and Remind Later button. If you set Mandatory to true in code then value of Mandatory in your XML file will be ignored. +If you want to ignore previously set Remind Later and Skip settings then you can set Mandatory property to true. It will +also hide Skip and Remind Later button. If you set Mandatory to true in code then value of Mandatory in your XML file +will be ignored. ````csharp AutoUpdater.Mandatory = true; @@ -157,7 +191,10 @@ AutoUpdater.Mandatory = true; ### Forced updates -You can enable forced updates by setting Mandatory property to true and setting UpdateMode to value of `Mode.Forced` or `Mode.ForcedDownload`. `Mode.Forced` option will hide Remind Later, Skip and Close buttons on the standard update dialog. `Mode.ForcedDownload` option will skip the standard update dialog and start downloading and updating the application without user interaction. `Mode.ForceDownload` option will also ignore value of OpenDownloadPage flag. +You can enable forced updates by setting Mandatory property to true and setting UpdateMode to value of `Mode.Forced` +or `Mode.ForcedDownload`. `Mode.Forced` option will hide Remind Later, Skip and Close buttons on the standard update +dialog. `Mode.ForcedDownload` option will skip the standard update dialog and start downloading and updating the +application without user interaction. `Mode.ForceDownload` option will also ignore value of OpenDownloadPage flag. ````csharp AutoUpdater.Mandatory = true; @@ -175,7 +212,8 @@ AutoUpdater.BasicAuthXML = AutoUpdater.BasicAuthDownload = AutoUpdater.BasicAuth ### Set User-Agent for http web requests -Set the User-Agent string to be used for HTTP web requests so you can differentiate them in your web server request logs. +Set the User-Agent string to be used for HTTP web requests so you can differentiate them in your web server request +logs. ````csharp AutoUpdater.HttpUserAgent = "AutoUpdater"; @@ -183,7 +221,8 @@ AutoUpdater.HttpUserAgent = "AutoUpdater"; ### Enable Error Reporting -You can turn on error reporting by adding below code. If you do this AutoUpdater.NET will show error message, if there is no update available or if it can't get to the XML file from web server. +You can turn on error reporting by adding below code. If you do this AutoUpdater.NET will show error message, if there +is no update available or if it can't get to the XML file from web server. ````csharp AutoUpdater.ReportErrors = true; @@ -191,7 +230,8 @@ AutoUpdater.ReportErrors = true; ### Run update process without Administrator privileges -If your application doesn't need administrator privileges to replace old version then you can set RunUpdateAsAdmin to false. +If your application doesn't need administrator privileges to replace old version then you can set RunUpdateAsAdmin to +false. ````csharp AutoUpdater.RunUpdateAsAdmin = false; @@ -199,17 +239,20 @@ AutoUpdater.RunUpdateAsAdmin = false; ### Open Download Page -If you don't want to download the latest version of the application and just want to open the URL between url tags of your XML file then you need to add following line with above code. +If you don't want to download the latest version of the application and just want to open the URL between url tags of +your XML file then you need to add following line with above code. ````csharp AutoUpdater.OpenDownloadPage = true; ```` -This kind of scenario is useful if you want to show some information to users before they download the latest version of an application. +This kind of scenario is useful if you want to show some information to users before they download the latest version of +an application. ### Remind Later -If you don't want users to select Remind Later time when they press the Remind Later button of update dialog then you need to add following lines with above code. +If you don't want users to select Remind Later time when they press the Remind Later button of update dialog then you +need to add following lines with above code. ````csharp AutoUpdater.LetUserSelectRemindLater = false; @@ -221,7 +264,9 @@ In above example when user press Remind Later button of update dialog, It will r ### Proxy Server -If your XML and Update file can only be used from certain Proxy Server then you can use following settings to tell AutoUpdater.NET to use that proxy. Currently, if your Changelog URL is also restricted to Proxy server then you should omit changelog tag from XML file cause it is not supported using Proxy Server. +If your XML and Update file can only be used from certain Proxy Server then you can use following settings to tell +AutoUpdater.NET to use that proxy. Currently, if your Changelog URL is also restricted to Proxy server then you should +omit changelog tag from XML file cause it is not supported using Proxy Server. ````csharp var proxy = new WebProxy("ProxyIP:ProxyPort", true) @@ -233,7 +278,8 @@ AutoUpdater.Proxy = proxy; ### Specify where to download the update file -You can specify where you want to download the update file by assigning DownloadPath field as shown below. It will be used for ZipExtractor too. +You can specify where you want to download the update file by assigning DownloadPath field as shown below. It will be +used for ZipExtractor too. ````csharp AutoUpdater.DownloadPath = Application.StartupPath; @@ -241,7 +287,8 @@ AutoUpdater.DownloadPath = Application.StartupPath; ### Specify where to extract zip file containing updated files -If you are using a zip file as an update file then you can set the "InstallationPath" equal to the path where your app is installed. This is only necessary when your installation directory differs from your executable path. +If you are using a zip file as an update file then you can set the "InstallationPath" equal to the path where your app +is installed. This is only necessary when your installation directory differs from your executable path. ````csharp var currentDirectory = new DirectoryInfo(Application.StartupPath); @@ -251,9 +298,20 @@ if (currentDirectory.Parent != null) } ```` +### Specify relative path to executable you want to execute after update + +If you are using a zip file as an update file, then you can set "ExecutablePath" equal to a new executable path relative to +the installation directory. This is only necessary if your new executable path differs from current executable path. +The "executable" value defined in XML takes precedence over this value. + +````csharp +AutoUpdater.ExecutablePath = "bin/AutoUpdater.exe"; +```` + ### Clear application directory before extracting update file -Sometimes it is necessary to clear previous version files before doing an update. In this case, you can specify whether to clear the application directory before extracting the update file using the below code. +Sometimes it is necessary to clear previous version files before doing an update. In this case, you can specify whether +to clear the application directory before extracting the update file using the below code. ````csharp AutoUpdater.ClearAppDirectory = true; @@ -269,16 +327,20 @@ AutoUpdater.UpdateFormSize = new System.Drawing.Size(800, 600); ### Change storage method of Remind Later and Skip options -You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you don't provide a PersistenceProvider then it will save the values in Windows registry. +You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you +don't provide a PersistenceProvider then it will save the values in Windows registry. -If you are using .NET 4.0 or above then you can use JsonFilePersistenceProvider instead of default RegistryPersistenceProvider as shown below. +If you are using .NET 4.0 or above then you can use JsonFilePersistenceProvider instead of default +RegistryPersistenceProvider as shown below. ````csharp string jsonPath = Path.Combine(Environment.CurrentDirectory, "settings.json"); AutoUpdater.PersistenceProvider = new JsonFilePersistenceProvider(jsonPath); ```` -You can create your own PersistenceProvider by implementing [IPersistenceProvider](https://github.com/ravibpatel/AutoUpdater.NET/blob/master/AutoUpdater.NET/IPersistenceProvider.cs) interface. +You can create your own PersistenceProvider by +implementing [IPersistenceProvider](https://github.com/ravibpatel/AutoUpdater.NET/blob/master/AutoUpdater.NET/IPersistenceProvider.cs) +interface. ## Check updates frequently @@ -312,7 +374,8 @@ timer.Start(); ## Handling Application exit logic manually -If you like to handle Application exit logic yourself then you can use ApplicationExitEvent like below. This is very useful if you like to do something before closing the application. +If you like to handle Application exit logic yourself then you can use ApplicationExitEvent like below. This is very +useful if you like to do something before closing the application. ````csharp AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent; @@ -327,7 +390,9 @@ private void AutoUpdater_ApplicationExitEvent() ## Handling updates manually -Sometimes as a developer you need to maintain look and feel for the entire application similarly or you just need to do something before update. In this type of scenarios you can handle the updates manually by subscribing to an event. You can do it by adding following line with above code. +Sometimes as a developer you need to maintain look and feel for the entire application similarly or you just need to do +something before update. In this type of scenarios you can handle the updates manually by subscribing to an event. You +can do it by adding following line with above code. ````csharp AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent; @@ -401,7 +466,8 @@ private void AutoUpdaterOnCheckForUpdateEvent(UpdateInfoEventArgs args) } ```` -When you do this it will execute the code in above event when AutoUpdater.Start method is called instead of showing the update dialog. +When you do this it will execute the code in above event when AutoUpdater.Start method is called instead of showing the +update dialog. * IsUpdateAvailable (bool) : If update is available then returns true otherwise false. * DownloadURL (string) : Download URL of the update file.. @@ -412,7 +478,8 @@ When you do this it will execute the code in above event when AutoUpdater.Start ## Handling parsing logic manually -If you want to use other format instead of XML as an AppCast file then you need to handle the parsing logic by subscribing to ParseUpdateInfoEvent. You can do it as follows. +If you want to use other format instead of XML as an AppCast file then you need to handle the parsing logic by +subscribing to ParseUpdateInfoEvent. You can do it as follows. ````csharp AutoUpdater.ParseUpdateInfoEvent += AutoUpdaterOnParseUpdateInfoEvent; @@ -464,7 +531,7 @@ private void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) You can follow below steps to build the project on your local development environment. -* Disable signing from project properties of both AutoUpdater.NET and ZipExtractor. +* Disable signing from project properties of both AutoUpdater.NET and ZipExtractor. * Edit both .csproj file of AutoUpdater.NET and ZipExtractor and change following line. Use .NET version you prefer. Before @@ -480,4 +547,6 @@ You can follow below steps to build the project on your local development enviro ``` * Build ZipExtractor project in "Release" configuration to create the executable in Resources folder. -* VS2022 doesn't allow building .NET Framework 4.5 by default, so if you are using it then you can just change it to any supported .NET version, or you have to follow steps from [here](https://stackoverflow.com/a/70109092/1273550) to use .NET Framework 4.5. +* VS2022 doesn't allow building .NET Framework 4.5 by default, so if you are using it then you can just change it to any + supported .NET version, or you have to follow steps from [here](https://stackoverflow.com/a/70109092/1273550) to use + .NET Framework 4.5. diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 0c7a5d7c..86332e21 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -187,50 +187,47 @@ private void FormMain_Shown(object sender, EventArgs e) const int errorSharingViolation = 0x20; const int errorLockViolation = 0x21; var errorCode = Marshal.GetHRForException(exception) & 0x0000FFFF; - if (errorCode is errorSharingViolation or errorLockViolation) + if (errorCode is not (errorSharingViolation or errorLockViolation)) { - retries++; - if (retries > MaxRetries) - { - throw; - } + throw; + } - List lockingProcesses = null; - if (Environment.OSVersion.Version.Major >= 6 && retries >= 2) - { - try - { - lockingProcesses = FileUtil.WhoIsLocking(filePath); - } - catch (Exception) - { - // ignored - } - } + retries++; + if (retries > MaxRetries) + { + throw; + } - if (lockingProcesses == null) + List lockingProcesses = null; + if (Environment.OSVersion.Version.Major >= 6 && retries >= 2) + { + try { - Thread.Sleep(5000); + lockingProcesses = FileUtil.WhoIsLocking(filePath); } - else + catch (Exception) { - foreach (var lockingProcess in lockingProcesses) - { - var dialogResult = MessageBox.Show( - string.Format(Resources.FileStillInUseMessage, - lockingProcess.ProcessName, filePath), - Resources.FileStillInUseCaption, - MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); - if (dialogResult == DialogResult.Cancel) - { - throw; - } - } + // ignored } } - else + + if (lockingProcesses == null) { - throw; + Thread.Sleep(5000); + continue; + } + + foreach (var lockingProcess in lockingProcesses) + { + var dialogResult = MessageBox.Show( + string.Format(Resources.FileStillInUseMessage, + lockingProcess.ProcessName, filePath), + Resources.FileStillInUseCaption, + MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); + if (dialogResult == DialogResult.Cancel) + { + throw; + } } } } @@ -267,28 +264,27 @@ private void FormMain_Shown(object sender, EventArgs e) throw eventArgs.Error; } - if (!eventArgs.Cancelled) + if (eventArgs.Cancelled) return; + + textBoxInformation.Text = @"Finished"; + try { - textBoxInformation.Text = @"Finished"; - try + var executablePath = string.IsNullOrWhiteSpace(updatedExe) ? currentExe : Path.Combine(extractionPath, updatedExe); + ProcessStartInfo processStartInfo = new ProcessStartInfo(executablePath); + if (!string.IsNullOrEmpty(commandLineArgs)) { - var executablePath = updatedExe != null ? Path.Combine(extractionPath, updatedExe) : currentExe; - ProcessStartInfo processStartInfo = new ProcessStartInfo(executablePath); - if (!string.IsNullOrEmpty(commandLineArgs)) - { - processStartInfo.Arguments = commandLineArgs; - } + processStartInfo.Arguments = commandLineArgs; + } - Process.Start(processStartInfo); + Process.Start(processStartInfo); - _logBuilder.AppendLine("Successfully launched the updated application."); - } - catch (Win32Exception exception) + _logBuilder.AppendLine("Successfully launched the updated application."); + } + catch (Win32Exception exception) + { + if (exception.NativeErrorCode != 1223) { - if (exception.NativeErrorCode != 1223) - { - throw; - } + throw; } } } From 68af9fc411ba3560295bf4bf41c9c8b3f881637e Mon Sep 17 00:00:00 2001 From: jimifish <269911478@qq.com> Date: Thu, 27 Apr 2023 15:38:05 +0800 Subject: [PATCH 63/93] Optimze ProcessStartInfo arguments handling (#616). This fixes #608. --- AutoUpdater.NET/DownloadUpdateDialog.cs | 53 +++++++++++++------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index c29b016b..185fb69b 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -3,10 +3,10 @@ using System.Diagnostics; using System.Globalization; using System.IO; +using System.Linq; using System.Net; using System.Net.Mime; using System.Security.Cryptography; -using System.Text; using System.Windows.Forms; using AutoUpdaterDotNET.Properties; @@ -69,7 +69,7 @@ private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEve else { var timeSpan = DateTime.Now - _startedAt; - long totalSeconds = (long) timeSpan.TotalSeconds; + long totalSeconds = (long)timeSpan.TotalSeconds; if (totalSeconds > 0) { var bytesPerSecond = e.BytesReceived / totalSeconds; @@ -176,49 +176,50 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent extractionPath = AutoUpdater.InstallationPath; } - StringBuilder arguments = - new StringBuilder( - $"--input \"{tempPath}\" --output \"{extractionPath}\" --current-exe \"{currentExe}\""); + processStartInfo = new ProcessStartInfo + { + FileName = installerPath, + UseShellExecute = true + }; + + processStartInfo.ArgumentList.Add("--input"); + processStartInfo.ArgumentList.Add(tempPath); + processStartInfo.ArgumentList.Add("--output"); + processStartInfo.ArgumentList.Add(extractionPath); + processStartInfo.ArgumentList.Add("--current-exe"); + processStartInfo.ArgumentList.Add(currentExe); if (!string.IsNullOrWhiteSpace(updatedExe)) { - arguments.Append($" --updated-exe \"{updatedExe}\""); + processStartInfo.ArgumentList.Add("--updated-exe"); + processStartInfo.ArgumentList.Add(updatedExe); } if (AutoUpdater.ClearAppDirectory) { - arguments.Append(" --clear"); + processStartInfo.ArgumentList.Add("--clear"); } string[] args = Environment.GetCommandLineArgs(); - for (int i = 1; i < args.Length; i++) + if (args.Length > 0) { - if (i.Equals(1)) - { - arguments.Append(" --args \""); - } + var arguments = string.Join(" ", args.Skip(1).Select(arg => $"\"{arg}\"")); + processStartInfo.ArgumentList.Add("--args"); + processStartInfo.ArgumentList.Add(arguments); - arguments.Append($"\"{args[i]}\""); - arguments.Append(i.Equals(args.Length - 1) ? "\"" : " "); } - - processStartInfo = new ProcessStartInfo - { - FileName = installerPath, - UseShellExecute = true, - Arguments = arguments.ToString() - }; } else if (extension.Equals(".msi", StringComparison.OrdinalIgnoreCase)) { processStartInfo = new ProcessStartInfo { - FileName = "msiexec", - Arguments = $"/i \"{tempPath}\"", + FileName = "msiexec" }; + processStartInfo.ArgumentList.Add($"/i"); + processStartInfo.ArgumentList.Add(tempPath); if (!string.IsNullOrEmpty(installerArgs)) { - processStartInfo.Arguments += " " + installerArgs; + processStartInfo.ArgumentList.Add(installerArgs); } } @@ -258,7 +259,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent private static string BytesToString(long byteCount) { - string[] suf = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}; + string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; if (byteCount == 0) return "0" + suf[0]; long bytes = Math.Abs(byteCount); @@ -291,7 +292,7 @@ private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArg AutoUpdater.Exit(); return; } - if (_webClient is {IsBusy: true}) + if (_webClient is { IsBusy: true }) { _webClient.CancelAsync(); DialogResult = DialogResult.Cancel; From 3d72caf3124a5cfabcaf729d236028d8cc79ceb6 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 27 Apr 2023 13:57:59 +0530 Subject: [PATCH 64/93] ArgumentList isn't available for .NET Framework so, using original logic to get process arguments for .NET Framework. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 30 +- AutoUpdater.NET/AutoUpdater.cs | 1103 +++++----- AutoUpdater.NET/BasicAuthentication.cs | 55 +- AutoUpdater.NET/CustomAuthentication.cs | 47 +- AutoUpdater.NET/DownloadUpdateDialog.ar.resx | 257 +-- AutoUpdater.NET/DownloadUpdateDialog.cs | 461 +++-- AutoUpdater.NET/DownloadUpdateDialog.cs.resx | 246 +-- AutoUpdater.NET/DownloadUpdateDialog.da.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.de.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.es.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.fr.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.it.resx | 240 +-- .../DownloadUpdateDialog.ja-JP.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.ko.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.lv.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.nl.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.pl.resx | 240 +-- .../DownloadUpdateDialog.pt-BR.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.pt.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.resx | 1518 +++++++------- AutoUpdater.NET/DownloadUpdateDialog.ru.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.sk.resx | 246 +-- AutoUpdater.NET/DownloadUpdateDialog.sv.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.th.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.tr.resx | 240 +-- .../DownloadUpdateDialog.zh-TW.resx | 240 +-- AutoUpdater.NET/DownloadUpdateDialog.zh.resx | 240 +-- AutoUpdater.NET/IAuthentication.cs | 22 +- AutoUpdater.NET/IPersistenceProvider.cs | 59 +- .../JsonFilePersistenceProvider.cs | 182 +- AutoUpdater.NET/MyWebClient.cs | 29 +- AutoUpdater.NET/NetworkAuthentication.cs | 44 +- AutoUpdater.NET/ParseUpdateInfoEventArgs.cs | 39 +- AutoUpdater.NET/Properties/Resources.ar.resx | 256 +-- AutoUpdater.NET/Properties/Resources.cs.resx | 256 +-- AutoUpdater.NET/Properties/Resources.da.resx | 256 +-- AutoUpdater.NET/Properties/Resources.de.resx | 256 +-- AutoUpdater.NET/Properties/Resources.es.resx | 256 +-- AutoUpdater.NET/Properties/Resources.fr.resx | 256 +-- AutoUpdater.NET/Properties/Resources.it.resx | 256 +-- .../Properties/Resources.ja-JP.resx | 256 +-- AutoUpdater.NET/Properties/Resources.ko.resx | 256 +-- AutoUpdater.NET/Properties/Resources.lv.resx | 144 +- AutoUpdater.NET/Properties/Resources.nl.resx | 256 +-- AutoUpdater.NET/Properties/Resources.pl.resx | 256 +-- .../Properties/Resources.pt-BR.resx | 259 +-- AutoUpdater.NET/Properties/Resources.pt.resx | 8 +- AutoUpdater.NET/Properties/Resources.resx | 323 +-- AutoUpdater.NET/Properties/Resources.ru.resx | 256 +-- AutoUpdater.NET/Properties/Resources.sk.resx | 256 +-- AutoUpdater.NET/Properties/Resources.sv.resx | 256 +-- AutoUpdater.NET/Properties/Resources.th.resx | 259 +-- AutoUpdater.NET/Properties/Resources.tr.resx | 8 +- .../Properties/Resources.zh-TW.resx | 254 +-- AutoUpdater.NET/Properties/Resources.zh.resx | 256 +-- .../RegistryPersistenceProvider.cs | 138 +- AutoUpdater.NET/RemindLaterForm.ar.resx | 279 +-- AutoUpdater.NET/RemindLaterForm.cs | 109 +- AutoUpdater.NET/RemindLaterForm.cs.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.da.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.de.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.es.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.fr.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.it.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.ja-JP.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.ko.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.lv.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.nl.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.pl.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.pt-BR.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.pt.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.resx | 684 ++++--- AutoUpdater.NET/RemindLaterForm.ru.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.sk.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.sv.resx | 260 +-- AutoUpdater.NET/RemindLaterForm.th.resx | 262 +-- AutoUpdater.NET/RemindLaterForm.tr.resx | 262 +-- AutoUpdater.NET/RemindLaterForm.zh-TW.resx | 262 +-- AutoUpdater.NET/RemindLaterForm.zh.resx | 262 +-- AutoUpdater.NET/UpdateForm.ar.resx | 267 +-- AutoUpdater.NET/UpdateForm.cs | 336 +-- AutoUpdater.NET/UpdateForm.cs.resx | 268 +-- AutoUpdater.NET/UpdateForm.da.resx | 250 +-- AutoUpdater.NET/UpdateForm.de.resx | 250 +-- AutoUpdater.NET/UpdateForm.es.resx | 250 +-- AutoUpdater.NET/UpdateForm.fr.resx | 250 +-- AutoUpdater.NET/UpdateForm.it.resx | 262 +-- AutoUpdater.NET/UpdateForm.ja-JP.resx | 250 +-- AutoUpdater.NET/UpdateForm.ko.resx | 250 +-- AutoUpdater.NET/UpdateForm.lv.resx | 250 +-- AutoUpdater.NET/UpdateForm.nl.resx | 250 +-- AutoUpdater.NET/UpdateForm.pl.resx | 250 +-- AutoUpdater.NET/UpdateForm.pt-BR.resx | 250 +-- AutoUpdater.NET/UpdateForm.pt.resx | 250 +-- AutoUpdater.NET/UpdateForm.resx | 1797 +++++++++-------- AutoUpdater.NET/UpdateForm.ru.resx | 250 +-- AutoUpdater.NET/UpdateForm.sk.resx | 268 +-- AutoUpdater.NET/UpdateForm.sv.resx | 256 +-- AutoUpdater.NET/UpdateForm.th.resx | 250 +-- AutoUpdater.NET/UpdateForm.tr.resx | 250 +-- AutoUpdater.NET/UpdateForm.zh-TW.resx | 250 +-- AutoUpdater.NET/UpdateForm.zh.resx | 250 +-- AutoUpdater.NET/UpdateInfoEventArgs.cs | 242 +-- .../build/Autoupdater.NET.Official.nuspec | 104 +- AutoUpdaterTest/AutoUpdaterTest.csproj | 196 +- AutoUpdaterTest/FormMain.cs | 7 +- AutoUpdaterTest/FormMain.resx | 236 +-- AutoUpdaterTest/Program.cs | 8 +- AutoUpdaterTest/Properties/AssemblyInfo.cs | 4 +- .../Properties/Resources.Designer.cs | 1 - AutoUpdaterTest/Properties/Resources.resx | 232 +-- .../Properties/Settings.Designer.cs | 3 +- AutoUpdaterTest/Properties/Settings.settings | 8 +- AutoUpdaterTest/app.config | 5 +- AutoUpdaterTest/app.manifest | 120 +- AutoUpdaterTest/packages.config | 2 +- AutoUpdaterTestWPF/App.xaml | 5 +- AutoUpdaterTestWPF/App.xaml.cs | 11 +- AutoUpdaterTestWPF/AutoUpdaterTestWPF.csproj | 198 +- AutoUpdaterTestWPF/MainWindow.xaml | 13 +- AutoUpdaterTestWPF/MainWindow.xaml.cs | 6 +- AutoUpdaterTestWPF/Properties/AssemblyInfo.cs | 12 +- .../Properties/Resources.Designer.cs | 1 - AutoUpdaterTestWPF/Properties/Resources.resx | 230 ++- .../Properties/Settings.Designer.cs | 3 +- .../Properties/Settings.settings | 8 +- AutoUpdaterTestWPF/app.config | 5 +- README.md | 4 +- ZipExtractor/ExtensionMethods.cs | 13 +- ZipExtractor/FileUtil.cs | 242 +-- ZipExtractor/FormMain.cs | 476 ++--- ZipExtractor/FormMain.resx | 236 +-- ZipExtractor/Program.cs | 26 +- ZipExtractor/Properties/Resources.resx | 255 +-- ZipExtractor/Properties/Settings.settings | 8 +- ZipExtractor/ZipExtractor.csproj | 6 +- ZipExtractor/app.manifest | 120 +- appveyor.yml | 76 +- 138 files changed, 15708 insertions(+), 15039 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index d4920bc9..34f0d4e3 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2023 RBSoft - 1.8.0.0 - 1.8.0.0 - 1.8.0.0 + 1.8.1.0 + 1.8.1.0 + 1.8.1.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.8.0.0 + 1.8.1.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. @@ -39,18 +39,18 @@ full - - - - - - - - - - + + + + + + + + + + - + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 90a51156..47508f58 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -12,688 +12,707 @@ using System.Xml; using System.Xml.Serialization; using AutoUpdaterDotNET.Properties; +using Timer = System.Timers.Timer; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Enum representing the remind later time span. +/// +public enum RemindLaterFormat +{ + /// + /// Represents the time span in minutes. + /// + Minutes, + + /// + /// Represents the time span in hours. + /// + Hours, + + /// + /// Represents the time span in days. + /// + Days +} + +/// +/// Enum representing the effect of Mandatory flag. +/// +public enum Mode { /// - /// Enum representing the remind later time span. + /// In this mode, it ignores Remind Later and Skip values set previously and hide both buttons. + /// + [XmlEnum("0")] Normal, + + /// + /// In this mode, it won't show close button in addition to Normal mode behaviour. + /// + [XmlEnum("1")] Forced, + + /// + /// In this mode, it will start downloading and applying update without showing standard update dialog in addition to + /// Forced mode behaviour. + /// + [XmlEnum("2")] ForcedDownload +} + +/// +/// Main class that lets you auto update applications by setting some static fields and executing its Start method. +/// +public static class AutoUpdater +{ + /// + /// A delegate type to handle how to exit the application after update is downloaded. + /// + public delegate void ApplicationExitEventHandler(); + + /// + /// A delegate type for hooking up update notifications. + /// + /// + /// An object containing all the parameters received from AppCast XML file. If there will be an error + /// while looking for the XML file then this object will be null. + /// + public delegate void CheckForUpdateEventHandler(UpdateInfoEventArgs args); + + /// + /// A delegate type for hooking up parsing logic. + /// + /// An object containing the AppCast file received from server. + public delegate void ParseUpdateInfoHandler(ParseUpdateInfoEventArgs args); + + private static Timer _remindLaterTimer; + + private static bool _isWinFormsApplication; + + internal static Uri BaseUri; + + internal static bool Running; + + /// + /// URL of the xml file that contains information about latest version of the application. + /// + public static string AppCastURL; + + /// + /// Set the Application Title shown in Update dialog. Although AutoUpdater.NET will get it automatically, you can set + /// this property if you like to give custom Title. + /// + public static string AppTitle; + + /// + /// Set Basic Authentication credentials to navigate to the change log URL. + /// + public static IAuthentication BasicAuthChangeLog; + + /// + /// Set Basic Authentication credentials required to download the file. + /// + public static IAuthentication BasicAuthDownload; + + /// + /// Set Basic Authentication credentials required to download the XML file. + /// + public static IAuthentication BasicAuthXML; + + /// + /// Set this to true if you want to clear application directory before extracting update. + /// + public static bool ClearAppDirectory = false; + + /// + /// Set it to folder path where you want to download the update file. If not provided then it defaults to Temp folder. + /// + public static string DownloadPath; + + /// + /// If you are using a zip file as an update file, then you can set this value to a new executable path relative to the + /// installation directory. + /// + public static string ExecutablePath; + + /// + /// Login/password/domain for FTP-request + /// + public static NetworkCredential FtpCredentials; + + /// + /// Set the User-Agent string to be used for HTTP web requests. + /// + public static string HttpUserAgent; + + /// + /// If you are using a zip file as an update file then you can set this value to path where your app is installed. This + /// is only necessary when your installation directory differs from your executable path. + /// + public static string InstallationPath; + + /// + /// You can set this field to your current version if you don't want to determine the version from the assembly. + /// + public static Version InstalledVersion; + + /// + /// If this is true users see dialog where they can set remind later interval otherwise it will take the interval from + /// RemindLaterAt and RemindLaterTimeSpan fields. + /// + public static bool LetUserSelectRemindLater = true; + + /// + /// Set this to true if you want to ignore previously assigned Remind Later and Skip settings. It will also hide Remind + /// Later and Skip buttons. + /// + public static bool Mandatory; + + /// + /// Opens the download URL in default browser if true. Very useful if you have portable application. + /// + public static bool OpenDownloadPage; + + /// + /// Set this to an instance implementing the IPersistenceProvider interface for using a data storage method different + /// from the default Windows Registry based one. + /// + public static IPersistenceProvider PersistenceProvider; + + /// + /// Set Proxy server to use for all the web requests in AutoUpdater.NET. + /// + public static IWebProxy Proxy; + + /// + /// Remind Later interval after user should be reminded of update. + /// + public static int RemindLaterAt = 2; + + /// + /// Set if RemindLaterAt interval should be in Minutes, Hours or Days. /// - public enum RemindLaterFormat + public static RemindLaterFormat RemindLaterTimeSpan = RemindLaterFormat.Days; + + /// + /// AutoUpdater.NET will report errors if this is true. + /// + public static bool ReportErrors = false; + + /// + /// Set this to false if your application doesn't need administrator privileges to replace the old version. + /// + public static bool RunUpdateAsAdmin = true; + + /// + /// If this is true users can see the Remind Later button. + /// + public static bool ShowRemindLaterButton = true; + + /// + /// If this is true users can see the skip button. + /// + public static bool ShowSkipButton = true; + + /// + /// Set this to true if you want to run update check synchronously. + /// + public static bool Synchronous = false; + + /// + /// Set if you want the default update form to have a different size. + /// + public static Size? UpdateFormSize = null; + + /// + /// Set this to any of the available modes to change behaviour of the Mandatory flag. + /// + public static Mode UpdateMode; + + /// + /// An event that developers can use to exit the application gracefully. + /// + public static event ApplicationExitEventHandler ApplicationExitEvent; + + /// + /// An event that clients can use to be notified whenever the update is checked. + /// + public static event CheckForUpdateEventHandler CheckForUpdateEvent; + + /// + /// An event that clients can use to be notified whenever the AppCast file needs parsing. + /// + public static event ParseUpdateInfoHandler ParseUpdateInfoEvent; + + /// + /// Start checking for new version of application and display a dialog to the user if update is available. + /// + /// Assembly to use for version checking. + public static void Start(Assembly myAssembly = null) { - /// - /// Represents the time span in minutes. - /// - Minutes, - - /// - /// Represents the time span in hours. - /// - Hours, - - /// - /// Represents the time span in days. - /// - Days + Start(AppCastURL, myAssembly); } /// - /// Enum representing the effect of Mandatory flag. + /// Start checking for new version of application via FTP and display a dialog to the user if update is available. /// - public enum Mode + /// FTP URL of the xml file that contains information about latest version of the application. + /// Credentials required to connect to FTP server. + /// Assembly to use for version checking. + public static void Start(string appCast, NetworkCredential ftpCredentials, Assembly myAssembly = null) { - /// - /// In this mode, it ignores Remind Later and Skip values set previously and hide both buttons. - /// - [XmlEnum("0")] Normal, - - /// - /// In this mode, it won't show close button in addition to Normal mode behaviour. - /// - [XmlEnum("1")] Forced, - - /// - /// In this mode, it will start downloading and applying update without showing standard update dialog in addition to Forced mode behaviour. - /// - [XmlEnum("2")] ForcedDownload + FtpCredentials = ftpCredentials; + Start(appCast, myAssembly); } /// - /// Main class that lets you auto update applications by setting some static fields and executing its Start method. + /// Start checking for new version of application and display a dialog to the user if update is available. /// - public static class AutoUpdater + /// URL of the xml file that contains information about latest version of the application. + /// Assembly to use for version checking. + public static void Start(string appCast, Assembly myAssembly = null) { - private static System.Timers.Timer _remindLaterTimer; - - private static bool _isWinFormsApplication; - - internal static Uri BaseUri; - - internal static bool Running; - - /// - /// You can set this field to your current version if you don't want to determine the version from the assembly. - /// - public static Version InstalledVersion; - - /// - /// Set it to folder path where you want to download the update file. If not provided then it defaults to Temp folder. - /// - public static string DownloadPath; - - /// - /// If you are using a zip file as an update file then you can set this value to path where your app is installed. This is only necessary when your installation directory differs from your executable path. - /// - public static string InstallationPath; - - /// - /// If you are using a zip file as an update file, then you can set this value to a new executable path relative to the installation directory. - /// - public static string ExecutablePath; - - /// - /// Set the Application Title shown in Update dialog. Although AutoUpdater.NET will get it automatically, you can set this property if you like to give custom Title. - /// - public static string AppTitle; - - /// - /// URL of the xml file that contains information about latest version of the application. - /// - public static string AppCastURL; - - /// - /// Login/password/domain for FTP-request - /// - public static NetworkCredential FtpCredentials; - - /// - /// Opens the download URL in default browser if true. Very usefull if you have portable application. - /// - public static bool OpenDownloadPage; - - /// - /// Set Basic Authentication credentials required to download the file. - /// - public static IAuthentication BasicAuthDownload; - - /// - /// Set Basic Authentication credentials required to download the XML file. - /// - public static IAuthentication BasicAuthXML; - - /// - /// Set Basic Authentication credentials to navigate to the change log URL. - /// - public static IAuthentication BasicAuthChangeLog; - - /// - /// Set the User-Agent string to be used for HTTP web requests. - /// - public static string HttpUserAgent; - - /// - /// If this is true users can see the skip button. - /// - public static bool ShowSkipButton = true; - - /// - /// If this is true users can see the Remind Later button. - /// - public static bool ShowRemindLaterButton = true; - - /// - /// If this is true users see dialog where they can set remind later interval otherwise it will take the interval from - /// RemindLaterAt and RemindLaterTimeSpan fields. - /// - public static bool LetUserSelectRemindLater = true; - - /// - /// Remind Later interval after user should be reminded of update. - /// - public static int RemindLaterAt = 2; - - /// - /// AutoUpdater.NET will report errors if this is true. - /// - public static bool ReportErrors = false; - - /// - /// Set this to false if your application doesn't need administrator privileges to replace the old version. - /// - public static bool RunUpdateAsAdmin = true; - - /// - /// Set this to true if you want to run update check synchronously. - /// - public static bool Synchronous = false; - - /// - /// Set this to true if you want to clear application directory before extracting update. - /// - public static bool ClearAppDirectory = false; - - /// - /// Set this to true if you want to ignore previously assigned Remind Later and Skip settings. It will also hide Remind Later and Skip buttons. - /// - public static bool Mandatory; - - /// - /// Set this to any of the available modes to change behaviour of the Mandatory flag. - /// - public static Mode UpdateMode; - - /// - /// Set Proxy server to use for all the web requests in AutoUpdater.NET. - /// - public static IWebProxy Proxy; - - /// - /// Set this to an instance implementing the IPersistenceProvider interface for using a data storage method different from the default Windows Registry based one. - /// - public static IPersistenceProvider PersistenceProvider; - - /// - /// Set if RemindLaterAt interval should be in Minutes, Hours or Days. - /// - public static RemindLaterFormat RemindLaterTimeSpan = RemindLaterFormat.Days; - - /// - /// A delegate type to handle how to exit the application after update is downloaded. - /// - public delegate void ApplicationExitEventHandler(); - - /// - /// An event that developers can use to exit the application gracefully. - /// - public static event ApplicationExitEventHandler ApplicationExitEvent; - - /// - /// A delegate type for hooking up update notifications. - /// - /// An object containing all the parameters received from AppCast XML file. If there will be an error while looking for the XML file then this object will be null. - public delegate void CheckForUpdateEventHandler(UpdateInfoEventArgs args); - - /// - /// An event that clients can use to be notified whenever the update is checked. - /// - public static event CheckForUpdateEventHandler CheckForUpdateEvent; - - /// - /// A delegate type for hooking up parsing logic. - /// - /// An object containing the AppCast file received from server. - public delegate void ParseUpdateInfoHandler(ParseUpdateInfoEventArgs args); - - /// - /// An event that clients can use to be notified whenever the AppCast file needs parsing. - /// - public static event ParseUpdateInfoHandler ParseUpdateInfoEvent; - - /// - /// Set if you want the default update form to have a different size. - /// - public static Size? UpdateFormSize = null; - - /// - /// Start checking for new version of application and display a dialog to the user if update is available. - /// - /// Assembly to use for version checking. - public static void Start(Assembly myAssembly = null) + try + { + ServicePointManager.SecurityProtocol |= (SecurityProtocolType)192 | + (SecurityProtocolType)768 | (SecurityProtocolType)3072; + } + catch (NotSupportedException) { - Start(AppCastURL, myAssembly); } - /// - /// Start checking for new version of application via FTP and display a dialog to the user if update is available. - /// - /// FTP URL of the xml file that contains information about latest version of the application. - /// Credentials required to connect to FTP server. - /// Assembly to use for version checking. - public static void Start(string appCast, NetworkCredential ftpCredentials, Assembly myAssembly = null) + if (Mandatory && _remindLaterTimer != null) { - FtpCredentials = ftpCredentials; - Start(appCast, myAssembly); + _remindLaterTimer.Stop(); + _remindLaterTimer.Close(); + _remindLaterTimer = null; } - /// - /// Start checking for new version of application and display a dialog to the user if update is available. - /// - /// URL of the xml file that contains information about latest version of the application. - /// Assembly to use for version checking. - public static void Start(string appCast, Assembly myAssembly = null) + if (Running || _remindLaterTimer != null) { - try - { - ServicePointManager.SecurityProtocol |= (SecurityProtocolType) 192 | - (SecurityProtocolType) 768 | (SecurityProtocolType) 3072; - } - catch (NotSupportedException) - { - } + return; + } - if (Mandatory && _remindLaterTimer != null) - { - _remindLaterTimer.Stop(); - _remindLaterTimer.Close(); - _remindLaterTimer = null; - } + Running = true; - if (Running || _remindLaterTimer != null) return; + AppCastURL = appCast; - Running = true; + _isWinFormsApplication = Application.MessageLoop; - AppCastURL = appCast; + if (!_isWinFormsApplication) + { + Application.EnableVisualStyles(); + } - _isWinFormsApplication = Application.MessageLoop; + Assembly assembly = myAssembly ?? Assembly.GetEntryAssembly(); - if (!_isWinFormsApplication) + if (Synchronous) + { + try { - Application.EnableVisualStyles(); + object result = CheckUpdate(assembly); + + if (StartUpdate(result)) + { + return; + } + + Running = false; + } + catch (Exception exception) + { + ShowError(exception); } + } + else + { + using var backgroundWorker = new BackgroundWorker(); - Assembly assembly = myAssembly ?? Assembly.GetEntryAssembly(); + backgroundWorker.DoWork += (_, args) => + { + var mainAssembly = args.Argument as Assembly; + + args.Result = CheckUpdate(mainAssembly); + }; - if (Synchronous) + backgroundWorker.RunWorkerCompleted += (_, args) => { - try + if (args.Error != null) { - var result = CheckUpdate(assembly); - - if (StartUpdate(result)) + ShowError(args.Error); + } + else + { + if (!args.Cancelled && StartUpdate(args.Result)) { return; } Running = false; } - catch (Exception exception) - { - ShowError(exception); - } - } - else - { - using var backgroundWorker = new BackgroundWorker(); + }; - backgroundWorker.DoWork += (_, args) => - { - Assembly mainAssembly = args.Argument as Assembly; + backgroundWorker.RunWorkerAsync(assembly); + } + } - args.Result = CheckUpdate(mainAssembly); - }; + private static object CheckUpdate(Assembly mainAssembly) + { + var companyAttribute = + (AssemblyCompanyAttribute)GetAttribute(mainAssembly, typeof(AssemblyCompanyAttribute)); + string appCompany = companyAttribute != null ? companyAttribute.Company : ""; - backgroundWorker.RunWorkerCompleted += (_, args) => - { - if (args.Error != null) - { - ShowError(args.Error); - } - else - { - if (!args.Cancelled) - { - if (StartUpdate(args.Result)) - { - return; - } - } + if (string.IsNullOrEmpty(AppTitle)) + { + var titleAttribute = + (AssemblyTitleAttribute)GetAttribute(mainAssembly, typeof(AssemblyTitleAttribute)); + AppTitle = titleAttribute != null ? titleAttribute.Title : mainAssembly.GetName().Name; + } - Running = false; - } - }; + string registryLocation = !string.IsNullOrEmpty(appCompany) + ? $@"Software\{appCompany}\{AppTitle}\AutoUpdater" + : $@"Software\{AppTitle}\AutoUpdater"; - backgroundWorker.RunWorkerAsync(assembly); - } - } + PersistenceProvider ??= new RegistryPersistenceProvider(registryLocation); - private static object CheckUpdate(Assembly mainAssembly) + BaseUri = new Uri(AppCastURL); + + UpdateInfoEventArgs args; + using (MyWebClient client = GetWebClient(BaseUri, BasicAuthXML)) { - var companyAttribute = - (AssemblyCompanyAttribute) GetAttribute(mainAssembly, typeof(AssemblyCompanyAttribute)); - string appCompany = companyAttribute != null ? companyAttribute.Company : ""; + string xml = client.DownloadString(BaseUri); - if (string.IsNullOrEmpty(AppTitle)) + if (ParseUpdateInfoEvent == null) + { + var xmlSerializer = new XmlSerializer(typeof(UpdateInfoEventArgs)); + var xmlTextReader = new XmlTextReader(new StringReader(xml)) { XmlResolver = null }; + args = (UpdateInfoEventArgs)xmlSerializer.Deserialize(xmlTextReader); + } + else { - var titleAttribute = - (AssemblyTitleAttribute) GetAttribute(mainAssembly, typeof(AssemblyTitleAttribute)); - AppTitle = titleAttribute != null ? titleAttribute.Title : mainAssembly.GetName().Name; + var parseArgs = new ParseUpdateInfoEventArgs(xml); + ParseUpdateInfoEvent(parseArgs); + args = parseArgs.UpdateInfo; } + } - string registryLocation = !string.IsNullOrEmpty(appCompany) - ? $@"Software\{appCompany}\{AppTitle}\AutoUpdater" - : $@"Software\{AppTitle}\AutoUpdater"; + if (string.IsNullOrEmpty(args?.CurrentVersion) || string.IsNullOrEmpty(args.DownloadURL)) + { + throw new MissingFieldException(); + } - PersistenceProvider ??= new RegistryPersistenceProvider(registryLocation); + args.InstalledVersion = InstalledVersion ?? mainAssembly.GetName().Version; + args.IsUpdateAvailable = new Version(args.CurrentVersion) > args.InstalledVersion; - BaseUri = new Uri(AppCastURL); + if (!Mandatory) + { + if (string.IsNullOrEmpty(args.Mandatory.MinimumVersion) || + args.InstalledVersion < new Version(args.Mandatory.MinimumVersion)) + { + Mandatory = args.Mandatory.Value; + UpdateMode = args.Mandatory.UpdateMode; + } + } - UpdateInfoEventArgs args; - using (MyWebClient client = GetWebClient(BaseUri, BasicAuthXML)) + if (Mandatory) + { + ShowRemindLaterButton = false; + ShowSkipButton = false; + } + else + { + // Read the persisted state from the persistence provider. + // This method makes the persistence handling independent from the storage method. + Version skippedVersion = PersistenceProvider.GetSkippedVersion(); + if (skippedVersion != null) { - string xml = client.DownloadString(BaseUri); - - if (ParseUpdateInfoEvent == null) + var currentVersion = new Version(args.CurrentVersion); + if (currentVersion <= skippedVersion) { - XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdateInfoEventArgs)); - XmlTextReader xmlTextReader = new XmlTextReader(new StringReader(xml)) {XmlResolver = null}; - args = (UpdateInfoEventArgs) xmlSerializer.Deserialize(xmlTextReader); + return null; } - else + + if (currentVersion > skippedVersion) { - ParseUpdateInfoEventArgs parseArgs = new ParseUpdateInfoEventArgs(xml); - ParseUpdateInfoEvent(parseArgs); - args = parseArgs.UpdateInfo; + // Update the persisted state. Its no longer makes sense to have this flag set as we are working on a newer application version. + PersistenceProvider.SetSkippedVersion(null); } } - if (string.IsNullOrEmpty(args?.CurrentVersion) || string.IsNullOrEmpty(args.DownloadURL)) + DateTime? remindLaterAt = PersistenceProvider.GetRemindLater(); + if (remindLaterAt == null) { - throw new MissingFieldException(); + return args; } - args.InstalledVersion = InstalledVersion ?? mainAssembly.GetName().Version; - args.IsUpdateAvailable = new Version(args.CurrentVersion) > args.InstalledVersion; + int compareResult = DateTime.Compare(DateTime.Now, remindLaterAt.Value); - if (!Mandatory) + if (compareResult < 0) { - if (string.IsNullOrEmpty(args.Mandatory.MinimumVersion) || - args.InstalledVersion < new Version(args.Mandatory.MinimumVersion)) - { - Mandatory = args.Mandatory.Value; - UpdateMode = args.Mandatory.UpdateMode; - } + return remindLaterAt.Value; } + } - if (Mandatory) - { - ShowRemindLaterButton = false; - ShowSkipButton = false; - } - else - { - // Read the persisted state from the persistence provider. - // This method makes the persistence handling independent from the storage method. - var skippedVersion = PersistenceProvider.GetSkippedVersion(); - if (skippedVersion != null) - { - var currentVersion = new Version(args.CurrentVersion); - if (currentVersion <= skippedVersion) - return null; - - if (currentVersion > skippedVersion) - { - // Update the persisted state. Its no longer makes sense to have this flag set as we are working on a newer application version. - PersistenceProvider.SetSkippedVersion(null); - } - } - - var remindLaterAt = PersistenceProvider.GetRemindLater(); - if (remindLaterAt != null) - { - int compareResult = DateTime.Compare(DateTime.Now, remindLaterAt.Value); - - if (compareResult < 0) - { - return remindLaterAt.Value; - } - } - } + return args; + } - return args; + private static bool StartUpdate(object result) + { + if (result is DateTime time) + { + SetTimer(time); } - - private static bool StartUpdate(object result) + else { - if (result is DateTime time) + if (result is not UpdateInfoEventArgs args) { - SetTimer(time); + return false; + } + + if (CheckForUpdateEvent != null) + { + CheckForUpdateEvent(args); } else { - if (result is not UpdateInfoEventArgs args) return false; - - if (CheckForUpdateEvent != null) - { - CheckForUpdateEvent(args); - } - else + if (args.IsUpdateAvailable) { - if (args.IsUpdateAvailable) + if (Mandatory && UpdateMode == Mode.ForcedDownload) { - if (Mandatory && UpdateMode == Mode.ForcedDownload) + DownloadUpdate(args); + Exit(); + } + else + { + if (Thread.CurrentThread.GetApartmentState().Equals(ApartmentState.STA)) { - DownloadUpdate(args); - Exit(); + ShowUpdateForm(args); } else { - if (Thread.CurrentThread.GetApartmentState().Equals(ApartmentState.STA)) - { - ShowUpdateForm(args); - } - else - { - Thread thread = new Thread(new ThreadStart(delegate { ShowUpdateForm(args); })); - thread.CurrentCulture = - thread.CurrentUICulture = CultureInfo.CurrentCulture; - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - thread.Join(); - } + var thread = new Thread(new ThreadStart(delegate { ShowUpdateForm(args); })); + thread.CurrentCulture = + thread.CurrentUICulture = CultureInfo.CurrentCulture; + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + thread.Join(); } - - return true; } - if (ReportErrors) - { - MessageBox.Show(Resources.UpdateUnavailableMessage, - Resources.UpdateUnavailableCaption, - MessageBoxButtons.OK, MessageBoxIcon.Information); - } + return true; } - } - - return false; - } - private static void ShowError(Exception exception) - { - if (CheckForUpdateEvent != null) - { - CheckForUpdateEvent(new UpdateInfoEventArgs {Error = exception}); - } - else - { if (ReportErrors) { - if (exception is WebException) - { - MessageBox.Show( - Resources.UpdateCheckFailedMessage, - Resources.UpdateCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - else - { - MessageBox.Show(exception.Message, - exception.GetType().ToString(), MessageBoxButtons.OK, - MessageBoxIcon.Error); - } + MessageBox.Show(Resources.UpdateUnavailableMessage, + Resources.UpdateUnavailableCaption, + MessageBoxButtons.OK, MessageBoxIcon.Information); } } - - Running = false; } - /// - /// Detects and exits all instances of running assembly, including current. - /// - internal static void Exit() + return false; + } + + private static void ShowError(Exception exception) + { + if (CheckForUpdateEvent != null) + { + CheckForUpdateEvent(new UpdateInfoEventArgs { Error = exception }); + } + else { - var currentProcess = Process.GetCurrentProcess(); - foreach (var process in Process.GetProcessesByName(currentProcess.ProcessName)) + if (ReportErrors) { - string processPath; - try + if (exception is WebException) { - processPath = process.MainModule?.FileName; + MessageBox.Show( + Resources.UpdateCheckFailedMessage, + Resources.UpdateCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error); } - catch (Win32Exception) + else { - // Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances. - // This means this is not the process we are looking for so we can safely skip this. - continue; + MessageBox.Show(exception.Message, + exception.GetType().ToString(), MessageBoxButtons.OK, + MessageBoxIcon.Error); } + } + } - //get all instances of assembly except current - if (process.Id != currentProcess.Id && currentProcess.MainModule?.FileName == processPath) - { - if (process.CloseMainWindow()) - { - process.WaitForExit((int) TimeSpan.FromSeconds(10) - .TotalMilliseconds); //give some time to process message - } + Running = false; + } - if (!process.HasExited) - { - process.Kill(); //TODO: Show UI message asking user to close program himself instead of silently killing it - } - } + /// + /// Detects and exits all instances of running assembly, including current. + /// + internal static void Exit() + { + var currentProcess = Process.GetCurrentProcess(); + foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) + { + string processPath; + try + { + processPath = process.MainModule?.FileName; + } + catch (Win32Exception) + { + // Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances. + // This means this is not the process we are looking for so we can safely skip this. + continue; } - if (ApplicationExitEvent != null) + // Get all instances of assembly except current + if (process.Id == currentProcess.Id || currentProcess.MainModule?.FileName != processPath) { - ApplicationExitEvent(); + continue; } - else + + if (process.CloseMainWindow()) { - if (_isWinFormsApplication) - { - MethodInvoker methodInvoker = Application.Exit; - methodInvoker.Invoke(); - } - else if (System.Windows.Application.Current != null) - { - System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => - System.Windows.Application.Current.Shutdown())); - } - else - { - Environment.Exit(0); - } + process.WaitForExit((int)TimeSpan.FromSeconds(10) + .TotalMilliseconds); // Give some time to process message + } + + if (!process.HasExited) + { + process.Kill(); //TODO: Show UI message asking user to close program himself instead of silently killing it } } - private static Attribute GetAttribute(Assembly assembly, Type attributeType) + if (ApplicationExitEvent != null) + { + ApplicationExitEvent(); + } + else { - object[] attributes = assembly.GetCustomAttributes(attributeType, false); - if (attributes.Length == 0) + if (_isWinFormsApplication) { - return null; + MethodInvoker methodInvoker = Application.Exit; + methodInvoker.Invoke(); + } + else if (System.Windows.Application.Current != null) + { + System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => + System.Windows.Application.Current.Shutdown())); + } + else + { + Environment.Exit(0); } - - return (Attribute) attributes[0]; } + } - internal static string GetUserAgent() + private static Attribute GetAttribute(Assembly assembly, Type attributeType) + { + object[] attributes = assembly.GetCustomAttributes(attributeType, false); + if (attributes.Length == 0) { - return string.IsNullOrEmpty(HttpUserAgent) ? $"AutoUpdater.NET" : HttpUserAgent; + return null; } - internal static void SetTimer(DateTime remindLater) - { - TimeSpan timeSpan = remindLater - DateTime.Now; + return (Attribute)attributes[0]; + } - var context = SynchronizationContext.Current; + internal static string GetUserAgent() + { + return string.IsNullOrEmpty(HttpUserAgent) ? "AutoUpdater.NET" : HttpUserAgent; + } - _remindLaterTimer = new System.Timers.Timer - { - Interval = Math.Max(1, timeSpan.TotalMilliseconds), - AutoReset = false - }; + internal static void SetTimer(DateTime remindLater) + { + TimeSpan timeSpan = remindLater - DateTime.Now; + + SynchronizationContext context = SynchronizationContext.Current; + + _remindLaterTimer = new Timer + { + Interval = Math.Max(1, timeSpan.TotalMilliseconds), + AutoReset = false + }; - _remindLaterTimer.Elapsed += delegate + _remindLaterTimer.Elapsed += delegate + { + _remindLaterTimer = null; + if (context != null) { - _remindLaterTimer = null; - if (context != null) + try { - try - { - context.Send(_ => Start(), null); - } - catch (InvalidAsynchronousStateException) - { - Start(); - } + context.Send(_ => Start(), null); } - else + catch (InvalidAsynchronousStateException) { Start(); } - }; - - _remindLaterTimer.Start(); - } - - /// - /// Opens the Download window that download the update and execute the installer when download completes. - /// - public static bool DownloadUpdate(UpdateInfoEventArgs args) - { - using var downloadDialog = new DownloadUpdateDialog(args); - - try - { - return downloadDialog.ShowDialog().Equals(DialogResult.OK); } - catch (TargetInvocationException) + else { + Start(); } + }; - return false; - } + _remindLaterTimer.Start(); + } + + /// + /// Opens the Download window that download the update and execute the installer when download completes. + /// + public static bool DownloadUpdate(UpdateInfoEventArgs args) + { + using var downloadDialog = new DownloadUpdateDialog(args); - /// - /// Shows standard update dialog. - /// - public static void ShowUpdateForm(UpdateInfoEventArgs args) + try { - using var updateForm = new UpdateForm(args); + return downloadDialog.ShowDialog().Equals(DialogResult.OK); + } + catch (TargetInvocationException) + { + // ignored + } - if (UpdateFormSize.HasValue) - { - updateForm.Size = UpdateFormSize.Value; - } + return false; + } - if (updateForm.ShowDialog().Equals(DialogResult.OK)) - { - Exit(); - } + /// + /// Shows standard update dialog. + /// + public static void ShowUpdateForm(UpdateInfoEventArgs args) + { + using var updateForm = new UpdateForm(args); + + if (UpdateFormSize.HasValue) + { + updateForm.Size = UpdateFormSize.Value; } - internal static MyWebClient GetWebClient(Uri uri, IAuthentication basicAuthentication) + if (updateForm.ShowDialog().Equals(DialogResult.OK)) { - MyWebClient webClient = new MyWebClient - { - CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) - }; + Exit(); + } + } - if (Proxy != null) - { - webClient.Proxy = Proxy; - } + internal static MyWebClient GetWebClient(Uri uri, IAuthentication basicAuthentication) + { + var webClient = new MyWebClient + { + CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) + }; - if (uri.Scheme.Equals(Uri.UriSchemeFtp)) - { - webClient.Credentials = FtpCredentials; - } - else - { - basicAuthentication?.Apply(ref webClient); + if (Proxy != null) + { + webClient.Proxy = Proxy; + } - webClient.Headers[HttpRequestHeader.UserAgent] = HttpUserAgent; - } + if (uri.Scheme.Equals(Uri.UriSchemeFtp)) + { + webClient.Credentials = FtpCredentials; + } + else + { + basicAuthentication?.Apply(ref webClient); - return webClient; + webClient.Headers[HttpRequestHeader.UserAgent] = HttpUserAgent; } + + return webClient; } } \ No newline at end of file diff --git a/AutoUpdater.NET/BasicAuthentication.cs b/AutoUpdater.NET/BasicAuthentication.cs index de4b41de..59fb7326 100644 --- a/AutoUpdater.NET/BasicAuthentication.cs +++ b/AutoUpdater.NET/BasicAuthentication.cs @@ -2,39 +2,38 @@ using System.Net; using System.Text; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Provides Basic Authentication header for web request. +/// +public class BasicAuthentication : IAuthentication { /// - /// Provides Basic Authentication header for web request. + /// Initializes credentials for Basic Authentication. /// - public class BasicAuthentication : IAuthentication + /// Username to use for Basic Authentication + /// Password to use for Basic Authentication + public BasicAuthentication(string username, string password) { - internal string Username { get; } + Username = username; + Password = password; + } + + internal string Username { get; } - internal string Password { get; } + internal string Password { get; } - /// - /// Initializes credentials for Basic Authentication. - /// - /// Username to use for Basic Authentication - /// Password to use for Basic Authentication - public BasicAuthentication(string username, string password) - { - Username = username; - Password = password; - } + /// + public void Apply(ref MyWebClient webClient) + { + webClient.Headers[HttpRequestHeader.Authorization] = ToString(); + } - /// - public override string ToString() - { - var token = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{Username}:{Password}")); - return $"Basic {token}"; - } - - /// - public void Apply(ref MyWebClient webClient) - { - webClient.Headers[HttpRequestHeader.Authorization] = ToString(); - } + /// + public override string ToString() + { + string token = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{Username}:{Password}")); + return $"Basic {token}"; } -} +} \ No newline at end of file diff --git a/AutoUpdater.NET/CustomAuthentication.cs b/AutoUpdater.NET/CustomAuthentication.cs index d737d968..978011c9 100644 --- a/AutoUpdater.NET/CustomAuthentication.cs +++ b/AutoUpdater.NET/CustomAuthentication.cs @@ -1,33 +1,32 @@ using System.Net; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Provides Custom Authentication header for web request. +/// +public class CustomAuthentication : IAuthentication { /// - /// Provides Custom Authentication header for web request. + /// Initializes authorization header value for Custom Authentication /// - public class CustomAuthentication : IAuthentication + /// Value to use as http request header authorization value + public CustomAuthentication(string httpRequestHeaderAuthorizationValue) { - private string HttpRequestHeaderAuthorizationValue { get; } + HttpRequestHeaderAuthorizationValue = httpRequestHeaderAuthorizationValue; + } + + private string HttpRequestHeaderAuthorizationValue { get; } - /// - /// Initializes authorization header value for Custom Authentication - /// - /// Value to use as http request header authorization value - public CustomAuthentication(string httpRequestHeaderAuthorizationValue) - { - HttpRequestHeaderAuthorizationValue = httpRequestHeaderAuthorizationValue; - } - - /// - public override string ToString() - { - return HttpRequestHeaderAuthorizationValue; - } + /// + public void Apply(ref MyWebClient webClient) + { + webClient.Headers[HttpRequestHeader.Authorization] = ToString(); + } - /// - public void Apply(ref MyWebClient webClient) - { - webClient.Headers[HttpRequestHeader.Authorization] = ToString(); - } + /// + public override string ToString() + { + return HttpRequestHeaderAuthorizationValue; } -} +} \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.ar.resx b/AutoUpdater.NET/DownloadUpdateDialog.ar.resx index 517ab8cc..acd65795 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.ar.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.ar.resx @@ -1,134 +1,141 @@  - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Yes - - - - True - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + Yes + + + + True + + تحديث النظام - + جارٍ تنزيل التحديث ... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 185fb69b..f3acdb6a 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -7,296 +7,339 @@ using System.Net; using System.Net.Mime; using System.Security.Cryptography; +using System.Text; using System.Windows.Forms; using AutoUpdaterDotNET.Properties; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +internal partial class DownloadUpdateDialog : Form { - internal partial class DownloadUpdateDialog : Form + private readonly UpdateInfoEventArgs _args; + + private DateTime _startedAt; + + private string _tempFile; + + private MyWebClient _webClient; + + public DownloadUpdateDialog(UpdateInfoEventArgs args) { - private readonly UpdateInfoEventArgs _args; + InitializeComponent(); + + _args = args; - private string _tempFile; + if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) + { + ControlBox = false; + } + } - private MyWebClient _webClient; + private void DownloadUpdateDialogLoad(object sender, EventArgs e) + { + var uri = new Uri(_args.DownloadURL); - private DateTime _startedAt; + _webClient = AutoUpdater.GetWebClient(uri, AutoUpdater.BasicAuthDownload); - public DownloadUpdateDialog(UpdateInfoEventArgs args) + if (string.IsNullOrEmpty(AutoUpdater.DownloadPath)) + { + _tempFile = Path.GetTempFileName(); + } + else { - InitializeComponent(); + _tempFile = Path.Combine(AutoUpdater.DownloadPath, $"{Guid.NewGuid().ToString()}.tmp"); + if (!Directory.Exists(AutoUpdater.DownloadPath)) + { + Directory.CreateDirectory(AutoUpdater.DownloadPath); + } + } - _args = args; + _webClient.DownloadProgressChanged += OnDownloadProgressChanged; + + _webClient.DownloadFileCompleted += WebClientOnDownloadFileCompleted; + + _webClient.DownloadFileAsync(uri, _tempFile); + } - if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) + private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + if (_startedAt == default) + { + _startedAt = DateTime.Now; + } + else + { + TimeSpan timeSpan = DateTime.Now - _startedAt; + var totalSeconds = (long)timeSpan.TotalSeconds; + if (totalSeconds > 0) { - ControlBox = false; + long bytesPerSecond = e.BytesReceived / totalSeconds; + labelInformation.Text = + string.Format(Resources.DownloadSpeedMessage, BytesToString(bytesPerSecond)); } } - private void DownloadUpdateDialogLoad(object sender, EventArgs e) + labelSize.Text = $@"{BytesToString(e.BytesReceived)} / {BytesToString(e.TotalBytesToReceive)}"; + progressBar.Value = e.ProgressPercentage; + } + + private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEventArgs asyncCompletedEventArgs) + { + if (asyncCompletedEventArgs.Cancelled) { - var uri = new Uri(_args.DownloadURL); + return; + } - _webClient = AutoUpdater.GetWebClient(uri, AutoUpdater.BasicAuthDownload); + try + { + if (asyncCompletedEventArgs.Error != null) + { + throw asyncCompletedEventArgs.Error; + } - if (string.IsNullOrEmpty(AutoUpdater.DownloadPath)) + if (_args.CheckSum != null) { - _tempFile = Path.GetTempFileName(); + CompareChecksum(_tempFile, _args.CheckSum); } - else + + // Try to parse the content disposition header if it exists. + ContentDisposition contentDisposition = null; + if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) { - _tempFile = Path.Combine(AutoUpdater.DownloadPath, $"{Guid.NewGuid().ToString()}.tmp"); - if (!Directory.Exists(AutoUpdater.DownloadPath)) + try + { + contentDisposition = + new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); + } + catch (FormatException) { - Directory.CreateDirectory(AutoUpdater.DownloadPath); + // Ignore content disposition header if it is wrongly formatted. + contentDisposition = null; } } - _webClient.DownloadProgressChanged += OnDownloadProgressChanged; + string fileName = string.IsNullOrEmpty(contentDisposition?.FileName) + ? Path.GetFileName(_webClient.ResponseUri.LocalPath) + : contentDisposition.FileName; - _webClient.DownloadFileCompleted += WebClientOnDownloadFileCompleted; + if (string.IsNullOrWhiteSpace(fileName)) + { + throw new WebException(Resources.UnableToDetermineFilenameMessage); + } - _webClient.DownloadFileAsync(uri, _tempFile); - } + string tempPath = + Path.Combine( + string.IsNullOrEmpty(AutoUpdater.DownloadPath) + ? Path.GetTempPath() + : AutoUpdater.DownloadPath, + fileName); - private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) - { - if (_startedAt == default) + if (File.Exists(tempPath)) { - _startedAt = DateTime.Now; + File.Delete(tempPath); } - else + + File.Move(_tempFile, tempPath); + + string installerArgs = null; + if (!string.IsNullOrEmpty(_args.InstallerArgs)) { - var timeSpan = DateTime.Now - _startedAt; - long totalSeconds = (long)timeSpan.TotalSeconds; - if (totalSeconds > 0) - { - var bytesPerSecond = e.BytesReceived / totalSeconds; - labelInformation.Text = - string.Format(Resources.DownloadSpeedMessage, BytesToString(bytesPerSecond)); - } + installerArgs = _args.InstallerArgs.Replace("%path%", + Path.GetDirectoryName(Process.GetCurrentProcess().MainModule?.FileName)); } - labelSize.Text = $@"{BytesToString(e.BytesReceived)} / {BytesToString(e.TotalBytesToReceive)}"; - progressBar.Value = e.ProgressPercentage; - } - - private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEventArgs asyncCompletedEventArgs) - { - if (asyncCompletedEventArgs.Cancelled) return; + var processStartInfo = new ProcessStartInfo + { + FileName = tempPath, + UseShellExecute = true, + Arguments = installerArgs ?? string.Empty + }; - try + string extension = Path.GetExtension(tempPath); + if (extension.Equals(".zip", StringComparison.OrdinalIgnoreCase)) { - if (asyncCompletedEventArgs.Error != null) - { - throw asyncCompletedEventArgs.Error; - } + string installerPath = + Path.Combine(Path.GetDirectoryName(tempPath) ?? throw new InvalidOperationException(), + "ZipExtractor.exe"); + + File.WriteAllBytes(installerPath, Resources.ZipExtractor); + + string currentExe = Process.GetCurrentProcess().MainModule?.FileName; + string updatedExe = _args.ExecutablePath; + string extractionPath = Path.GetDirectoryName(currentExe); - if (_args.CheckSum != null) + if (string.IsNullOrWhiteSpace(updatedExe) && + !string.IsNullOrWhiteSpace(AutoUpdater.ExecutablePath)) { - CompareChecksum(_tempFile, _args.CheckSum); + updatedExe = AutoUpdater.ExecutablePath; } - // Try to parse the content disposition header if it exists. - ContentDisposition contentDisposition = null; - if (!string.IsNullOrWhiteSpace(_webClient.ResponseHeaders?["Content-Disposition"])) + if (!string.IsNullOrWhiteSpace(AutoUpdater.InstallationPath) && + Directory.Exists(AutoUpdater.InstallationPath)) { - try - { - contentDisposition = - new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]); - } - catch (FormatException) - { - // Ignore content disposition header if it is wrongly formatted. - contentDisposition = null; - } + extractionPath = AutoUpdater.InstallationPath; } - var fileName = string.IsNullOrEmpty(contentDisposition?.FileName) - ? Path.GetFileName(_webClient.ResponseUri.LocalPath) - : contentDisposition.FileName; - - if (string.IsNullOrWhiteSpace(fileName)) + processStartInfo = new ProcessStartInfo { - throw new WebException(Resources.UnableToDetermineFilenameMessage); - } + FileName = installerPath, + UseShellExecute = true + }; - var tempPath = - Path.Combine( - string.IsNullOrEmpty(AutoUpdater.DownloadPath) - ? Path.GetTempPath() - : AutoUpdater.DownloadPath, - fileName); +#if NETFRAMEWORK + var arguments = + new StringBuilder( + $"--input \"{tempPath}\" --output \"{extractionPath}\" --current-exe \"{currentExe}\""); - if (File.Exists(tempPath)) + if (!string.IsNullOrWhiteSpace(updatedExe)) { - File.Delete(tempPath); + arguments.Append($" --updated-exe \"{updatedExe}\""); } - File.Move(_tempFile, tempPath); - - string installerArgs = null; - if (!string.IsNullOrEmpty(_args.InstallerArgs)) + if (AutoUpdater.ClearAppDirectory) { - installerArgs = _args.InstallerArgs.Replace("%path%", - Path.GetDirectoryName(Process.GetCurrentProcess().MainModule?.FileName)); + arguments.Append(" --clear"); } - var processStartInfo = new ProcessStartInfo - { - FileName = tempPath, - UseShellExecute = true, - Arguments = installerArgs ?? string.Empty - }; + string args = string.Join(" ", Environment.GetCommandLineArgs().Skip(1).Select(arg => $"\"{arg}\"")); + arguments.Append($" --args \"{args}\""); - var extension = Path.GetExtension(tempPath); - if (extension.Equals(".zip", StringComparison.OrdinalIgnoreCase)) + processStartInfo.Arguments = arguments.ToString().Replace("\\\"", "\\\\\""); +#else + processStartInfo.ArgumentList.Add("--input"); + processStartInfo.ArgumentList.Add(tempPath); + processStartInfo.ArgumentList.Add("--output"); + processStartInfo.ArgumentList.Add(extractionPath); + processStartInfo.ArgumentList.Add("--current-exe"); + processStartInfo.ArgumentList.Add(currentExe); + + if (!string.IsNullOrWhiteSpace(updatedExe)) { - string installerPath = - Path.Combine(Path.GetDirectoryName(tempPath) ?? throw new InvalidOperationException(), - "ZipExtractor.exe"); - - File.WriteAllBytes(installerPath, Resources.ZipExtractor); - - string currentExe = Process.GetCurrentProcess().MainModule?.FileName; - string updatedExe = _args.ExecutablePath; - string extractionPath = Path.GetDirectoryName(currentExe); - - if (string.IsNullOrWhiteSpace(updatedExe) && - !string.IsNullOrWhiteSpace(AutoUpdater.ExecutablePath)) - { - updatedExe = AutoUpdater.ExecutablePath; - } - - if (!string.IsNullOrWhiteSpace(AutoUpdater.InstallationPath) && - Directory.Exists(AutoUpdater.InstallationPath)) - { - extractionPath = AutoUpdater.InstallationPath; - } - - processStartInfo = new ProcessStartInfo - { - FileName = installerPath, - UseShellExecute = true - }; - - processStartInfo.ArgumentList.Add("--input"); - processStartInfo.ArgumentList.Add(tempPath); - processStartInfo.ArgumentList.Add("--output"); - processStartInfo.ArgumentList.Add(extractionPath); - processStartInfo.ArgumentList.Add("--current-exe"); - processStartInfo.ArgumentList.Add(currentExe); - - if (!string.IsNullOrWhiteSpace(updatedExe)) - { - processStartInfo.ArgumentList.Add("--updated-exe"); - processStartInfo.ArgumentList.Add(updatedExe); - } - - if (AutoUpdater.ClearAppDirectory) - { - processStartInfo.ArgumentList.Add("--clear"); - } - - string[] args = Environment.GetCommandLineArgs(); - if (args.Length > 0) - { - var arguments = string.Join(" ", args.Skip(1).Select(arg => $"\"{arg}\"")); - processStartInfo.ArgumentList.Add("--args"); - processStartInfo.ArgumentList.Add(arguments); - - } + processStartInfo.ArgumentList.Add("--updated-exe"); + processStartInfo.ArgumentList.Add(updatedExe); } - else if (extension.Equals(".msi", StringComparison.OrdinalIgnoreCase)) + + if (AutoUpdater.ClearAppDirectory) { - processStartInfo = new ProcessStartInfo - { - FileName = "msiexec" - }; - processStartInfo.ArgumentList.Add($"/i"); - processStartInfo.ArgumentList.Add(tempPath); - if (!string.IsNullOrEmpty(installerArgs)) - { - processStartInfo.ArgumentList.Add(installerArgs); - } + processStartInfo.ArgumentList.Add("--clear"); } - if (AutoUpdater.RunUpdateAsAdmin) + string[] args = Environment.GetCommandLineArgs(); + if (args.Length > 0) { - processStartInfo.Verb = "runas"; + string arguments = string.Join(" ", args.Skip(1).Select(arg => $"\"{arg}\"")); + processStartInfo.ArgumentList.Add("--args"); + processStartInfo.ArgumentList.Add(arguments); } - - try +#endif + } + else if (extension.Equals(".msi", StringComparison.OrdinalIgnoreCase)) + { + processStartInfo = new ProcessStartInfo { - Process.Start(processStartInfo); + FileName = "msiexec" + }; +#if NETFRAMEWORK + processStartInfo.Arguments = $"/i \"{tempPath}\""; + if (!string.IsNullOrEmpty(installerArgs)) + { + processStartInfo.Arguments += $" {installerArgs}"; } - catch (Win32Exception exception) +#else + processStartInfo.ArgumentList.Add("/i"); + processStartInfo.ArgumentList.Add(tempPath); + if (!string.IsNullOrEmpty(installerArgs)) { - if (exception.NativeErrorCode == 1223) - { - _webClient = null; - } - else - { - throw; - } + processStartInfo.ArgumentList.Add(installerArgs); } +#endif } - catch (Exception e) + + if (AutoUpdater.RunUpdateAsAdmin) { - MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); - _webClient = null; + processStartInfo.Verb = "runas"; } - finally + + try { - DialogResult = _webClient == null ? DialogResult.Cancel : DialogResult.OK; - FormClosing -= DownloadUpdateDialog_FormClosing; - Close(); + Process.Start(processStartInfo); } + catch (Win32Exception exception) + { + if (exception.NativeErrorCode == 1223) + { + _webClient = null; + } + else + { + throw; + } + } + } + catch (Exception e) + { + MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); + _webClient = null; + } + finally + { + DialogResult = _webClient == null ? DialogResult.Cancel : DialogResult.OK; + FormClosing -= DownloadUpdateDialog_FormClosing; + Close(); } + } - private static string BytesToString(long byteCount) + private static string BytesToString(long byteCount) + { + string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; + if (byteCount == 0) { - string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; - if (byteCount == 0) - return "0" + suf[0]; - long bytes = Math.Abs(byteCount); - int place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024))); - double num = Math.Round(bytes / Math.Pow(1024, place), 1); - return $"{(Math.Sign(byteCount) * num).ToString(CultureInfo.InvariantCulture)} {suf[place]}"; + return "0" + suf[0]; } - private static void CompareChecksum(string fileName, CheckSum checksum) + long bytes = Math.Abs(byteCount); + var place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024))); + double num = Math.Round(bytes / Math.Pow(1024, place), 1); + return $"{(Math.Sign(byteCount) * num).ToString(CultureInfo.InvariantCulture)} {suf[place]}"; + } + + private static void CompareChecksum(string fileName, CheckSum checksum) + { + using var hashAlgorithm = + HashAlgorithm.Create( + string.IsNullOrEmpty(checksum.HashingAlgorithm) ? "MD5" : checksum.HashingAlgorithm); + using FileStream stream = File.OpenRead(fileName); + + if (hashAlgorithm == null) { - using var hashAlgorithm = - HashAlgorithm.Create( - string.IsNullOrEmpty(checksum.HashingAlgorithm) ? "MD5" : checksum.HashingAlgorithm); - using var stream = File.OpenRead(fileName); + throw new Exception(Resources.HashAlgorithmNotSupportedMessage); + } - if (hashAlgorithm == null) throw new Exception(Resources.HashAlgorithmNotSupportedMessage); + byte[] hash = hashAlgorithm.ComputeHash(stream); + string fileChecksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); - var hash = hashAlgorithm.ComputeHash(stream); - var fileChecksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); + if (fileChecksum == checksum.Value.ToLower()) + { + return; + } - if (fileChecksum == checksum.Value.ToLower()) return; + throw new Exception(Resources.FileIntegrityCheckFailedMessage); + } - throw new Exception(Resources.FileIntegrityCheckFailedMessage); + private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArgs e) + { + if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) + { + AutoUpdater.Exit(); + return; } - private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArgs e) + if (_webClient is not { IsBusy: true }) { - if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) - { - AutoUpdater.Exit(); - return; - } - if (_webClient is { IsBusy: true }) - { - _webClient.CancelAsync(); - DialogResult = DialogResult.Cancel; - } + return; } + + _webClient.CancelAsync(); + DialogResult = DialogResult.Cancel; } -} +} \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs.resx b/AutoUpdater.NET/DownloadUpdateDialog.cs.resx index 6909b795..c630eb65 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs.resx @@ -1,129 +1,135 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 132, 15 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + 132, 15 + + Stahuji aktualizaci... - + Aktualizace programu \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.da.resx b/AutoUpdater.NET/DownloadUpdateDialog.da.resx index deddc73b..69b5dcee 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.da.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.da.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Software opdatering - + Downloader opdateringer... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.de.resx b/AutoUpdater.NET/DownloadUpdateDialog.de.resx index 62819d26..a1806a59 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.de.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.de.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Software-Aktualisierung - + Update wird heruntergeladen... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.es.resx b/AutoUpdater.NET/DownloadUpdateDialog.es.resx index 0325f201..bc3e02f2 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.es.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.es.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Descargar Update... - + actualización de software \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.fr.resx b/AutoUpdater.NET/DownloadUpdateDialog.fr.resx index 3256abd0..a9d30ca7 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.fr.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.fr.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Téléchargement de mise à jour... - + Mise à jour logicielle \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.it.resx b/AutoUpdater.NET/DownloadUpdateDialog.it.resx index f43caf7c..e0f1f589 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.it.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.it.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Aggiornamento software - + Download dell'aggiornamento in corso... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.ja-JP.resx b/AutoUpdater.NET/DownloadUpdateDialog.ja-JP.resx index 3e605447..8563316e 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.ja-JP.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.ja-JP.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + ソフトウェア アップデート - + アップデートをダウンロード中です。 \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.ko.resx b/AutoUpdater.NET/DownloadUpdateDialog.ko.resx index 0a58b526..987ac345 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.ko.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.ko.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 소프트웨어 업데이트 - + 업데이트 다운로드 중... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.lv.resx b/AutoUpdater.NET/DownloadUpdateDialog.lv.resx index b91587ae..9fe86dc3 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.lv.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.lv.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Programmatūras atjauninājums - + Lejupielādē atjauninājumu... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.nl.resx b/AutoUpdater.NET/DownloadUpdateDialog.nl.resx index f34c7f43..8921fc88 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.nl.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.nl.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Het downloaden van update... - + Software Update \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.pl.resx b/AutoUpdater.NET/DownloadUpdateDialog.pl.resx index 513f1191..2c61f22c 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.pl.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.pl.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Pobieranie aktualizacji... - + Aktualizacja oprogramowania \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx b/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx index 55a683b1..2fd76fef 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.pt-BR.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Atualização de software - + Baixando a atualização... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.pt.resx b/AutoUpdater.NET/DownloadUpdateDialog.pt.resx index 9366b5c2..71806728 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.pt.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.pt.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Atualização de software - + A transferir a atualização... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.resx b/AutoUpdater.NET/DownloadUpdateDialog.resx index 0efed1e4..bb6b9abc 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.resx @@ -1,799 +1,809 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 14, 14 - - - - 4, 4, 4, 4 - - - 59, 62 - - - CenterImage - - - - 0 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + 14, 14 + + + + 4, 4, 4, 4 + + + 59, 62 + + + CenterImage + + + + 0 + + pictureBoxIcon - + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 3 - - 81, 45 - - - 4, 4, 4, 4 - - - 319, 26 - - - 1 - - + + 81, 45 + + + 4, 4, 4, 4 + + + 319, 26 + + + 1 + + progressBar - + System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 2 - - - True - - - Segoe UI, 9pt - - - 78, 14 - - - 4, 0, 4, 0 - - - 128, 15 - - + 2 - + + True + + + Segoe UI, 9pt + + + 78, 14 + + + 4, 0, 4, 0 + + + 128, 15 + + + 2 + + Downloading Update... - + labelInformation - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 1 - - Left, Right - - - 265, 14 - - - 135, 15 - - - 3 - - - MiddleRight - - + + Left, Right + + + 265, 14 + + + 135, 15 + + + 3 + + + MiddleRight + + labelSize - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 0 - - True - - - 7, 15 - - - 413, 90 - - - Segoe UI, 9pt - - - - AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA - IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// - /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af// - /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA/// - /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA - AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT - u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5 - 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N - 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R - 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz - +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6//// - //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un - +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h - +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv - +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf - z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA - //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA - AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA - AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA - AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA - ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA - ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA - AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj - 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA - AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA - ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA - ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA - AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA - AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA - AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO - 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af// - /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL - 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR - +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af// - /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW - +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ - +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ - +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc - zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su - +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK - 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ - +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU - +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af// - /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8//// - ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af// - /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY - +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af// - /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus - +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q - +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt - 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7 - 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN - 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW - 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu - +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW - +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv - 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf// - /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb - zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb - zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA - AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA - AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA - ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA - AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA - ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA - AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA - ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA - ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1 - dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t - 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA - AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi - 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA - AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA - AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA - ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA - ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf - ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA - ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT - 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA - ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af// - /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA - ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM - 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA - AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA - AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK - 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw - bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA - AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT - 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK - 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S - +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB - 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j - +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI - 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS - 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO - 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss - +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9 - /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92 - 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C - /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb - zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc - +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR - 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue - +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO - 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd - +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2 - /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi - 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v////////////// - ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H - 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs - /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E - 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS - 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL - 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn - +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ - 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i - +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY - +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax - +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+//// - ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu - 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY - +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc - zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY - ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip - +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP - 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks - +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR - +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv - 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV - 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic - +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf - +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c - 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf - +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo - 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo - +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa - zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd - zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu - +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm - +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc - zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af// - /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD/// - /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb - zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ - zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l - 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd - zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA - AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA - AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA - AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA - AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA - AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA - AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA - AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA - AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA - AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA - AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA - ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA - AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA - AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA - ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA - ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA - ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi - 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA - AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5 - eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA - AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA - AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA - AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA - ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA - ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA - AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA - ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA - AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA - AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA - AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ - 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB - 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA - AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA - ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe - z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA - ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA - ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP - JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA - AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA - AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA - AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY - +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv - 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA - AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M - 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH - 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc - zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA - ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf - +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc - zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA - AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO - 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc - zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA - AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA - AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ - +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ - 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA - AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd - zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO - 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS - 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA - AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S - +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD - 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb - yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV - +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ - 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc - zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW - +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP - 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA - AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm - +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3///////// - ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM - 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T - +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq - /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI - 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll - 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic - +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP - 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc - +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+ - //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa - +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7///////////////// - ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl - +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1 - 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0 - /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN - 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i - +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9 - +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc - z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h - +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f////////////////////////////////////////////// - ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD - 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT - 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7///////////////////////// - /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK - 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm - +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM - 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p - 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao - +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E - 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k - +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk - +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5//////////////////// - ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP - 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u - +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo - +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM - 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd - z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus - +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T - +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq - +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY - +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj - +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f////////////// - /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc - zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn - +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ - 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO - 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq - 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep - +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U - +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt - 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+ - +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V - +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe - 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5 - 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ - 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj - +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO - 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i - +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig - +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov - 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY - +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd - 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye - +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my - 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E - +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb - zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic - +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC - +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd - z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc - zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV - +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV - qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb - zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA - vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf - 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC - +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc - zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb - zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x - 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - - - - 4, 2, 4, 2 - - - CenterParent - - + + True + + + 7, 15 + + + 413, 90 + + + Segoe UI, 9pt + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af// + /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA/// + /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA + AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT + u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5 + 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N + 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R + 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz + +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6//// + //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un + +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h + +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv + +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf + z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA + AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA + ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA + ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA + AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj + 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA + AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA + ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA + ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA + AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA + AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA + AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO + 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af// + /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL + 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR + +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af// + /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW + +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ + +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ + +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc + zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su + +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK + 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ + +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU + +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af// + /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8//// + ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af// + /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY + +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af// + /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus + +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q + +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt + 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7 + 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN + 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW + 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu + +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW + +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv + 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf// + /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb + zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb + zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA + AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA + ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA + AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA + ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA + AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA + ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA + ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1 + dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t + 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA + AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi + 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA + AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA + AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA + ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA + ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf + ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA + ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT + 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA + ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA + ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM + 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA + AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK + 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw + bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA + AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT + 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK + 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S + +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB + 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j + +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI + 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS + 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO + 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss + +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9 + /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92 + 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C + /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb + zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc + +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR + 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue + +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO + 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd + +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2 + /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi + 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v////////////// + ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H + 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs + /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E + 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS + 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL + 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn + +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ + 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i + +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY + +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax + +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+//// + ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu + 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY + +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc + zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY + ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip + +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP + 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks + +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR + +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv + 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV + 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic + +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf + +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c + 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf + +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo + 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo + +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa + zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd + zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu + +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm + +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc + zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af// + /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD/// + /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb + zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ + zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l + 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd + zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA + AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA + AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA + AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA + AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA + AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA + AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA + AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA + AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA + ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA + AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA + ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA + ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA + ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi + 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA + AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5 + eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA + AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA + AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA + AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA + ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA + ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA + AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA + ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA + AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA + AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ + 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB + 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA + AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA + ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe + z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA + ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA + ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP + JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA + AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA + AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY + +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv + 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA + AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M + 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH + 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc + zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA + ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf + +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc + zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA + AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO + 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc + zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ + +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ + 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA + AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd + zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO + 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS + 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA + AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S + +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD + 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb + yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV + +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ + 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc + zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW + +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP + 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm + +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3///////// + ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM + 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T + +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq + /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI + 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll + 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic + +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP + 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc + +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+ + //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa + +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7///////////////// + ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl + +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1 + 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0 + /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN + 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i + +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9 + +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc + z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h + +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f////////////////////////////////////////////// + ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD + 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT + 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7///////////////////////// + /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK + 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm + +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM + 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p + 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao + +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E + 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k + +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk + +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5//////////////////// + ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP + 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u + +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo + +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM + 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd + z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus + +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T + +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq + +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY + +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj + +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f////////////// + /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc + zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn + +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ + 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO + 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq + 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep + +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U + +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt + 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+ + +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V + +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe + 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5 + 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ + 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj + +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO + 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i + +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig + +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov + 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY + +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd + 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye + +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my + 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E + +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb + zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic + +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC + +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd + z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc + zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV + +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV + qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb + zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA + vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf + 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC + +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc + zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb + zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x + 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + + 4, 2, 4, 2 + + + CenterParent + + Software Update - + DownloadUpdateDialog - + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.ru.resx b/AutoUpdater.NET/DownloadUpdateDialog.ru.resx index fe0740f5..16a5831d 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.ru.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.ru.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Обновление программы - + Загружается обновление... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.sk.resx b/AutoUpdater.NET/DownloadUpdateDialog.sk.resx index 4b716566..4497884c 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.sk.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.sk.resx @@ -1,129 +1,135 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 132, 15 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + 132, 15 + + Sťahujem aktualizáciu... - + Aktualizácia programu \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.sv.resx b/AutoUpdater.NET/DownloadUpdateDialog.sv.resx index 4f754afa..93f19c31 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.sv.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.sv.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Laddar ner uppdatering... - + Programuppdatering \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.th.resx b/AutoUpdater.NET/DownloadUpdateDialog.th.resx index 228be352..3856647b 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.th.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.th.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + อัปเดตซอฟต์แวร์ - + กำลังดาวน์โหลดอัปเดต... \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.tr.resx b/AutoUpdater.NET/DownloadUpdateDialog.tr.resx index 8f0ec98f..81959121 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.tr.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.tr.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Yazılım Güncelleme - + Güncelleme İndiriliyor.. \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.zh-TW.resx b/AutoUpdater.NET/DownloadUpdateDialog.zh-TW.resx index a620a766..96f50936 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.zh-TW.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.zh-TW.resx @@ -1,126 +1,132 @@ - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 軟體更新 - + 下載中... diff --git a/AutoUpdater.NET/DownloadUpdateDialog.zh.resx b/AutoUpdater.NET/DownloadUpdateDialog.zh.resx index 44f17902..2704a406 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.zh.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.zh.resx @@ -1,126 +1,132 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 正在下载更新... - + 软件更新 \ No newline at end of file diff --git a/AutoUpdater.NET/IAuthentication.cs b/AutoUpdater.NET/IAuthentication.cs index 68dd58ab..9ee2b641 100644 --- a/AutoUpdater.NET/IAuthentication.cs +++ b/AutoUpdater.NET/IAuthentication.cs @@ -1,15 +1,13 @@ -namespace AutoUpdaterDotNET -{ +namespace AutoUpdaterDotNET; +/// +/// Interface for authentication +/// +public interface IAuthentication +{ /// - /// Interface for authentication + /// Apply the authentication to webclient. /// - public interface IAuthentication - { - /// - /// Apply the authentication to webclient. - /// - /// WebClient for which you want to use this authentication method. - void Apply(ref MyWebClient webClient); - } -} + /// WebClient for which you want to use this authentication method. + void Apply(ref MyWebClient webClient); +} \ No newline at end of file diff --git a/AutoUpdater.NET/IPersistenceProvider.cs b/AutoUpdater.NET/IPersistenceProvider.cs index eea04cf9..4c5c599c 100644 --- a/AutoUpdater.NET/IPersistenceProvider.cs +++ b/AutoUpdater.NET/IPersistenceProvider.cs @@ -1,34 +1,43 @@ using System; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Provides a mechanism for storing AutoUpdater state between sessions. +/// +public interface IPersistenceProvider { /// - /// Provides a mechanism for storing AutoUpdater state between sessions. + /// Reads the flag indicating whether a specific version should be skipped or not. /// - public interface IPersistenceProvider - { - /// - /// Reads the flag indicating whether a specific version should be skipped or not. - /// - /// Returns a version to skip. If skip value is false or not present then it will return null. - Version GetSkippedVersion(); + /// Returns a version to skip. If skip value is false or not present then it will return null. + Version GetSkippedVersion(); - /// - /// Reads the value containing the date and time at which the user must be given again the possibility to upgrade the application. - /// - /// Returns a DateTime value at which the user must be given again the possibility to upgrade the application. If remind later value is not present then it will return null. - DateTime? GetRemindLater(); + /// + /// Reads the value containing the date and time at which the user must be given again the possibility to upgrade the + /// application. + /// + /// + /// Returns a DateTime value at which the user must be given again the possibility to upgrade the application. If + /// remind later value is not present then it will return null. + /// + DateTime? GetRemindLater(); - /// - /// Sets the values indicating the specific version that must be ignored by AutoUpdater. - /// - /// Version code for the specific version that must be ignored. Set it to null if you don't want to skip any version. - void SetSkippedVersion(Version version); + /// + /// Sets the values indicating the specific version that must be ignored by AutoUpdater. + /// + /// + /// Version code for the specific version that must be ignored. Set it to null if you don't want to + /// skip any version. + /// + void SetSkippedVersion(Version version); - /// - /// Sets the date and time at which the user must be given again the possibility to upgrade the application. - /// - /// Date and time at which the user must be given again the possibility to upgrade the application. - void SetRemindLater(DateTime? remindLaterAt); - } + /// + /// Sets the date and time at which the user must be given again the possibility to upgrade the application. + /// + /// + /// Date and time at which the user must be given again the possibility to upgrade the + /// application. + /// + void SetRemindLater(DateTime? remindLaterAt); } \ No newline at end of file diff --git a/AutoUpdater.NET/JsonFilePersistenceProvider.cs b/AutoUpdater.NET/JsonFilePersistenceProvider.cs index d10307f7..03fda34b 100644 --- a/AutoUpdater.NET/JsonFilePersistenceProvider.cs +++ b/AutoUpdater.NET/JsonFilePersistenceProvider.cs @@ -4,120 +4,116 @@ using System.Runtime.Serialization.Json; using System.Text; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Provides a mechanism for storing AutoUpdater state between sessions on a Json formatted file. +/// +public class JsonFilePersistenceProvider : IPersistenceProvider { /// - /// Provides a mechanism for storing AutoUpdater state between sessions on a Json formatted file. + /// Initializes a new instance of the JsonFilePersistenceProvider class. /// - public class JsonFilePersistenceProvider : IPersistenceProvider + /// The path for the Json formatted file must be specified using the FileName property. + public JsonFilePersistenceProvider(string jsonPath) { - /// - /// Path for the Json formatted file. - /// - private string FileName { get; set; } - - /// - /// - /// - private PersistedValues PersistedValues { get; set; } - - /// - /// Initializes a new instance of the JsonFilePersistenceProvider class. - /// - /// The path for the Json formatted file must be specified using the FileName property. - public JsonFilePersistenceProvider(string jsonPath) - { - FileName = jsonPath; - ReadFile(); - } + FileName = jsonPath; + ReadFile(); + } - /// - /// Stores applied modifications into the Json formatted file specified in the FileName property. - /// - private void Save() - { - string json; + /// + /// Path for the Json formatted file. + /// + private string FileName { get; } - using (MemoryStream stream = new MemoryStream()) - { - DataContractJsonSerializer serializer = new DataContractJsonSerializer(PersistedValues.GetType()); - serializer.WriteObject(stream, PersistedValues); - - using (StreamReader reader = new StreamReader(stream)) - { - stream.Seek(0, SeekOrigin.Begin); - json = reader.ReadToEnd(); - } - } + /// + /// + private PersistedValues PersistedValues { get; set; } - File.WriteAllText(FileName, json); - } + /// + public Version GetSkippedVersion() + { + return PersistedValues.SkippedVersion; + } + + /// + public DateTime? GetRemindLater() + { + return PersistedValues.RemindLaterAt; + } + + /// + public void SetSkippedVersion(Version version) + { + PersistedValues.SkippedVersion = version; + Save(); + } + + /// + public void SetRemindLater(DateTime? remindLaterAt) + { + PersistedValues.RemindLaterAt = remindLaterAt; + Save(); + } + + /// + /// Stores applied modifications into the Json formatted file specified in the FileName property. + /// + private void Save() + { + string json; - /// - /// Reads a Json formatted file and returns an initialized instance of the class PersistedValues. - /// - /// The function creates a new instance, initialized with default parameters, in case the file does not exist. - private void ReadFile() + using (var stream = new MemoryStream()) { - PersistedValues jsonFile = null; + var serializer = new DataContractJsonSerializer(PersistedValues.GetType()); + serializer.WriteObject(stream, PersistedValues); - if (File.Exists(FileName)) + using (var reader = new StreamReader(stream)) { - using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(File.ReadAllText(FileName)))) - { - DataContractJsonSerializer serializer = - new DataContractJsonSerializer(typeof(PersistedValues)); - jsonFile = (PersistedValues) serializer.ReadObject(stream); - } + stream.Seek(0, SeekOrigin.Begin); + json = reader.ReadToEnd(); } - - PersistedValues = jsonFile ?? new PersistedValues(); } - /// - public Version GetSkippedVersion() - { - return PersistedValues.SkippedVersion; - } + File.WriteAllText(FileName, json); + } - /// - public DateTime? GetRemindLater() - { - return PersistedValues.RemindLaterAt; - } + /// + /// Reads a Json formatted file and returns an initialized instance of the class PersistedValues. + /// + /// The function creates a new instance, initialized with default parameters, in case the file does not exist. + private void ReadFile() + { + PersistedValues jsonFile = null; - /// - public void SetSkippedVersion(Version version) + if (File.Exists(FileName)) { - PersistedValues.SkippedVersion = version; - Save(); + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(File.ReadAllText(FileName))); + var serializer = + new DataContractJsonSerializer(typeof(PersistedValues)); + jsonFile = (PersistedValues)serializer.ReadObject(stream); } - /// - public void SetRemindLater(DateTime? remindLaterAt) - { - PersistedValues.RemindLaterAt = remindLaterAt; - Save(); - } + PersistedValues = jsonFile ?? new PersistedValues(); } +} +/// +/// Provides way to serialize and deserialize AutoUpdater persisted values. +/// +[DataContract] +public class PersistedValues +{ /// - /// Provides way to serialize and deserialize AutoUpdater persisted values. + /// Application version to be skipped. /// - [DataContract] - public class PersistedValues - { - /// - /// Application version to be skipped. - /// - /// The SetSkippedVersion function sets this property and calls the Save() method for making changes permanent. - [DataMember] - public Version SkippedVersion { get; set; } - - /// - /// Date and time at which the user must be given again the possibility to upgrade the application. - /// - [DataMember] - public DateTime? RemindLaterAt { get; set; } - } + /// The SetSkippedVersion function sets this property and calls the Save() method for making changes permanent. + [DataMember] + public Version SkippedVersion { get; set; } + + /// + /// Date and time at which the user must be given again the possibility to upgrade the application. + /// + [DataMember] + public DateTime? RemindLaterAt { get; set; } } \ No newline at end of file diff --git a/AutoUpdater.NET/MyWebClient.cs b/AutoUpdater.NET/MyWebClient.cs index 1e2d335c..967d6a4e 100644 --- a/AutoUpdater.NET/MyWebClient.cs +++ b/AutoUpdater.NET/MyWebClient.cs @@ -1,22 +1,21 @@ using System; using System.Net; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +public class MyWebClient : WebClient { + /// + /// Response Uri after any redirects. + /// + public Uri ResponseUri; + /// - public class MyWebClient : WebClient + protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) { - /// - /// Response Uri after any redirects. - /// - public Uri ResponseUri; - - /// - protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) - { - WebResponse webResponse = base.GetWebResponse(request, result); - ResponseUri = webResponse.ResponseUri; - return webResponse; - } + WebResponse webResponse = base.GetWebResponse(request, result); + ResponseUri = webResponse.ResponseUri; + return webResponse; } -} +} \ No newline at end of file diff --git a/AutoUpdater.NET/NetworkAuthentication.cs b/AutoUpdater.NET/NetworkAuthentication.cs index 9a731e7c..8e7fc7ce 100644 --- a/AutoUpdater.NET/NetworkAuthentication.cs +++ b/AutoUpdater.NET/NetworkAuthentication.cs @@ -1,32 +1,30 @@ -using System; -using System.Net; +using System.Net; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Provides credentials for Network Authentication. +/// +public class NetworkAuthentication : IAuthentication { /// - /// Provides credentials for Network Authentication. + /// Initializes credentials for Network Authentication. /// - public class NetworkAuthentication : IAuthentication + /// Username to use for Network Authentication + /// Password to use for Network Authentication + public NetworkAuthentication(string username, string password) { - private string Username { get; } + Username = username; + Password = password; + } - private string Password { get; } + private string Username { get; } - /// - /// Initializes credentials for Network Authentication. - /// - /// Username to use for Network Authentication - /// Password to use for Network Authentication - public NetworkAuthentication(string username, string password) - { - Username = username; - Password = password; - } + private string Password { get; } - /// - public void Apply(ref MyWebClient webClient) - { - webClient.Credentials = new NetworkCredential(Username, Password); - } + /// + public void Apply(ref MyWebClient webClient) + { + webClient.Credentials = new NetworkCredential(Username, Password); } -} +} \ No newline at end of file diff --git a/AutoUpdater.NET/ParseUpdateInfoEventArgs.cs b/AutoUpdater.NET/ParseUpdateInfoEventArgs.cs index 0a67ad4b..b3a11b3c 100644 --- a/AutoUpdater.NET/ParseUpdateInfoEventArgs.cs +++ b/AutoUpdater.NET/ParseUpdateInfoEventArgs.cs @@ -1,29 +1,28 @@ using System; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// An object of this class contains the AppCast file received from server. +/// +public class ParseUpdateInfoEventArgs : EventArgs { /// - /// An object of this class contains the AppCast file received from server. + /// An object containing the AppCast file received from server. /// - public class ParseUpdateInfoEventArgs : EventArgs + /// A string containing remote data received from the AppCast file. + public ParseUpdateInfoEventArgs(string remoteData) { - /// - /// Remote data received from the AppCast file. - /// - public string RemoteData { get; } + RemoteData = remoteData; + } - /// - /// Set this object with values received from the AppCast file. - /// - public UpdateInfoEventArgs UpdateInfo { get; set; } + /// + /// Remote data received from the AppCast file. + /// + public string RemoteData { get; } - /// - /// An object containing the AppCast file received from server. - /// - /// A string containing remote data received from the AppCast file. - public ParseUpdateInfoEventArgs(string remoteData) - { - RemoteData = remoteData; - } - } + /// + /// Set this object with values received from the AppCast file. + /// + public UpdateInfoEventArgs UpdateInfo { get; set; } } \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ar.resx b/AutoUpdater.NET/Properties/Resources.ar.resx index 37e67eb9..7c54532c 100644 --- a/AutoUpdater.NET/Properties/Resources.ar.resx +++ b/AutoUpdater.NET/Properties/Resources.ar.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + جارٍ تنزيله على {0}/ثانية - + المجموع الاختباري (Checksum) مختلف - + فشل التحقق من سلامة الملفات وظهرت بعض الأخطاء. - + خوارزمية التجزئة (Hash) غير مدعومة - + خوارزمية التجزئة المقدمة في ملف XML غير مدعومة. - + فشل التحقق من التحديث - + هناك مشكلة في الوصول إلى سيرفر التحديث. يرجى التحقق من اتصال الإنترنت الخاص بك وحاول مرة أخرى في وقت لاحق. - + التحديث غير متاح - + لا يوجد تحديث متاح. الرجاء معاودة المحاولة في وقت لاحق. - + تعذر تحديد اسم ملف التحديث! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.cs.resx b/AutoUpdater.NET/Properties/Resources.cs.resx index 2fd65c15..cfea4066 100644 --- a/AutoUpdater.NET/Properties/Resources.cs.resx +++ b/AutoUpdater.NET/Properties/Resources.cs.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Aktualizace není k dospozici. Kontrolu zopakujte, prosím, později. - + Aktualizace není k dispozici. - + Nastala chyba při připojení k aktualizačnímu serveru. Zkontrolujte internetové připojení a zkuste aktualizovat později. - + Kontrola aktualizace se nezdařila. - + Odlišné kontrolní číslo - + Neúspěšná kontrola integrity, byly hlášené chyby. - + Nepodporovaný hashovací algoritmus - + Hashovací algoritmus uvedený v XML není podporovaný. - + Stahování na {0}/s - + Nelze určit název souboru aktualizace! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.da.resx b/AutoUpdater.NET/Properties/Resources.da.resx index 7cafdb4e..991c5c1f 100644 --- a/AutoUpdater.NET/Properties/Resources.da.resx +++ b/AutoUpdater.NET/Properties/Resources.da.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Der er ingen opdatering tilgængelig. Prøv igen senere. - + Opdatering Utilgængelig - + Der er et problem at nå opdateringsserver. Kontroller din internetforbindelse og prøv igen senere. - + Opdateringstjek mislykkedes - + Kontrolsummet afviger - + Filintegritetskontrol mislykkedes og rapporterede nogle fejl. - + Ikke understøttet Hash-algoritme - + Hash-algoritmen i XML-filen understøttes ikke. - + Downloader ved {0}/s - + Kan ikke bestemme filnavnet på opdateringsfilen! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.de.resx b/AutoUpdater.NET/Properties/Resources.de.resx index c6542d47..9e716340 100644 --- a/AutoUpdater.NET/Properties/Resources.de.resx +++ b/AutoUpdater.NET/Properties/Resources.de.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Es ist kein Update vorhanden. Bitte versuchen Sie es später noch einmal. - + Update nicht verfügbar - + Es gibt ein Problem beim Erreichen des Aktualisierungsservers. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es später noch einmal. - + Update Check fehlgeschlagen - + Checksumme ist unterschiedlich - + Die Dateiintegritätsprüfung ist fehlgeschlagen und hat einige Fehler gemeldet. - + Nicht unterstützter Hash-Algorithmus - + Der in der XML-Datei enthaltene Hash-Algorithmus wird nicht unterstützt. - + Herunterladen bei {0}/s - + Der Dateiname der Update-Datei kann nicht ermittelt werden! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.es.resx b/AutoUpdater.NET/Properties/Resources.es.resx index 19f54519..816c71fb 100644 --- a/AutoUpdater.NET/Properties/Resources.es.resx +++ b/AutoUpdater.NET/Properties/Resources.es.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + No hay actualización disponible. Por favor, inténtelo de nuevo más tarde. - + Actualización no disponible - + Hay un problema al llegar al servidor de actualización. Comprueba tu conexión a Internet y vuelve a intentarlo más tarde. - + Error en la comprobación de la actualización - + La suma de comprobación difiere - + La comprobación de la integridad de los archivos falló y reportó algunos errores. - + Algoritmo Hash no soportado - + El algoritmo Hash proporcionado en el archivo XML no es compatible. - + Descargando a {0}/s - + ¡No se puede determinar el nombre de archivo del archivo de actualización! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.fr.resx b/AutoUpdater.NET/Properties/Resources.fr.resx index edbfd0b0..b2f3c382 100644 --- a/AutoUpdater.NET/Properties/Resources.fr.resx +++ b/AutoUpdater.NET/Properties/Resources.fr.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Il n'y a pas de mise à jour disponible. Veuillez réessayer plus tard. - + Mise à jour indisponible - + Il y a un problème concernant le serveur de mise à jour. Vérifiez votre connexion Internet et essayez à nouveau plus tard. - + Vérification de mise à jour échoué - + Somme de contrôle différente - + La vérification de l'intégrité du fichier a échoué et a rapporté quelques erreurs. - + Algorithme de hachage non supporté - + L'algorithme de hachage fourni dans le fichier XML n'est pas supporté. - + Téléchargement à {0}/s - + Impossible de déterminer le nom de fichier du fichier de mise à jour ! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.it.resx b/AutoUpdater.NET/Properties/Resources.it.resx index 3de31178..ffb192ea 100644 --- a/AutoUpdater.NET/Properties/Resources.it.resx +++ b/AutoUpdater.NET/Properties/Resources.it.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Non è disponibile alcun aggiornamento. Per favore riprova più tardi. - + Aggiornamento non disponibile - + Si è verificato un problema nel contattare il server degli aggiornamenti. Controlla la tua connessione a Internet o riprova più tardi. - + Controllo degli aggiornamenti non riuscito - + Checksum differente - + La verifica dell' integrità dei file non è riuscita e ha segnalato alcuni errori. - + Algoritmo Hash non supportato - + L' algoritmo Hash fornito nel file XML non è supportato. - + Download in {0}/s - + Impossibile determinare il nome file del file di aggiornamento! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ja-JP.resx b/AutoUpdater.NET/Properties/Resources.ja-JP.resx index f31cf297..c9e6df1c 100644 --- a/AutoUpdater.NET/Properties/Resources.ja-JP.resx +++ b/AutoUpdater.NET/Properties/Resources.ja-JP.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + チェックサムは異なります - + ファイルの整合性チェックに失敗し、いくつかのエラーが報告されました。 - + サポートされていないハッシュアルゴリズム - + XMLファイルで提供されるハッシュアルゴリズムはサポートされていません。 - + アップデートの確認に失敗しました。 - + アップデートサーバーへの接続に失敗しました。インターネットの接続を確認し、再度、試してください。 - + アップデートを利用できません。 - + 利用できるアップデートがありません。後日、試してください。 - + {0}/秒でダウンロード中 - + 更新ファイルのファイル名を特定できません! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ko.resx b/AutoUpdater.NET/Properties/Resources.ko.resx index b316b2f8..b465fe30 100644 --- a/AutoUpdater.NET/Properties/Resources.ko.resx +++ b/AutoUpdater.NET/Properties/Resources.ko.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 사용 가능한 업데이트가 없습니다. 나중에 다시 시도 해주십시오. - + 업데이트를 사용할 수 없음 - + 업데이트 서버에 연결하는 중 문제가 발생했습니다. 인터넷 연결을 확인하고 나중에 다시 시도하십시오. - + 업데이트 확인 실패 - + 체크섬은 다릅니다. - + 파일 무결성 검사가 실패하고 몇 가지 오류가보고되었습니다. - + 지원되지 않는 해시 알고리즘 - + XML 파일에 제공된 해시 알고리즘은 지원되지 않습니다. - + {0}/s에서 다운로드 중 - + 업데이트 파일의 파일 이름을 확인할 수 없습니다! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.lv.resx b/AutoUpdater.NET/Properties/Resources.lv.resx index a7f328b5..f114f530 100644 --- a/AutoUpdater.NET/Properties/Resources.lv.resx +++ b/AutoUpdater.NET/Properties/Resources.lv.resx @@ -1,6 +1,6 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Nav pieejamu atjauninājumi! Lūdzu mēģiniet vēlāk! - + Nav pieejami atjauninājumi! - + Radās problēmas sazinoties ar atjauninājumu serveri, lūdzu pārbaudiet interneta savienojumu un mēģiniet vēlāk! - + Atjauninājumu pārbaude neizdevās - + Kontrolsumma(Checksum) atšķirās - + Failu integritātes pārbaude neizdevās un ir dažas kļūdas. - + Neatbalstīts Hash algoritms - + Norādītais Hash algoritms XML failā netiek atbalstīts. - + Lejupielādē ar ātrumu {0}/s - + Nevar noteikt atjaunināšanas faila nosaukumu! diff --git a/AutoUpdater.NET/Properties/Resources.nl.resx b/AutoUpdater.NET/Properties/Resources.nl.resx index 640b8738..dd6ee112 100644 --- a/AutoUpdater.NET/Properties/Resources.nl.resx +++ b/AutoUpdater.NET/Properties/Resources.nl.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Er is geen update beschikbaar. Probeer het later nogmaals. - + Update niet beschikbaar - + Er is een probleem bij het bereiken van de updateserver. Controleer alstublieft uw internetverbinding en probeer het later nogmaals. - + Update Check mislukt - + Controlesum verschilt - + Bestandsintegriteitscontrole mislukte en meldde enkele fouten. - + Niet-ondersteund Hashalgoritme - + Hashalgoritme in het XML-bestand wordt niet ondersteund. - + Downloaden op {0}/s - + Kan de bestandsnaam van het updatebestand niet bepalen! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.pl.resx b/AutoUpdater.NET/Properties/Resources.pl.resx index 44f76b2e..715cff96 100644 --- a/AutoUpdater.NET/Properties/Resources.pl.resx +++ b/AutoUpdater.NET/Properties/Resources.pl.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Brak dostępnych aktualizacji. Spróbuj ponownie później. - + Aktualizacja niedostępna - + Nie można nawiązać połączenia z serwerem aktualizacji. Sprawdź połączenie internetowe i spróbuj ponownie później. - + Sprawdzanie aktualizacji nieudane - + Algorytm wyznaczania wartości skrótu podany w pliku XML jest nieobsługiwany. - + Nieobsługiwany algorytm skrótu - + Weryfikacja spójności plików nie powiodła się i zwróciła błędy. - + Różne sumy kontrolne - + Szybkość pobierania: {0}/s - + Nie można określić nazwy pliku aktualizacji! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.pt-BR.resx b/AutoUpdater.NET/Properties/Resources.pt-BR.resx index feab8436..87171f0a 100644 --- a/AutoUpdater.NET/Properties/Resources.pt-BR.resx +++ b/AutoUpdater.NET/Properties/Resources.pt-BR.resx @@ -1,151 +1,158 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + Não existe nenhuma atualização disponível no momento. Por favor tente novamente mais tarde. - + Atualização indisponível - + Existe algum problema na conexão com o servidor de atualização. Por favor verifique sua conexão com a internete e tente novamente mais tarde. - + Falha ao verificar atualização - + O algoritmo de hash fornecido no arquivo XML não é compatível. - + Algoritmo de hash não suportado. - + A verificação de integridade do arquivo falhou e reportou alguns erros. - + Falha na verificação de integridade - + Baixando a {0}/s - + Não foi possível determinar o nome do arquivo de atualização! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.pt.resx b/AutoUpdater.NET/Properties/Resources.pt.resx index 507eee61..ba0e36d8 100644 --- a/AutoUpdater.NET/Properties/Resources.pt.resx +++ b/AutoUpdater.NET/Properties/Resources.pt.resx @@ -6,10 +6,14 @@ 1.3 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + Baixando em {0}/s diff --git a/AutoUpdater.NET/Properties/Resources.resx b/AutoUpdater.NET/Properties/Resources.resx index e30354f8..bc9487a3 100644 --- a/AutoUpdater.NET/Properties/Resources.resx +++ b/AutoUpdater.NET/Properties/Resources.resx @@ -1,175 +1,198 @@  - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\clock_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\hand_point.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\update.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\clock_play.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\clock_go_32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\download_32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ZipExtractor.exe;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + ..\Resources\clock_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\hand_point.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\update.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\clock_play.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\clock_go_32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\download_32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + + ..\Resources\ZipExtractor.exe;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + There is no update available. Please try again later. - + Update Unavailable - + There is a problem reaching update server. Please check your internet connection and try again later. - + Update Check Failed - + Hash algorithm provided in the XML file is not supported. - + Unsupported Hash Algorithm - + File integrity check failed and reported some errors. - + Checksum differs - + Downloading at {0}/s - + Unable to determine the filename of the update file! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.ru.resx b/AutoUpdater.NET/Properties/Resources.ru.resx index 7ec1b864..12b28aab 100644 --- a/AutoUpdater.NET/Properties/Resources.ru.resx +++ b/AutoUpdater.NET/Properties/Resources.ru.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Нет доступных обновлений. Пожалуйста, повторите попытку позже. - + Обновление недоступно - + Проблема связана с сервером обновлений. Проверьте подключение к Интернету и повторите попытку позже. - + Ошибка обновления - + Контрольная сумма отличается - + Не удалось проверить целостность файла и сообщить о некоторых ошибках. - + Неподдерживаемый алгоритм хеширования - + Хэш-алгоритм, предоставленный в XML-файле, не поддерживается. - + Загрузка на {0}/s - + Невозможно определить имя файла обновления! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.sk.resx b/AutoUpdater.NET/Properties/Resources.sk.resx index 7ece8430..f43ebe81 100644 --- a/AutoUpdater.NET/Properties/Resources.sk.resx +++ b/AutoUpdater.NET/Properties/Resources.sk.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Aktualizácia nie je k dispozícii. Kontrolu zopakujte, prosím, naskôr. - + Aktualizácia nie je k dispozícii. - + Nastala chyba pri pripojení k aktualizačnému serveru. Skontrolujte Internetové pripojenie a zopakujte aktualizáciu ešte raz, prosím. - + Kontrola aktualizácie prebehla neúspešne - + Rozdielne kontrolné číslo - + Neúspešná kontrola integrity, boli hlásené chyby. - + Nepodporovaný hashovací algoritmus - + Hashovací algoritmus uvedený v XML nie je podporovaný. - + Sťahovanie na {0}/s - + Nie je možné určiť názov súboru aktualizácie! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.sv.resx b/AutoUpdater.NET/Properties/Resources.sv.resx index 1f3255e5..08f8b6c6 100644 --- a/AutoUpdater.NET/Properties/Resources.sv.resx +++ b/AutoUpdater.NET/Properties/Resources.sv.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Det finns ingen uppdatering tillgänglig. Vänligen försök igen senare. - + Uppdatering Ej tillgänglig - + Det finns ett problem att nå uppdateringsserver. Kontrollera din internetanslutning och försök igen senare. - + Uppdateringskontroll misslyckades - + Checksum skiljer sig från - + Kontroll av filintegritet misslyckades och rapporterade några fel. - + Hash-algoritmen som inte stöds - + Hash-algoritmen som tillhandahålls i XML-filen stöds inte. - + Nedladdning vid {0}/s - + Det går inte att bestämma filnamnet på uppdateringsfilen! \ No newline at end of file diff --git a/AutoUpdater.NET/Properties/Resources.th.resx b/AutoUpdater.NET/Properties/Resources.th.resx index c20392b8..45fdb53d 100644 --- a/AutoUpdater.NET/Properties/Resources.th.resx +++ b/AutoUpdater.NET/Properties/Resources.th.resx @@ -1,151 +1,158 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + ยังไม่มีอัปเดตใหม่ในขณะนี้ กรุณาลองใหม่ภายหลัง - + ไม่มีอัปเดตใหม่ - + ไม่สามารถตรวจสอบการอัปเดตได้ กรุณาตรวจสอบการเชื่อมต่อของคุณและลองอีกครั้ง - + ตรวจาอบล้มเหลว - + ไม่รองรับรูปแบบค่าแฮชที่ระบุไว้ในไฟล์ XML - + ไม่รองรับรูปแบบค่าแฮช - + การตรวจสอบไฟล์ล้มเหลว ตรวจพบข้อผิดพลาด - + ไฟล์เสียหาย - + กำลังดาวน์โหลด ด้วยความเร็ว {0}/s - + ไม่สามารถระบุชื่อไฟล์ของไฟล์อัพเดตได้! diff --git a/AutoUpdater.NET/Properties/Resources.tr.resx b/AutoUpdater.NET/Properties/Resources.tr.resx index 56754766..822fff77 100644 --- a/AutoUpdater.NET/Properties/Resources.tr.resx +++ b/AutoUpdater.NET/Properties/Resources.tr.resx @@ -6,10 +6,14 @@ 1.3 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + {0}/sn hızında indiriliyor diff --git a/AutoUpdater.NET/Properties/Resources.zh-TW.resx b/AutoUpdater.NET/Properties/Resources.zh-TW.resx index 602afca2..970d362c 100644 --- a/AutoUpdater.NET/Properties/Resources.zh-TW.resx +++ b/AutoUpdater.NET/Properties/Resources.zh-TW.resx @@ -1,147 +1,153 @@ - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 總和檢查碼不一致 - + 檔案完整性檢查失敗並產生錯誤訊息。 - + 使用了不支持的雜湊演算法。 - + 不支援XML中提供的雜湊演算法。 - + 檢查更新失敗 - + 與更新伺服器的連線出現問題,請檢查您的網路狀態並於稍後再試。 - + 更新無法使用 - + 沒有更新,請稍後再試。 - + 以{0}/s下載 diff --git a/AutoUpdater.NET/Properties/Resources.zh.resx b/AutoUpdater.NET/Properties/Resources.zh.resx index 90f41218..97ef70a6 100644 --- a/AutoUpdater.NET/Properties/Resources.zh.resx +++ b/AutoUpdater.NET/Properties/Resources.zh.resx @@ -1,150 +1,156 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 没有更新。请稍后再试。 - + 更新不可用 - + 连接更新服务器有问题。请检查您的网络连接并稍后再试。 - + 检查更新失败 - + 校验和不同 - + 文件完整性检查失败并报告一些错误。 - + 不支持的哈希算法 - + 不支持XML文件中提供的哈希算法。 - + 以{0}/s下载 - + 无法确定更新文件的文件名! \ No newline at end of file diff --git a/AutoUpdater.NET/RegistryPersistenceProvider.cs b/AutoUpdater.NET/RegistryPersistenceProvider.cs index 4fd6eeb6..e8a878b9 100644 --- a/AutoUpdater.NET/RegistryPersistenceProvider.cs +++ b/AutoUpdater.NET/RegistryPersistenceProvider.cs @@ -2,98 +2,92 @@ using System.Globalization; using Microsoft.Win32; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Provides a mechanism for storing AutoUpdater state between sessions based on storing data on the Windows Registry. +/// +public class RegistryPersistenceProvider : IPersistenceProvider { + private const string RemindLaterValueName = "RemindLaterAt"; + + private const string SkippedVersionValueName = "SkippedVersion"; + /// - /// Provides a mechanism for storing AutoUpdater state between sessions based on storing data on the Windows Registry. + /// Initializes a new instance of the RegistryPersistenceProvider class indicating the path for the Windows registry + /// key to use for storing the data. /// - public class RegistryPersistenceProvider : IPersistenceProvider + /// + public RegistryPersistenceProvider(string registryLocation) { - /// - /// Gets/sets the path for the Windows Registry key that will contain the data. - /// - private string RegistryLocation { get; } - - private const string RemindLaterValueName = "RemindLaterAt"; - - private const string SkippedVersionValueName = "SkippedVersion"; + RegistryLocation = registryLocation; + } - /// - /// Initializes a new instance of the RegistryPersistenceProvider class indicating the path for the Windows registry key to use for storing the data. - /// - /// - public RegistryPersistenceProvider(string registryLocation) - { - RegistryLocation = registryLocation; - } + /// + /// Gets/sets the path for the Windows Registry key that will contain the data. + /// + private string RegistryLocation { get; } - /// - public Version GetSkippedVersion() + /// + public Version GetSkippedVersion() + { + try { - try - { - using (RegistryKey updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation)) - { - object skippedVersionValue = updateKey?.GetValue(SkippedVersionValueName); + using RegistryKey updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation); + object skippedVersionValue = updateKey?.GetValue(SkippedVersionValueName); - if (skippedVersionValue != null) - { - return new Version(skippedVersionValue.ToString()); - } - } - } - catch (Exception) + if (skippedVersionValue != null) { - // ignored + return new Version(skippedVersionValue.ToString()); } - - return null; + } + catch (Exception) + { + // ignored } + return null; + } - /// - public DateTime? GetRemindLater() - { - using (RegistryKey updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation)) - { - object remindLaterValue = updateKey?.GetValue(RemindLaterValueName); - if (remindLaterValue != null) - { - try - { - return Convert.ToDateTime(remindLaterValue.ToString(), - CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat); - } - catch (FormatException) - { - // ignored - } - } + /// + public DateTime? GetRemindLater() + { + using RegistryKey updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation); + object remindLaterValue = updateKey?.GetValue(RemindLaterValueName); - return null; - } + if (remindLaterValue == null) + { + return null; } - /// - public void SetSkippedVersion(Version version) + try { - using (RegistryKey autoUpdaterKey = Registry.CurrentUser.CreateSubKey(RegistryLocation)) - { - autoUpdaterKey?.SetValue(SkippedVersionValueName, version != null ? version.ToString() : string.Empty); - } + return Convert.ToDateTime(remindLaterValue.ToString(), + CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat); } - - /// - public void SetRemindLater(DateTime? remindLaterAt) + catch (FormatException) { - using (RegistryKey autoUpdaterKey = Registry.CurrentUser.CreateSubKey(RegistryLocation)) - { - autoUpdaterKey?.SetValue(RemindLaterValueName, - remindLaterAt != null - ? remindLaterAt.Value.ToString(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat) - : string.Empty); - } + // ignored } + + return null; + } + + /// + public void SetSkippedVersion(Version version) + { + using RegistryKey autoUpdaterKey = Registry.CurrentUser.CreateSubKey(RegistryLocation); + autoUpdaterKey?.SetValue(SkippedVersionValueName, version != null ? version.ToString() : string.Empty); + } + + /// + public void SetRemindLater(DateTime? remindLaterAt) + { + using RegistryKey autoUpdaterKey = Registry.CurrentUser.CreateSubKey(RegistryLocation); + autoUpdaterKey?.SetValue(RemindLaterValueName, + remindLaterAt != null + ? remindLaterAt.Value.ToString(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat) + : string.Empty); } } \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.ar.resx b/AutoUpdater.NET/RemindLaterForm.ar.resx index b0374f5e..1084cc81 100644 --- a/AutoUpdater.NET/RemindLaterForm.ar.resx +++ b/AutoUpdater.NET/RemindLaterForm.ar.resx @@ -1,167 +1,174 @@  - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Yes - - - - True - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + Yes + + + + True + + ذكرني لاحقا للتحديث - + موافق - + بعد 30 دقيقة - + بعد 12 ساعة - + بعد يوم واحد - + بعد 2 أيام - + بعد 4 أيام - + بعد 8 أيام - + بعد 10 أيام - + يجب عليك تنزيل التحديثات الآن. يستغرق ذلك بضع دقائق فقط حسب اتصال الإنترنت الخاص بك ويضمن حصولك على أحدث إصدار من التطبيق. - + هل تريد تنزيل التحديثات لاحقًا؟ - + لا ، قم بتنزيل التحديثات الآن (موصى به) - + نعم ، أرجو أن تذكرني فيما بعد: \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.cs b/AutoUpdater.NET/RemindLaterForm.cs index 4995f740..49f598a8 100644 --- a/AutoUpdater.NET/RemindLaterForm.cs +++ b/AutoUpdater.NET/RemindLaterForm.cs @@ -1,72 +1,71 @@ using System; using System.Windows.Forms; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +internal partial class RemindLaterForm : Form { - internal partial class RemindLaterForm : Form + public RemindLaterForm() { - public RemindLaterFormat RemindLaterFormat { get; private set; } + InitializeComponent(); + } - public int RemindLaterAt { get; private set; } + public RemindLaterFormat RemindLaterFormat { get; private set; } - public RemindLaterForm() - { - InitializeComponent(); - } + public int RemindLaterAt { get; private set; } - private void RemindLaterFormLoad(object sender, EventArgs e) - { - comboBoxRemindLater.SelectedIndex = 0; - radioButtonYes.Checked = true; - } + private void RemindLaterFormLoad(object sender, EventArgs e) + { + comboBoxRemindLater.SelectedIndex = 0; + radioButtonYes.Checked = true; + } - private void ButtonOkClick(object sender, EventArgs e) + private void ButtonOkClick(object sender, EventArgs e) + { + if (radioButtonYes.Checked) { - if (radioButtonYes.Checked) + switch (comboBoxRemindLater.SelectedIndex) { - switch (comboBoxRemindLater.SelectedIndex) - { - case 0: - RemindLaterFormat = RemindLaterFormat.Minutes; - RemindLaterAt = 30; - break; - case 1: - RemindLaterFormat = RemindLaterFormat.Hours; - RemindLaterAt = 12; - break; - case 2: - RemindLaterFormat = RemindLaterFormat.Days; - RemindLaterAt = 1; - break; - case 3: - RemindLaterFormat = RemindLaterFormat.Days; - RemindLaterAt = 2; - break; - case 4: - RemindLaterFormat = RemindLaterFormat.Days; - RemindLaterAt = 4; - break; - case 5: - RemindLaterFormat = RemindLaterFormat.Days; - RemindLaterAt = 8; - break; - case 6: - RemindLaterFormat = RemindLaterFormat.Days; - RemindLaterAt = 10; - break; - } - - DialogResult = DialogResult.OK; - } - else - { - DialogResult = DialogResult.Abort; + case 0: + RemindLaterFormat = RemindLaterFormat.Minutes; + RemindLaterAt = 30; + break; + case 1: + RemindLaterFormat = RemindLaterFormat.Hours; + RemindLaterAt = 12; + break; + case 2: + RemindLaterFormat = RemindLaterFormat.Days; + RemindLaterAt = 1; + break; + case 3: + RemindLaterFormat = RemindLaterFormat.Days; + RemindLaterAt = 2; + break; + case 4: + RemindLaterFormat = RemindLaterFormat.Days; + RemindLaterAt = 4; + break; + case 5: + RemindLaterFormat = RemindLaterFormat.Days; + RemindLaterAt = 8; + break; + case 6: + RemindLaterFormat = RemindLaterFormat.Days; + RemindLaterAt = 10; + break; } - } - private void RadioButtonYesCheckedChanged(object sender, EventArgs e) + DialogResult = DialogResult.OK; + } + else { - comboBoxRemindLater.Enabled = radioButtonYes.Checked; + DialogResult = DialogResult.Abort; } } + + private void RadioButtonYesCheckedChanged(object sender, EventArgs e) + { + comboBoxRemindLater.Enabled = radioButtonYes.Checked; + } } \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.cs.resx b/AutoUpdater.NET/RemindLaterForm.cs.resx index b7c44556..a46c408b 100644 --- a/AutoUpdater.NET/RemindLaterForm.cs.resx +++ b/AutoUpdater.NET/RemindLaterForm.cs.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Přejete si stáhnout aktualizaci později? - + Měli byste program aktualizovat nyní. Trvá to jenom krátkou chvíli v závislosti na rychlosti internetového připojení a umožní používání nejnovější verze programu. - + Ano, připomenou aktualizaci později: - + Ne, aktualizovat nyní (doporučeno) - + o 30 minut - + o 12 hodin - + o 1 den - + o 2 dny - + o 4 dny - + o 8 dní - + o 10 dní - + Připomenout aktualizaci později \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.da.resx b/AutoUpdater.NET/RemindLaterForm.da.resx index 0b0547c3..f4a94343 100644 --- a/AutoUpdater.NET/RemindLaterForm.da.resx +++ b/AutoUpdater.NET/RemindLaterForm.da.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Påmind mig senere - + om 30 minutter - + om 12 timer - + om 1 dag - + om 2 dage - + om 4 dage - + om 8 dage - + om 10 dage - + Du burde opdatere nu. Det tager kun kort tid (afhængig af din internet forbindelse) og sikrer at du har den seneste version af programmet. - + Ønsker du at opdatere senere? - + Nej, download opdateringer nu (anbefales) - + Ja, påmind mig senere : \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.de.resx b/AutoUpdater.NET/RemindLaterForm.de.resx index b9b1855c..abd79749 100644 --- a/AutoUpdater.NET/RemindLaterForm.de.resx +++ b/AutoUpdater.NET/RemindLaterForm.de.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Später erinnern - + In 30 Minuten - + In 12 Stunden - + In 1 Tag - + In 2 Tagen - + In 4 Tagen - + In 8 Tagen - + In 10 Tagen - + Es wird empfohlen jetzt das neue Update herunterzuladen. Dies dauert nur einige Minuten, je nach Internetverbindung. Damit ist sichergestellt, dass die aktuellste Version dieser Anwendung genutzt wird. - + Soll das Update später heruntergeladen werden? - + Nein, jetzt das Update herunterladen (empfohlen) - + Ja, später erinnern: \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.es.resx b/AutoUpdater.NET/RemindLaterForm.es.resx index 4423ded4..ffbe41b8 100644 --- a/AutoUpdater.NET/RemindLaterForm.es.resx +++ b/AutoUpdater.NET/RemindLaterForm.es.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + ¿Quieres descargar las actualizaciones más tarde? - + Usted debe descargar las actualizaciones ahora. Esto sólo toma unos minutos dependiendo de su conexión a internet y asegura que posee la última versión de la aplicación. - + Sí , por favor, me recuerdan más tarde: - + No, descargar actualizaciones ahora (recomendado) - + Después de 30 minutos - + Después de 12 horas - + Después de 1 día - + Después de 2 días - + Después de 4 días - + Después de 8 días - + Después de 10 días - + Recordar más tarde para la actualización \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.fr.resx b/AutoUpdater.NET/RemindLaterForm.fr.resx index c1b676e4..7b34bd4d 100644 --- a/AutoUpdater.NET/RemindLaterForm.fr.resx +++ b/AutoUpdater.NET/RemindLaterForm.fr.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Voulez-vous télécharger les mises à jour plus tard? - + Vous devez télécharger les mises à jour maintenant. Cela ne prend que quelques minutes selon votre connexion internet et vous assure d'avoir toute dernière version de l'application. - + Oui, s'il vous plaît rappelez -moi plus tard : - + Non, télécharger les mises à jour maintenant (recommandé) - + Après 30 minutes - + Après 12 heures - + Après 1 jour - + Après 2 jours - + Après 4 jours - + Après 8 jours - + Après 10 jours - + Rappelez-moi plus tard la mise à jour \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.it.resx b/AutoUpdater.NET/RemindLaterForm.it.resx index 9a8bb8ac..0c5ba318 100644 --- a/AutoUpdater.NET/RemindLaterForm.it.resx +++ b/AutoUpdater.NET/RemindLaterForm.it.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Ricordamelo più tardi - + Tra 30 minuti - + Tra 12 ore - + Tra 1 giorno - + Tra 2 giorni - + Tra 4 giorni - + Tra 8 giorni - + Tra 10 giorni - + Si consiglia di scaricare gli aggiornamenti ora. Questa operazione richiede soltanto pochi minuti, a seconda della vostra connessione internet, e permette di avere sempre l'ultima versione aggiornata dell'applicazione. - + Vuoi scaricare gli aggiornamenti più tardi? - + No, scarica gli aggiornamenti adesso (consigliato) - + Sì, ricordamelo in seguito: \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.ja-JP.resx b/AutoUpdater.NET/RemindLaterForm.ja-JP.resx index 639bad12..4dc8ddac 100644 --- a/AutoUpdater.NET/RemindLaterForm.ja-JP.resx +++ b/AutoUpdater.NET/RemindLaterForm.ja-JP.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 後で通知する - + 30分後 - + 12時間後 - + 1日後 - + 2日後 - + 4日後 - + 8日後 - + 10日後 - + アプリケーションの最新バージョンを確実に入手できます。今すぐアップデートをダウンロードしてください。 (インターネット接続によってはほんの数分しかかかりません。) - + 後でダウンロードしますか? - + ダウンロードせず、アップデートする(推奨) - + 後で通知する \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.ko.resx b/AutoUpdater.NET/RemindLaterForm.ko.resx index 9c0ff5e3..70a7ce21 100644 --- a/AutoUpdater.NET/RemindLaterForm.ko.resx +++ b/AutoUpdater.NET/RemindLaterForm.ko.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 나중에 업데이트 알림 - + 30분 후 - + 12시간 후 - + 1시간 후 - + 2시간 후 - + 4시간 후 - + 8시간 후 - + 10시간 후 - + 지금 업데이트를 다운로드합니다. 인터넷 연결에 따라 몇 분 정도 걸립니다. 최신 버전의 응용프로그램을 사용할 수 있습니다. - + 나중에 업데이트를 다운로드 하시겠습니까? - + 아니요, 지금 업데이트를 다운로드합니다. (권장) - + 예, 나중에 다시 알려주세요: \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.lv.resx b/AutoUpdater.NET/RemindLaterForm.lv.resx index fdc76b69..61aea987 100644 --- a/AutoUpdater.NET/RemindLaterForm.lv.resx +++ b/AutoUpdater.NET/RemindLaterForm.lv.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Nē, lejupielādēt atjauninājumus tagad (Ieteicams) - + Pēc 30 minūtēm - + Pēc 12 stundām - + Pēc 1 dienas - + Pēc 2 dienām - + Pēc 4 dienām - + Pēc 8 dienām - + Pēc 10 dienām - + Jā, lūdzu atgādiniet man vēlāk: - + Jums vajadzētu lejupielādēt atjauninājumus tagad. Tas aizņems tikai pāris minūtes, atkarība no jūsu interneta savienojuma ātrumu, un nodrošinās jūs ar jaunāko programmatūras versiju. - + Vai jūs vēlaties lejupielādēt atjauninājumus vēlāk? - + Atgādināt vēlāk par atjauninājumu \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.nl.resx b/AutoUpdater.NET/RemindLaterForm.nl.resx index 5d6caeb6..0e03af86 100644 --- a/AutoUpdater.NET/RemindLaterForm.nl.resx +++ b/AutoUpdater.NET/RemindLaterForm.nl.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Nee, download updates nu (aanbevolen) - + Na 30 minuten - + Na 12 uur - + Na 1 dag - + Na 2 dagen - + Na 4 dagen - + Na 8 dagen - + Na 10 dagen - + Ja, probeer het later herinneren me: - + Je zou updates nu te downloaden. Dit duurt slechts enkele minuten, afhankelijk van uw internet verbinding en zorgt ervoor dat je laatste versie van de applicatie. - + Wilt u updates later te downloaden? - + Herinner me later naar update \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.pl.resx b/AutoUpdater.NET/RemindLaterForm.pl.resx index f9cfbf37..a543774a 100644 --- a/AutoUpdater.NET/RemindLaterForm.pl.resx +++ b/AutoUpdater.NET/RemindLaterForm.pl.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Nie, pobierz aktualizacje teraz (zalecane) - + 30 minut - + 12 godzin - + 1 dzień - + 2 dni - + 4 dni - + 8 dni - + 10 dni - + Tak, przypomnij mi za: - + Zaleca się pobranie aktualizacji już teraz. Ten proces może potrwać kilka minut, w zależności od szybkości połączenia internetowego, i zapewnia, że masz najnowszą wersję programu. - + Czy chcesz pobrać aktualizacje później? - + Przypomnij mi później \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.pt-BR.resx b/AutoUpdater.NET/RemindLaterForm.pt-BR.resx index 225ec399..af0a0de0 100644 --- a/AutoUpdater.NET/RemindLaterForm.pt-BR.resx +++ b/AutoUpdater.NET/RemindLaterForm.pt-BR.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Lembrar mais tarde - + Em 30 minutos - + Em 12 horas - + Em 1 dia - + Em 2 dias - + Em 4 dias - + Em 8 dias - + Em 10 dias - + Você deve baixar a atualização agora. Dependendo da sua conexão com a internet, demora apenas alguns minutos e assegura que você tem a última versão da aplicação. - + Deseja baixar a atualização mais tarde? - + Não - + Sim \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.pt.resx b/AutoUpdater.NET/RemindLaterForm.pt.resx index a2e94c14..6d589b0a 100644 --- a/AutoUpdater.NET/RemindLaterForm.pt.resx +++ b/AutoUpdater.NET/RemindLaterForm.pt.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Recordar-me mais tarde - + Daqui a 30 minutos - + Daqui a 12 horas - + Daqui a 1 dia - + Daqui a 2 dias - + Daqui a 4 dias - + Daqui a 8 dias - + Daqui a 10 dias - + Deverá transferir a atualização agora. Dependendo da sua ligação à internet, demora apenas alguns minutos e assegura que tem a última versão da aplicação - + Deseja transferir a atualização mais tarde? - + Não - + Sim \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.resx b/AutoUpdater.NET/RemindLaterForm.resx index 5046251a..ac410d09 100644 --- a/AutoUpdater.NET/RemindLaterForm.resx +++ b/AutoUpdater.NET/RemindLaterForm.resx @@ -1,433 +1,451 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - True - - - 3 - - - - Fill - - - - 3, 3 - - - 79, 90 - - - CenterImage - - - 1 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + True + + + 3 + + + + Fill + + + + 3, 3 + + + 79, 90 + + + CenterImage + + + 1 + + pictureBoxIcon - + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 0 - - True - - - Bottom - - - Segoe UI, 9pt, style=Bold - - - 91, 138 - - - 6, 3, 3, 3 - - - 406, 19 - - - 4 - - + + True + + + Bottom + + + Segoe UI, 9pt, style=Bold + + + 91, 138 + + + 6, 3, 3, 3 + + + 406, 19 + + + 4 + + No, download updates now (recommended) - + radioButtonNo - + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 2 - - Bottom - - + + Bottom + + After 30 minutes - + After 12 hours - + After 1 day - + After 2 days - + After 4 days - + After 8 days - + After 10 days - - 375, 102 - - - 10, 3, 10, 3 - - - 115, 23 - - - 5 - - + + 375, 102 + + + 10, 3, 10, 3 + + + 115, 23 + + + 5 + + comboBoxRemindLater - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 3 - - True - - - Bottom - - - Segoe UI, 9pt - - - 91, 106 - - - 6, 3, 3, 3 - - - 271, 19 - - - 3 - - + + True + + + Bottom + + + Segoe UI, 9pt + + + 91, 106 + + + 6, 3, 3, 3 + + + 271, 19 + + + 3 + + Yes, please remind me later : - + radioButtonYes - + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 4 - - True - - - Bottom - - - Segoe UI, 9pt - - - 88, 51 - - - 409, 45 - - - 2 - - + + True + + + Bottom + + + Segoe UI, 9pt + + + 88, 51 + + + 409, 45 + + + 2 + + You should download updates now. This only takes few minutes depending on your internet connection and ensures you have latest version of the application. - + labelDescription - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 5 - - Fill - - - 375, 163 - - - 10, 3, 10, 3 - - - 115, 32 - - - 6 - - + + Fill + + + 375, 163 + + + 10, 3, 10, 3 + + + 115, 32 + + + 6 + + OK - - MiddleRight - - - ImageBeforeText - - + + MiddleRight + + + ImageBeforeText + + buttonOK - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 6 - - Fill - - - 0, 0 - - - 5 - - - 499, 198 - - - 7 - - + + Fill + + + 0, 0 + + + 5 + + + 499, 198 + + + 7 + + tableLayoutPanel - + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 0 - - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="pictureBoxIcon" Row="0" RowSpan="2" Column="0" ColumnSpan="1" /><Control Name="labelTitle" Row="0" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="radioButtonNo" Row="3" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="comboBoxRemindLater" Row="2" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="radioButtonYes" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="labelDescription" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="buttonOK" Row="4" RowSpan="1" Column="2" ColumnSpan="1" /></Controls><Columns Styles="Absolute,85,Absolute,280,Absolute,135" /><Rows Styles="Absolute,32,Absolute,64,Absolute,32,Absolute,32,Absolute,16" /></TableLayoutSettings> - - - Bottom - - - Segoe UI, 10.5pt, style=Bold - - - 88, 13 - - - 409, 19 - - - 0 - - + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control + Name="pictureBoxIcon" Row="0" RowSpan="2" Column="0" ColumnSpan="1" /><Control Name="labelTitle" + Row="0" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="radioButtonNo" Row="3" RowSpan="1" + Column="1" ColumnSpan="2" /><Control Name="comboBoxRemindLater" Row="2" RowSpan="1" Column="2" + ColumnSpan="1" /><Control Name="radioButtonYes" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control + Name="labelDescription" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="buttonOK" + Row="4" RowSpan="1" Column="2" ColumnSpan="1" /></Controls><Columns + Styles="Absolute,85,Absolute,280,Absolute,135" /><Rows + Styles="Absolute,32,Absolute,64,Absolute,32,Absolute,32,Absolute,16" /></TableLayoutSettings> + + + + Bottom + + + Segoe UI, 10.5pt, style=Bold + + + 88, 13 + + + 409, 19 + + + 0 + + Do you want to download updates later? - + labelTitle - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + tableLayoutPanel - + 1 - - True - - - 7, 15 - - - 499, 198 - - - Segoe UI, 9pt - - - 3, 4, 3, 4 - - - CenterParent - - + + True + + + 7, 15 + + + 499, 198 + + + Segoe UI, 9pt + + + 3, 4, 3, 4 + + + CenterParent + + Remind me later for update - + RemindLaterForm - + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.ru.resx b/AutoUpdater.NET/RemindLaterForm.ru.resx index 7b4ed431..8f8f24ec 100644 --- a/AutoUpdater.NET/RemindLaterForm.ru.resx +++ b/AutoUpdater.NET/RemindLaterForm.ru.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Напомнить об обновлении позднее - + Через 30 минут - + Через 12 часов - + Через 1 день - + Через 2 дня - + Через 4 дня - + Через 8 дней - + Через 10 дней - + Рекомендуем загрузить обновление сейчас. Это займет всего несколько минут, в зависимости от скорости локальной сети и Вашего компьютера. - + Отложить загрузку новой версии? - + Нет, загрузить обновление сейчас (рекоммендуется) - + Да, напомнить позднее: \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.sk.resx b/AutoUpdater.NET/RemindLaterForm.sk.resx index 5d3f4c84..825bb58b 100644 --- a/AutoUpdater.NET/RemindLaterForm.sk.resx +++ b/AutoUpdater.NET/RemindLaterForm.sk.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Želáte si stiahnuť aktualizáciu neskôr? - + Mali by ste aktualizovať program teraz. Trvá to len krátku chíľu v závislosti na rýchlosti Internetového pripojenia a zabezpečí používanie podslednej verzie programu. - + Áno, pripomenúť aktualizáciu neskôr: - + Nie, aktualizovať hneď teraz (odporúčané) - + o 30 minút - + o 12 hodín - + o 1 deň - + o 2 dni - + o 4 dni - + o 8 dní - + o 10 dní - + Pripomenúť aktualizáciu neskôr \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.sv.resx b/AutoUpdater.NET/RemindLaterForm.sv.resx index a06c97ad..42c539eb 100644 --- a/AutoUpdater.NET/RemindLaterForm.sv.resx +++ b/AutoUpdater.NET/RemindLaterForm.sv.resx @@ -1,156 +1,162 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Nej, hämta uppdateringar nu (rekommenderas) - + Efter 30 minuter - + Efter 12 timmar - + Efter 1 dag - + Efter 2 dagar - + Efter 4 dagar - + Efter 8 dagar - + Efter 10 dagar - + Ja, påminn mig senare: - + Du ska hämta uppdateringar nu. Det tar bara några minuter beroende på din internetuppkoppling och att du har senaste versionen av programmet. - + Vill du ladda ner uppdateringar senare? - + Påminn mig senare för uppdatering \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.th.resx b/AutoUpdater.NET/RemindLaterForm.th.resx index f6eb4687..760b8027 100644 --- a/AutoUpdater.NET/RemindLaterForm.th.resx +++ b/AutoUpdater.NET/RemindLaterForm.th.resx @@ -1,159 +1,165 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + เตือนฉันในภายหลัง - + โอเค - + ในอีก 30 นาที - + ในอีก 12 ชั่วโมง - + ในอีก 1 วัน - + ในอีก 2 วัน - + ในอีก 4 วัน - + ในอีก 8 วัน - + ในอีก 10 วัน - + ท่านควรที่จะดาวน์โหลดอัปเดตในตอนนี้ ใช้เวลาแป๊บเดียวเท่านั้น - + ท่านต้องการดาวน์โหลดอัปเดตในภายหลังใช่ไหม? - + ไม่ ดาวน์โหลดตอนนี้เลย (แนะนำ) - + ใช่ เตือนฉันภายหลัง \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.tr.resx b/AutoUpdater.NET/RemindLaterForm.tr.resx index 366eb8b4..a63ba944 100644 --- a/AutoUpdater.NET/RemindLaterForm.tr.resx +++ b/AutoUpdater.NET/RemindLaterForm.tr.resx @@ -1,159 +1,165 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Daha sonra hatırlat - + Tamam - + 30 dakika sonra - + 12 saat sonra - + 1 gün sonra - + 2 gün sonra - + 4 gün sonra - + 8 gün sonra - + 10 gün sonra - + Güncellemeleri şimdi yüklemelisiniz. Bu Internet bağlantı hızınıza bağlı olarak birkaç dakika sürecek ve uygulamanın son sürümünü kullanmanızı sağlayacaktır. - + Güncellemeleri sonra yüklemek istediğinize emin misiniz? - + Hayır, güncellemeleri şimdi yükle (önerilen). - + Evet, lütfen daha sonra hatırlat: \ No newline at end of file diff --git a/AutoUpdater.NET/RemindLaterForm.zh-TW.resx b/AutoUpdater.NET/RemindLaterForm.zh-TW.resx index 4afe44e9..0896d279 100644 --- a/AutoUpdater.NET/RemindLaterForm.zh-TW.resx +++ b/AutoUpdater.NET/RemindLaterForm.zh-TW.resx @@ -1,159 +1,165 @@ - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 稍後提醒 - + 確定 - + 30分鐘後 - + 12小時後 - + 1天後 - + 2天後 - + 4天後 - + 8天後 - + 10天後 - + 您應現在下載更新。一般而言,此過程僅花費幾分鐘(視您的網路狀況而定)。 - + 您希望稍後再下載更新嗎? - + 不,現在就下載更新(推薦) - + 是,請稍後再提醒我 diff --git a/AutoUpdater.NET/RemindLaterForm.zh.resx b/AutoUpdater.NET/RemindLaterForm.zh.resx index e0139043..aebce725 100644 --- a/AutoUpdater.NET/RemindLaterForm.zh.resx +++ b/AutoUpdater.NET/RemindLaterForm.zh.resx @@ -1,159 +1,165 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 不,现在就下载更新(推荐) - + 30 分钟后 - + 12 小时后 - + 1 天后 - + 2 天后 - + 4 天后 - + 8 天后 - + 10 天后 - + 是的,请以后提醒我 - + 您应该现在就下载更新。一般只需要花费几分钟(具体时间视您的网络状况而定)就能确保您的程序最新。 - + 确定 - + 您希望以后再下载更新么? - + 提醒我以后更新 \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.ar.resx b/AutoUpdater.NET/UpdateForm.ar.resx index 2c661c99..4cf92a49 100644 --- a/AutoUpdater.NET/UpdateForm.ar.resx +++ b/AutoUpdater.NET/UpdateForm.ar.resx @@ -1,149 +1,156 @@  - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Yes - - - - True - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + Yes + + + + True + + يتوفر إصدار جديد من {0}! - + {0} {1} متاح الآن. لديك نسخة {2} مثبتة. هل ترغب في تنزيله الآن؟ - + ملاحظات الإصدار: - + تحديث - + ذكرني لاحقا - + تخطي هذه النسخة - + {0} {1} متاح! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 07c7440b..6d58e7cd 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Globalization; @@ -7,224 +8,231 @@ using Microsoft.Web.WebView2.Core; using Microsoft.Win32; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +internal sealed partial class UpdateForm : Form { - internal sealed partial class UpdateForm : Form + private readonly UpdateInfoEventArgs _args; + + public UpdateForm(UpdateInfoEventArgs args) { - private readonly UpdateInfoEventArgs _args; + _args = args; + InitializeComponent(); + InitializeBrowserControl(); + buttonSkip.Visible = AutoUpdater.ShowSkipButton; + buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton; + var resources = new ComponentResourceManager(typeof(UpdateForm)); + Text = string.Format(resources.GetString("$this.Text", CultureInfo.CurrentCulture)!, + AutoUpdater.AppTitle, _args.CurrentVersion); + labelUpdate.Text = string.Format(resources.GetString("labelUpdate.Text", CultureInfo.CurrentCulture)!, + AutoUpdater.AppTitle); + labelDescription.Text = + string.Format(resources.GetString("labelDescription.Text", CultureInfo.CurrentCulture)!, + AutoUpdater.AppTitle, _args.CurrentVersion, _args.InstalledVersion); + + if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) + { + ControlBox = false; + } + } - public UpdateForm(UpdateInfoEventArgs args) + private async void InitializeBrowserControl() + { + if (string.IsNullOrEmpty(_args.ChangelogURL)) + { + int reduceHeight = labelReleaseNotes.Height + webBrowser.Height; + labelReleaseNotes.Hide(); + webBrowser.Hide(); + webView2.Hide(); + Height -= reduceHeight; + } + else { - _args = args; - InitializeComponent(); - InitializeBrowserControl(); - buttonSkip.Visible = AutoUpdater.ShowSkipButton; - buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton; - var resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm)); - Text = string.Format(resources.GetString("$this.Text", CultureInfo.CurrentCulture)!, - AutoUpdater.AppTitle, _args.CurrentVersion); - labelUpdate.Text = string.Format(resources.GetString("labelUpdate.Text", CultureInfo.CurrentCulture)!, - AutoUpdater.AppTitle); - labelDescription.Text = - string.Format(resources.GetString("labelDescription.Text", CultureInfo.CurrentCulture)!, - AutoUpdater.AppTitle, _args.CurrentVersion, _args.InstalledVersion); - - if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) + var webView2RuntimeFound = false; + try + { + string availableBrowserVersion = CoreWebView2Environment.GetAvailableBrowserVersionString(); + var requiredMinBrowserVersion = "86.0.616.0"; + if (!string.IsNullOrEmpty(availableBrowserVersion) + && CoreWebView2Environment.CompareBrowserVersions(availableBrowserVersion, + requiredMinBrowserVersion) >= 0) + { + webView2RuntimeFound = true; + } + } + catch (Exception) { - ControlBox = false; + // ignored } - } - private async void InitializeBrowserControl() - { - if (string.IsNullOrEmpty(_args.ChangelogURL)) + if (webView2RuntimeFound) { - var reduceHeight = labelReleaseNotes.Height + webBrowser.Height; - labelReleaseNotes.Hide(); webBrowser.Hide(); - webView2.Hide(); - Height -= reduceHeight; + webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; + await webView2.EnsureCoreWebView2Async( + await CoreWebView2Environment.CreateAsync(null, Path.GetTempPath())); } else { - bool webView2RuntimeFound = false; - try - { - string availableBrowserVersion = CoreWebView2Environment.GetAvailableBrowserVersionString(); - string requiredMinBrowserVersion = "86.0.616.0"; - if (!string.IsNullOrEmpty(availableBrowserVersion) - && CoreWebView2Environment.CompareBrowserVersions(availableBrowserVersion, requiredMinBrowserVersion) >= 0) - { - webView2RuntimeFound = true; - } - } - catch (Exception) - { - // ignored - } - if (webView2RuntimeFound) + UseLatestIE(); + if (null != AutoUpdater.BasicAuthChangeLog) { - webBrowser.Hide(); - webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; - await webView2.EnsureCoreWebView2Async(await CoreWebView2Environment.CreateAsync(null, Path.GetTempPath())); + webBrowser.Navigate(_args.ChangelogURL, "", null, + $"Authorization: {AutoUpdater.BasicAuthChangeLog}"); } else { - UseLatestIE(); - if (null != AutoUpdater.BasicAuthChangeLog) - { - webBrowser.Navigate(_args.ChangelogURL, "", null, - $"Authorization: {AutoUpdater.BasicAuthChangeLog}"); - } - else - { - webBrowser.Navigate(_args.ChangelogURL); - } + webBrowser.Navigate(_args.ChangelogURL); } } } + } - private void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) + private void WebView_CoreWebView2InitializationCompleted(object sender, + CoreWebView2InitializationCompletedEventArgs e) + { + if (!e.IsSuccess) { - if (!e.IsSuccess) + if (AutoUpdater.ReportErrors) { - if (AutoUpdater.ReportErrors) - { - MessageBox.Show(e.InitializationException.Message, e.InitializationException.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); - } - return; + MessageBox.Show(e.InitializationException.Message, e.InitializationException.GetType().ToString(), + MessageBoxButtons.OK, MessageBoxIcon.Error); } - webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; - webView2.CoreWebView2.Settings.IsStatusBarEnabled = false; - webView2.CoreWebView2.Settings.AreDevToolsEnabled = Debugger.IsAttached; - webView2.CoreWebView2.Settings.UserAgent = AutoUpdater.GetUserAgent(); - webView2.CoreWebView2.Profile.ClearBrowsingDataAsync(); - webView2.Show(); - webView2.BringToFront(); - if (null != AutoUpdater.BasicAuthChangeLog) - { - webView2.CoreWebView2.BasicAuthenticationRequested += delegate ( - object sender, - CoreWebView2BasicAuthenticationRequestedEventArgs args) - { - args.Response.UserName = ((BasicAuthentication)AutoUpdater.BasicAuthChangeLog).Username; - args.Response.Password = ((BasicAuthentication)AutoUpdater.BasicAuthChangeLog).Password; - }; - } - webView2.CoreWebView2.Navigate(_args.ChangelogURL); + return; } - private void UseLatestIE() + webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; + webView2.CoreWebView2.Settings.IsStatusBarEnabled = false; + webView2.CoreWebView2.Settings.AreDevToolsEnabled = Debugger.IsAttached; + webView2.CoreWebView2.Settings.UserAgent = AutoUpdater.GetUserAgent(); + webView2.CoreWebView2.Profile.ClearBrowsingDataAsync(); + webView2.Show(); + webView2.BringToFront(); + if (null != AutoUpdater.BasicAuthChangeLog) { - int ieValue = webBrowser.Version.Major switch + webView2.CoreWebView2.BasicAuthenticationRequested += delegate( + object _, + CoreWebView2BasicAuthenticationRequestedEventArgs args) { - 11 => 11001, - 10 => 10001, - 9 => 9999, - 8 => 8888, - 7 => 7000, - _ => 0 + args.Response.UserName = ((BasicAuthentication)AutoUpdater.BasicAuthChangeLog).Username; + args.Response.Password = ((BasicAuthentication)AutoUpdater.BasicAuthChangeLog).Password; }; + } - if (ieValue == 0) return; + webView2.CoreWebView2.Navigate(_args.ChangelogURL); + } - try - { - using (RegistryKey registryKey = - Registry.CurrentUser.OpenSubKey( - @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", - true)) - { - registryKey?.SetValue(Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName), - ieValue, - RegistryValueKind.DWord); - } - } - catch (Exception) - { - // ignored - } + private void UseLatestIE() + { + int ieValue = webBrowser.Version.Major switch + { + 11 => 11001, + 10 => 10001, + 9 => 9999, + 8 => 8888, + 7 => 7000, + _ => 0 + }; + + if (ieValue == 0) + { + return; } - private void UpdateFormLoad(object sender, EventArgs e) + try + { + using RegistryKey registryKey = + Registry.CurrentUser.OpenSubKey( + @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", + true); + registryKey?.SetValue(Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName), + ieValue, + RegistryValueKind.DWord); + } + catch (Exception) { - var labelSize = new Size(webBrowser.Width, 0); - labelDescription.MaximumSize = labelUpdate.MaximumSize = labelSize; + // ignored } + } + + private void UpdateFormLoad(object sender, EventArgs e) + { + var labelSize = new Size(webBrowser.Width, 0); + labelDescription.MaximumSize = labelUpdate.MaximumSize = labelSize; + } - private void ButtonUpdateClick(object sender, EventArgs e) + private void ButtonUpdateClick(object sender, EventArgs e) + { + if (AutoUpdater.OpenDownloadPage) { - if (AutoUpdater.OpenDownloadPage) - { - var processStartInfo = new ProcessStartInfo(_args.DownloadURL); + var processStartInfo = new ProcessStartInfo(_args.DownloadURL); - Process.Start(processStartInfo); + Process.Start(processStartInfo); - DialogResult = DialogResult.OK; - } - else + DialogResult = DialogResult.OK; + } + else + { + if (AutoUpdater.DownloadUpdate(_args)) { - if (AutoUpdater.DownloadUpdate(_args)) - { - DialogResult = DialogResult.OK; - } + DialogResult = DialogResult.OK; } } + } - private void ButtonSkipClick(object sender, EventArgs e) - { - AutoUpdater.PersistenceProvider.SetSkippedVersion(new Version(_args.CurrentVersion)); - } + private void ButtonSkipClick(object sender, EventArgs e) + { + AutoUpdater.PersistenceProvider.SetSkippedVersion(new Version(_args.CurrentVersion)); + } - private void ButtonRemindLaterClick(object sender, EventArgs e) + private void ButtonRemindLaterClick(object sender, EventArgs e) + { + if (AutoUpdater.LetUserSelectRemindLater) { - if (AutoUpdater.LetUserSelectRemindLater) - { - using var remindLaterForm = new RemindLaterForm(); - var dialogResult = remindLaterForm.ShowDialog(); + using var remindLaterForm = new RemindLaterForm(); + DialogResult dialogResult = remindLaterForm.ShowDialog(); - switch (dialogResult) - { - case DialogResult.OK: - AutoUpdater.RemindLaterTimeSpan = remindLaterForm.RemindLaterFormat; - AutoUpdater.RemindLaterAt = remindLaterForm.RemindLaterAt; - break; - case DialogResult.Abort: - ButtonUpdateClick(sender, e); - return; - default: - return; - } + switch (dialogResult) + { + case DialogResult.OK: + AutoUpdater.RemindLaterTimeSpan = remindLaterForm.RemindLaterFormat; + AutoUpdater.RemindLaterAt = remindLaterForm.RemindLaterAt; + break; + case DialogResult.Abort: + ButtonUpdateClick(sender, e); + return; + default: + return; } + } - AutoUpdater.PersistenceProvider.SetSkippedVersion(null); + AutoUpdater.PersistenceProvider.SetSkippedVersion(null); - DateTime remindLaterDateTime = AutoUpdater.RemindLaterTimeSpan switch - { - RemindLaterFormat.Days => DateTime.Now + TimeSpan.FromDays(AutoUpdater.RemindLaterAt), - RemindLaterFormat.Hours => DateTime.Now + TimeSpan.FromHours(AutoUpdater.RemindLaterAt), - RemindLaterFormat.Minutes => DateTime.Now + TimeSpan.FromMinutes(AutoUpdater.RemindLaterAt), - _ => DateTime.Now - }; + DateTime remindLaterDateTime = AutoUpdater.RemindLaterTimeSpan switch + { + RemindLaterFormat.Days => DateTime.Now + TimeSpan.FromDays(AutoUpdater.RemindLaterAt), + RemindLaterFormat.Hours => DateTime.Now + TimeSpan.FromHours(AutoUpdater.RemindLaterAt), + RemindLaterFormat.Minutes => DateTime.Now + TimeSpan.FromMinutes(AutoUpdater.RemindLaterAt), + _ => DateTime.Now + }; - AutoUpdater.PersistenceProvider.SetRemindLater(remindLaterDateTime); - AutoUpdater.SetTimer(remindLaterDateTime); + AutoUpdater.PersistenceProvider.SetRemindLater(remindLaterDateTime); + AutoUpdater.SetTimer(remindLaterDateTime); - DialogResult = DialogResult.Cancel; - } + DialogResult = DialogResult.Cancel; + } - private void UpdateForm_FormClosed(object sender, FormClosedEventArgs e) - { - AutoUpdater.Running = false; - } + private void UpdateForm_FormClosed(object sender, FormClosedEventArgs e) + { + AutoUpdater.Running = false; + } - private void UpdateForm_FormClosing(object sender, FormClosingEventArgs e) + private void UpdateForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) { - if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced) - { - AutoUpdater.Exit(); - } + AutoUpdater.Exit(); } } } \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.cs.resx b/AutoUpdater.NET/UpdateForm.cs.resx index ce350b42..ad410517 100644 --- a/AutoUpdater.NET/UpdateForm.cs.resx +++ b/AutoUpdater.NET/UpdateForm.cs.resx @@ -1,150 +1,156 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 212, 19 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + 212, 19 + + Nová verze {0} je k dispozici! - - 489, 15 - - + + 489, 15 + + Je k dispozici verze {0} {1}. Nainstalovaná je verze {2}. Přejete si aktualizovat na novou verzi? - - 139, 17 - - + + 139, 17 + + Poznámky k vydání: - + Aktualizovat - + Připomenout později - + Přeskočit tuto verzi - + {0} {1} je k dispozici! diff --git a/AutoUpdater.NET/UpdateForm.da.resx b/AutoUpdater.NET/UpdateForm.da.resx index 120477f5..542ab756 100644 --- a/AutoUpdater.NET/UpdateForm.da.resx +++ b/AutoUpdater.NET/UpdateForm.da.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} er tilgængelig! - + Påmind mig senere - + Skip denne version - + Opdater - + {0} {1} er nu klar. Du har version {2} installeret. Ønsker du at installere nu? - + Release Bemærkninger: - + En ny version af {0} er klar til download! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.de.resx b/AutoUpdater.NET/UpdateForm.de.resx index a5f830ca..e050ca3b 100644 --- a/AutoUpdater.NET/UpdateForm.de.resx +++ b/AutoUpdater.NET/UpdateForm.de.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} ist verfügbar! - + Später erinnern - + Version überspringen - + Update - + {0} {1} ist jetzt verfügbar. Aktuell ist Version {2} installiert. Soll die neue Version jetzt heruntergeladen werden? - + Versionshinweise: - + Eine neue Version von {0} ist verfügbar! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.es.resx b/AutoUpdater.NET/UpdateForm.es.resx index 99be4ca5..8967ff10 100644 --- a/AutoUpdater.NET/UpdateForm.es.resx +++ b/AutoUpdater.NET/UpdateForm.es.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Una nueva versión de {0} está disponible! - + {0} {1} ya está disponible. Tu tienes la versión {2} instalado. ¿Desea descargarlo ahora? - + Notas de la versión : - + actualizar - + Recuérdame más tarde - + Saltar esta versión - + {0} {1} está disponible! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.fr.resx b/AutoUpdater.NET/UpdateForm.fr.resx index 92443cc6..5f900414 100644 --- a/AutoUpdater.NET/UpdateForm.fr.resx +++ b/AutoUpdater.NET/UpdateForm.fr.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Une nouvelle version de {0} est disponible! - + {0} {1} est maintenant disponible. Vous disposez de la version {2} installé. Voulez-vous la télécharger maintenant? - + Notes de version : - + Mettre à jour - + Rappeler plus tard - + Passer cette version - + {0} {1} est disponible! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.it.resx b/AutoUpdater.NET/UpdateForm.it.resx index c80add61..5d44c866 100644 --- a/AutoUpdater.NET/UpdateForm.it.resx +++ b/AutoUpdater.NET/UpdateForm.it.resx @@ -1,147 +1,153 @@  - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 296, 573 - - - 179, 28 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + 296, 573 + + + 179, 28 + + {0} {1} è disponibile! - + Ricordamelo più tardi - + Salta questa versione - + Aggiorna - + {0} {1} è ora disponibile. Hai installato la versione {2}. Vuoi scaricare l'aggiornamento ora? - + Note di rilascio: - + Una nuova versione di {0} è disponibile! diff --git a/AutoUpdater.NET/UpdateForm.ja-JP.resx b/AutoUpdater.NET/UpdateForm.ja-JP.resx index f1bfddb5..5aed7a69 100644 --- a/AutoUpdater.NET/UpdateForm.ja-JP.resx +++ b/AutoUpdater.NET/UpdateForm.ja-JP.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} が利用できます。 - + 後で - + スキップ - + アップデート - + {0} {1} が利用できます。今は {2}がインストールされています。ダウンロードしますか? - + リリースノート: - + {0}の最新版が利用できます。 \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.ko.resx b/AutoUpdater.NET/UpdateForm.ko.resx index 98b12d65..6032aa2e 100644 --- a/AutoUpdater.NET/UpdateForm.ko.resx +++ b/AutoUpdater.NET/UpdateForm.ko.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1}을(를) 사용할 수 있습니다! - + 나중에 알리기 - + 이 버전 건너 뛰기 - + 업데이트 - + {0} {1}을(를) 사용할 수 있습니다. {2} 버전이 설치되었습니다. 지금 다운로드 하시겠습니까? - + 릴리즈 노트: - + {0}의 새 버전을 사용할 수 있습니다! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.lv.resx b/AutoUpdater.NET/UpdateForm.lv.resx index d4384f32..5ed0bec4 100644 --- a/AutoUpdater.NET/UpdateForm.lv.resx +++ b/AutoUpdater.NET/UpdateForm.lv.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} ir pieejams jauns atjauninājums! - + {0} {1} atjauninājums ir peejams. Pašlaik jums ir ieinstalēta versija {2}. Vai jūs vēlaties lejupielādēt atjauninājumu tagad? - + Atjaunināt - + Atgādināt vēlāk - + Izlaist šo atjauninājumu - + {0} {1} atjauninājums ir pieejams! - + Atjauninājuma piezīmes: \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.nl.resx b/AutoUpdater.NET/UpdateForm.nl.resx index c7f17676..9d4fb033 100644 --- a/AutoUpdater.NET/UpdateForm.nl.resx +++ b/AutoUpdater.NET/UpdateForm.nl.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Een nieuwe versie van {0} is beschikbaar! - + {0} {1} is nu beschikbaar. Je hebt versie {2} geïnstalleerd. Wilt u deze nu downloaden? - + Update - + Herinner me later - + Sla over - + {0} {1} is beschikbaar! - + Release Opmerkingen: diff --git a/AutoUpdater.NET/UpdateForm.pl.resx b/AutoUpdater.NET/UpdateForm.pl.resx index 31b88037..028a1017 100644 --- a/AutoUpdater.NET/UpdateForm.pl.resx +++ b/AutoUpdater.NET/UpdateForm.pl.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Nowa wersja programu {0} jest dostępna! - + Program {0} jest dostępny w wersji {1} (obecnie masz wersję {2}). Czy chcesz teraz pobrać nową wersję? - + Informacje o wersji: - + Zainstaluj aktualizację - + Przypomnij mi później - + Pomiń tę wersję - + {0} {1} już jest! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.pt-BR.resx b/AutoUpdater.NET/UpdateForm.pt-BR.resx index 76d04f5a..4f52a95b 100644 --- a/AutoUpdater.NET/UpdateForm.pt-BR.resx +++ b/AutoUpdater.NET/UpdateForm.pt-BR.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Versão {1} disponível - + Lembrar mais tarde - + Ignorar esta versão - + Atualizar - + Versão {1} de {0} está disponível. A versão instalada atualmente é a {2}. Deseja atualizar agora? - + Notas sobre a versão - + Nova versão de {0} disponível para download \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.pt.resx b/AutoUpdater.NET/UpdateForm.pt.resx index 2064ca43..bda4c375 100644 --- a/AutoUpdater.NET/UpdateForm.pt.resx +++ b/AutoUpdater.NET/UpdateForm.pt.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} está disponível! - + Lembrar-me mais tarde - + Ignorar esta versão - + Atualizar - + {0} {1} está disponível. A versão instalada é a {2}. Deseja atualizar agora? - + Notas sobre a versão - + Está disponível uma nova versão do {0}! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.resx b/AutoUpdater.NET/UpdateForm.resx index d68e3ec0..58a31560 100644 --- a/AutoUpdater.NET/UpdateForm.resx +++ b/AutoUpdater.NET/UpdateForm.resx @@ -1,988 +1,999 @@ - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Top, Bottom, Left, Right - - - - 94, 120 - - - 2, 2, 2, 2 - - - 23, 23 - - - 538, 432 - - - - 4 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + Top, Bottom, Left, Right + + + + 94, 120 + + + 2, 2, 2, 2 + + + 23, 23 + + + 538, 432 + + + + 4 + + webBrowser - + System.Windows.Forms.WebBrowser, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 8 - - True - - - Segoe UI, 10.5pt, style=Bold - - - 91, 14 - - - 550, 0 - - - 227, 19 - - - 5 - - + + True + + + Segoe UI, 10.5pt, style=Bold + + + 91, 14 + + + 550, 0 + + + 227, 19 + + + 5 + + A new version of {0} is available! - + labelUpdate - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 3 - - True - - - Segoe UI, 9pt - - - 91, 50 - - - 550, 0 - - - 479, 15 - - - 6 - - + + True + + + Segoe UI, 9pt + + + 91, 50 + + + 550, 0 + + + 479, 15 + + + 6 + + {0} {1} is now available. You have version {2} installed. Would you like to download it now? - + labelDescription - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 2 - - True - - - Segoe UI, 9.75pt, style=Bold - - - 91, 90 - - - 98, 17 - - - 7 - - + + True + + + Segoe UI, 9.75pt, style=Bold + + + 91, 90 + + + 98, 17 + + + 7 + + Release Notes: - + labelReleaseNotes - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 1 - - Bottom, Right - - - Segoe UI, 9pt - - - 479, 573 - - - 2, 2, 2, 2 - - - 153, 28 - - - 0 - - + + Bottom, Right + + + Segoe UI, 9pt + + + 479, 573 + + + 2, 2, 2, 2 + + + 153, 28 + + + 0 + + Update - - MiddleRight - - - ImageBeforeText - - + + MiddleRight + + + ImageBeforeText + + buttonUpdate - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 4 - - Bottom, Right - - - Segoe UI, 9pt - - - 322, 573 - - - 2, 2, 2, 2 - - - 153, 28 - - - 1 - - + + Bottom, Right + + + Segoe UI, 9pt + + + 322, 573 + + + 2, 2, 2, 2 + + + 153, 28 + + + 1 + + Remind me later - - MiddleRight - - - ImageBeforeText - - + + MiddleRight + + + ImageBeforeText + + buttonRemindLater - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 6 - - 12, 14 - - - 70, 66 - - - CenterImage - - - 8 - - + + 12, 14 + + + 70, 66 + + + CenterImage + + + 8 + + pictureBoxIcon - + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 0 - - Bottom, Left - - - Segoe UI, 9pt - - - 95, 573 - - - 2, 2, 2, 2 - - - 153, 28 - - - 2 - - + + Bottom, Left + + + Segoe UI, 9pt + + + 95, 573 + + + 2, 2, 2, 2 + + + 153, 28 + + + 2 + + Skip this version - - MiddleRight - - - ImageBeforeText - - + + MiddleRight + + + ImageBeforeText + + buttonSkip - + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 5 - - Top, Bottom, Left, Right - - - 94, 120 - - - 2, 2, 2, 2 - - - 23, 23 - - - 538, 432 - - - 3 - - - False - - + + Top, Bottom, Left, Right + + + 94, 120 + + + 2, 2, 2, 2 + + + 23, 23 + + + 538, 432 + + + 3 + + + False + + webView2 - + Microsoft.Web.WebView2.WinForms.WebView2, Microsoft.Web.WebView2.WinForms, Version=1.0.1210.39, Culture=neutral, PublicKeyToken=2a8ab48044d2601e - + $this - + 7 - - True - - - 7, 15 - - - 643, 612 - - - Segoe UI, 9pt - - - - AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA - IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// - /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af// - /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA/// - /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA - AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT - u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5 - 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N - 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R - 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz - +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6//// - //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un - +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h - +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv - +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf - z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA - //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA - AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA - AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA - AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA - ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA - ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA - AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj - 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA - AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA - ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA - ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA - AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA - AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA - AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO - 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af// - /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL - 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR - +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af// - /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW - +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ - +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ - +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc - zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su - +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK - 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ - +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU - +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af// - /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8//// - ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af// - /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY - +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af// - /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus - +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q - +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt - 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7 - 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN - 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW - 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu - +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW - +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv - 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf// - /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb - zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb - zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA - AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA - AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA - ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA - AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA - ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA - AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA - ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA - ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1 - dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t - 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA - AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi - 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA - AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA - AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA - ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA - ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf - ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA - ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT - 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA - ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af// - /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA - ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM - 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA - AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA - AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK - 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw - bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA - AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT - 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK - 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S - +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB - 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j - +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI - 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS - 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO - 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss - +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9 - /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92 - 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C - /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb - zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc - +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR - 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue - +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO - 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd - +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2 - /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi - 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v////////////// - ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H - 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs - /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E - 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS - 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL - 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn - +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ - 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i - +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY - +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax - +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+//// - ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu - 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY - +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc - zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY - ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip - +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP - 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks - +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR - +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv - 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV - 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic - +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf - +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c - 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf - +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo - 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo - +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa - zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd - zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu - +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm - +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc - zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af// - /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD/// - /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb - zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ - zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l - 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd - zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA - AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA - //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA - AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA - AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA - AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA - AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA - AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA - AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA - AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA - AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA - AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA - AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA - ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA - AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA - AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA - ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA - ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA - ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi - 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA - AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5 - eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA - AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA - AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA - AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA - ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA - ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA - AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA - ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA - AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA - AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA - AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ - 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB - 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA - AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA - ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe - z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA - ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA - ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP - JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA - AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA - AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA - AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY - +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv - 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA - AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M - 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH - 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc - zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA - ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf - +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc - zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA - AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO - 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc - zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA - AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA - AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ - +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ - 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA - AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd - zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO - 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS - 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA - AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S - +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD - 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb - yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV - +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ - 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc - zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW - +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP - 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA - AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm - +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3///////// - ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM - 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T - +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq - /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI - 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll - 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic - +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP - 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc - +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+ - //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa - +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7///////////////// - ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl - +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1 - 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0 - /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN - 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i - +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9 - +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc - z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h - +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f////////////////////////////////////////////// - ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD - 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT - 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7///////////////////////// - /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK - 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm - +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM - 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p - 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao - +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E - 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k - +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk - +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5//////////////////// - ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP - 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u - +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo - +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM - 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd - z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus - +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T - +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq - +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY - +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj - +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f////////////// - /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc - zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn - +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ - 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO - 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq - 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep - +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U - +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt - 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+ - +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V - +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX/// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe - 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5 - 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ - 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj - +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO - 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i - +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig - +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov - 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY - +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd - 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye - +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my - 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E - +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb - zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic - +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC - +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd - z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc - zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV - +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV - qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb - zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA - vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf - 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC - +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc - zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb - zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x - 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// - /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - - - - 2, 2, 2, 2 - - - CenterParent - - + + True + + + 7, 15 + + + 643, 612 + + + Segoe UI, 9pt + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af// + /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA/// + /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA + AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT + u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5 + 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N + 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R + 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz + +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6//// + //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un + +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h + +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv + +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf + z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA + AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA + ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA + ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA + AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj + 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA + AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA + ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA + ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA + AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA + AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA + AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO + 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af// + /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL + 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR + +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af// + /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW + +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ + +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ + +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc + zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su + +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK + 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ + +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU + +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af// + /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8//// + ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af// + /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY + +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af// + /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus + +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q + +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt + 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7 + 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN + 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW + 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu + +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW + +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv + 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf// + /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb + zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb + zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA + AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA + AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA + ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA + AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA + ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA + AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA + ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA + ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1 + dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t + 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA + AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi + 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA + AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA + AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA + ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA + ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf + ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA + ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT + 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA + ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af// + /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA + ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM + 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA + AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA + AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK + 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw + bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA + AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT + 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK + 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S + +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB + 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j + +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI + 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS + 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO + 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss + +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9 + /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92 + 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C + /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb + zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc + +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR + 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue + +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO + 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd + +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2 + /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi + 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v////////////// + ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H + 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs + /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E + 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS + 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL + 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn + +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ + 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i + +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY + +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax + +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+//// + ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu + 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY + +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc + zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY + ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip + +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP + 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks + +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR + +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv + 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV + 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic + +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf + +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c + 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf + +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo + 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo + +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa + zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd + zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu + +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm + +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc + zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af// + /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD/// + /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb + zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ + zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l + 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd + zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA + AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA + AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA + AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA + AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA + AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA + AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA + AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA + AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA + AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA + ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA + AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA + ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA + ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA + ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi + 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA + AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5 + eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA + AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA + AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA + AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA + ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA + ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA + AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA + ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA + AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA + AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA + AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ + 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB + 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA + AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA + ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe + z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA + ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA + ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP + JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA + AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA + AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY + +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv + 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA + AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M + 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH + 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc + zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA + ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf + +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc + zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA + AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO + 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc + zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA + AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA + AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ + +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ + 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA + AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd + zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO + 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS + 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA + AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S + +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD + 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb + yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV + +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ + 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc + zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW + +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP + 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA + AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm + +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3///////// + ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM + 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T + +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq + /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI + 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll + 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic + +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP + 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc + +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+ + //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa + +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7///////////////// + ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl + +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1 + 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0 + /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN + 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i + +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9 + +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc + z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h + +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f////////////////////////////////////////////// + ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD + 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT + 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7///////////////////////// + /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK + 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm + +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM + 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p + 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao + +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E + 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k + +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk + +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5//////////////////// + ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP + 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u + +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo + +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM + 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd + z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus + +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T + +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq + +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY + +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj + +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f////////////// + /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc + zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn + +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ + 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO + 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq + 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep + +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U + +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt + 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+ + +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V + +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe + 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5 + 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ + 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj + +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO + 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i + +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig + +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov + 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY + +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd + 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye + +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my + 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E + +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb + zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic + +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC + +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd + z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc + zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV + +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV + qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb + zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA + vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf + 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC + +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc + zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb + zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x + 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + + 2, 2, 2, 2 + + + CenterParent + + {0} {1} is available! - + UpdateForm - + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.ru.resx b/AutoUpdater.NET/UpdateForm.ru.resx index 9d072671..19c36df5 100644 --- a/AutoUpdater.NET/UpdateForm.ru.resx +++ b/AutoUpdater.NET/UpdateForm.ru.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} доступен для обновления! - + Напомнить позже - + Нет - + Да - + Доступна версия {1} программы {0}. Вы используете версию {2}. Хотите загрузить обновление? - + Информация о выпуске: - + Доступна новая версия {0}! diff --git a/AutoUpdater.NET/UpdateForm.sk.resx b/AutoUpdater.NET/UpdateForm.sk.resx index 80d2580c..d1330067 100644 --- a/AutoUpdater.NET/UpdateForm.sk.resx +++ b/AutoUpdater.NET/UpdateForm.sk.resx @@ -1,150 +1,156 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 212, 19 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + 212, 19 + + Nová verzie {0} je k dispozícii! - - 489, 15 - - + + 489, 15 + + Je k dispozícii verzia {0} {1}. Nainštalovaná je verzia {2}. Želáte si aktualizovať na novú verziu? - - 139, 17 - - + + 139, 17 + + Poznámky k vydaniu: - + Aktualizovať - + Pripomenúť neskôr - + Preskočiť túto verziu - + {0} {1} je k dispozícii! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.sv.resx b/AutoUpdater.NET/UpdateForm.sv.resx index 4e8f3df6..79171e2d 100644 --- a/AutoUpdater.NET/UpdateForm.sv.resx +++ b/AutoUpdater.NET/UpdateForm.sv.resx @@ -1,144 +1,150 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 200, 28 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + 200, 28 + + En ny version av {0} är tillgänglig! - + {0} {1} är nu tillgänglig. Du har version {2} installerad. Vill du ladda ner den nu? - + Uppdatera - + Påminn mig senare - + Hoppa över den här versionen - + {0} {1} är tillgänglig! - + Release Anmärkningar: \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.th.resx b/AutoUpdater.NET/UpdateForm.th.resx index 77e2ddd0..90f271bf 100644 --- a/AutoUpdater.NET/UpdateForm.th.resx +++ b/AutoUpdater.NET/UpdateForm.th.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} พร้อมสำหรับอัปเดตแล้ว! - + เตือนฉันในภายหลัง - + ข้ามเวอร์ชั่นนี้ไป - + อัปเดต - + {0} {1} พร้อมสำหรับการอัปเดตแล้ว ท่านมีเวอร์ชั่น {2} ติดตั้งอยู่ ต้องการอัปเดตเลยหรือไม่? - + สิ่งที่ถูกเปลี่ยนแปลง: - + เวอร์ชั่นใหม่ของ {0} พร้อมสำหรับการอัปเดตแล้ว! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.tr.resx b/AutoUpdater.NET/UpdateForm.tr.resx index 989b9822..7c36f9fe 100644 --- a/AutoUpdater.NET/UpdateForm.tr.resx +++ b/AutoUpdater.NET/UpdateForm.tr.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} mevcuttur! - + Daha sonra hatırlat - + Bu versiyonu geç - + Güncelle - + {0} {1} versiyonu hazır. Bilgisayarınızda {2} versiyonu kurulu. Güncellemeyi kurmak istediğinize emin misiniz? - + Sürüm Notları: - + {0}'nin yeni versiyonu mevcut! \ No newline at end of file diff --git a/AutoUpdater.NET/UpdateForm.zh-TW.resx b/AutoUpdater.NET/UpdateForm.zh-TW.resx index 23133e41..1536ff38 100644 --- a/AutoUpdater.NET/UpdateForm.zh-TW.resx +++ b/AutoUpdater.NET/UpdateForm.zh-TW.resx @@ -1,141 +1,147 @@ - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + {0} {1} 已經發行 - + 稍後再提醒 - + 忽略 - + 更新 - + {0} {1} 已經發行。本機目前的版本是 {2}。是否立即進行更新? - + 發行事項: - + 新版 {0} 已經發行! diff --git a/AutoUpdater.NET/UpdateForm.zh.resx b/AutoUpdater.NET/UpdateForm.zh.resx index faef58fa..c0c09af6 100644 --- a/AutoUpdater.NET/UpdateForm.zh.resx +++ b/AutoUpdater.NET/UpdateForm.zh.resx @@ -1,141 +1,147 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 新版本 {0} 可用! - + {0} {1} 现在可用。您安装的版本是 {2}。你现在要下载这个新版本吗? - + 发行说明: - + 更新 - + 以后再提醒更新 - + 忽略这个版本 - + {0} {1} 现在可用 diff --git a/AutoUpdater.NET/UpdateInfoEventArgs.cs b/AutoUpdater.NET/UpdateInfoEventArgs.cs index 870a4cea..ba326437 100644 --- a/AutoUpdater.NET/UpdateInfoEventArgs.cs +++ b/AutoUpdater.NET/UpdateInfoEventArgs.cs @@ -1,144 +1,144 @@ using System; using System.Xml.Serialization; -namespace AutoUpdaterDotNET +namespace AutoUpdaterDotNET; + +/// +/// Object of this class gives you all the details about the update useful in handling the update logic yourself. +/// +[XmlRoot("item")] +public class UpdateInfoEventArgs : EventArgs { + private string _changelogURL; + private string _downloadURL; + + /// + public UpdateInfoEventArgs() + { + Mandatory = new Mandatory(); + } + + /// + /// If new update is available then returns true otherwise false. + /// + public bool IsUpdateAvailable { get; set; } + /// - /// Object of this class gives you all the details about the update useful in handling the update logic yourself. + /// If there is an error while checking for update then this property won't be null. /// - [XmlRoot("item")] - public class UpdateInfoEventArgs : EventArgs + [XmlIgnore] + public Exception Error { get; set; } + + /// + /// Download URL of the update file. + /// + [XmlElement("url")] + public string DownloadURL { - private string _changelogURL; - private string _downloadURL; + get => GetURL(AutoUpdater.BaseUri, _downloadURL); + set => _downloadURL = value; + } - /// - public UpdateInfoEventArgs() - { - Mandatory = new Mandatory(); - } + /// + /// URL of the webpage specifying changes in the new update. + /// + [XmlElement("changelog")] + public string ChangelogURL + { + get => GetURL(AutoUpdater.BaseUri, _changelogURL); + set => _changelogURL = value; + } - /// - /// If new update is available then returns true otherwise false. - /// - public bool IsUpdateAvailable { get; set; } - - /// - /// If there is an error while checking for update then this property won't be null. - /// - [XmlIgnore] - public Exception Error { get; set; } - - /// - /// Download URL of the update file. - /// - [XmlElement("url")] - public string DownloadURL - { - get => GetURL(AutoUpdater.BaseUri, _downloadURL); - set => _downloadURL = value; - } + /// + /// Returns newest version of the application available to download. + /// + [XmlElement("version")] + public string CurrentVersion { get; set; } - /// - /// URL of the webpage specifying changes in the new update. - /// - [XmlElement("changelog")] - public string ChangelogURL - { - get => GetURL(AutoUpdater.BaseUri, _changelogURL); - set => _changelogURL = value; - } + /// + /// Returns version of the application currently installed on the user's PC. + /// + public Version InstalledVersion { get; set; } + + /// + /// Shows if the update is required or optional. + /// + [XmlElement("mandatory")] + public Mandatory Mandatory { get; set; } - /// - /// Returns newest version of the application available to download. - /// - [XmlElement("version")] - public string CurrentVersion { get; set; } - - /// - /// Returns version of the application currently installed on the user's PC. - /// - public Version InstalledVersion { get; set; } - - /// - /// Shows if the update is required or optional. - /// - [XmlElement("mandatory")] - public Mandatory Mandatory { get; set; } - - /// - /// Executable path of the updated application relative to installation directory. - /// - [XmlElement("executable")] - public string ExecutablePath { get; set; } - - /// - /// Command line arguments used by Installer. - /// - [XmlElement("args")] - public string InstallerArgs { get; set; } - - /// - /// Checksum of the update file. - /// - [XmlElement("checksum")] - public CheckSum CheckSum { get; set; } - - internal static string GetURL(Uri baseUri, string url) + /// + /// Executable path of the updated application relative to installation directory. + /// + [XmlElement("executable")] + public string ExecutablePath { get; set; } + + /// + /// Command line arguments used by Installer. + /// + [XmlElement("args")] + public string InstallerArgs { get; set; } + + /// + /// Checksum of the update file. + /// + [XmlElement("checksum")] + public CheckSum CheckSum { get; set; } + + internal static string GetURL(Uri baseUri, string url) + { + if (!string.IsNullOrEmpty(url) && Uri.IsWellFormedUriString(url, UriKind.Relative)) { - if (!string.IsNullOrEmpty(url) && Uri.IsWellFormedUriString(url, UriKind.Relative)) - { - Uri uri = new Uri(baseUri, url); + var uri = new Uri(baseUri, url); - if (uri.IsAbsoluteUri) - { - url = uri.AbsoluteUri; - } + if (uri.IsAbsoluteUri) + { + url = uri.AbsoluteUri; } - - return url; } + + return url; } +} +/// +/// Mandatory class to fetch the XML values related to Mandatory field. +/// +public class Mandatory +{ /// - /// Mandatory class to fetch the XML values related to Mandatory field. + /// Value of the Mandatory field. /// - public class Mandatory - { - /// - /// Value of the Mandatory field. - /// - [XmlText] - public bool Value { get; set; } - - /// - /// If this is set and 'Value' property is set to true then it will trigger the mandatory update only when current installed version is less than value of this property. - /// - [XmlAttribute("minVersion")] - public string MinimumVersion { get; set; } - - /// - /// Mode that should be used for this update. - /// - [XmlAttribute("mode")] - public Mode UpdateMode { get; set; } - } + [XmlText] + public bool Value { get; set; } /// - /// Checksum class to fetch the XML values for checksum. + /// If this is set and 'Value' property is set to true then it will trigger the mandatory update only when current + /// installed version is less than value of this property. /// - public class CheckSum - { - /// - /// Hash of the file. - /// - [XmlText] - public string Value { get; set; } - - /// - /// Hash algorithm that generated the hash. - /// - [XmlAttribute("algorithm")] - public string HashingAlgorithm { get; set; } - } + [XmlAttribute("minVersion")] + public string MinimumVersion { get; set; } + + /// + /// Mode that should be used for this update. + /// + [XmlAttribute("mode")] + public Mode UpdateMode { get; set; } +} + +/// +/// Checksum class to fetch the XML values for checksum. +/// +public class CheckSum +{ + /// + /// Hash of the file. + /// + [XmlText] + public string Value { get; set; } + + /// + /// Hash algorithm that generated the hash. + /// + [XmlAttribute("algorithm")] + public string HashingAlgorithm { get; set; } } \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 645c77bc..1fa09e16 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -1,54 +1,56 @@  - - Autoupdater.NET.Official - 1.8.0.0 - AutoUpdater.NET - rbsoft - false - MIT - https://licenses.nuget.org/MIT - https://github.com/ravibpatel/AutoUpdater.NET - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. - https://github.com/ravibpatel/AutoUpdater.NET/releases - Copyright © 2012-2023 RBSoft - autoupdate updater c# vb wpf winforms - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + Autoupdater.NET.Official + 1.8.1.0 + AutoUpdater.NET + rbsoft + false + MIT + https://licenses.nuget.org/MIT + https://github.com/ravibpatel/AutoUpdater.NET + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update + functionality to their WinForms or WPF application projects. + + https://github.com/ravibpatel/AutoUpdater.NET/releases + Copyright © 2012-2023 RBSoft + autoupdate updater c# vb wpf winforms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AutoUpdaterTest/AutoUpdaterTest.csproj b/AutoUpdaterTest/AutoUpdaterTest.csproj index 10ee336b..3b2ad8f8 100644 --- a/AutoUpdaterTest/AutoUpdaterTest.csproj +++ b/AutoUpdaterTest/AutoUpdaterTest.csproj @@ -1,101 +1,101 @@  - - Debug - x86 - 8.0.30703 - 2.0 - {FD5AE762-C630-49F8-B814-FCF70E7838D1} - WinExe - Properties - AutoUpdaterTest - AutoUpdaterTest - v4.6.2 - 512 - - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - false - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - false - - - app.manifest - - - - - ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - Form - - - FormMain.cs - - - - - FormMain.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {fb9e7e6b-b19f-4f37-a708-2996190cef13} - AutoUpdater.NET - - - - + + Debug + x86 + 8.0.30703 + 2.0 + {FD5AE762-C630-49F8-B814-FCF70E7838D1} + WinExe + Properties + AutoUpdaterTest + AutoUpdaterTest + v4.6.2 + 512 + + + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + prompt + MinimumRecommendedRules.ruleset + false + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + prompt + MinimumRecommendedRules.ruleset + false + + + app.manifest + + + + + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + Form + + + FormMain.cs + + + + + FormMain.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {fb9e7e6b-b19f-4f37-a708-2996190cef13} + AutoUpdater.NET + + + + \ No newline at end of file diff --git a/AutoUpdaterTest/FormMain.cs b/AutoUpdaterTest/FormMain.cs index 5c880850..d241b4bc 100644 --- a/AutoUpdaterTest/FormMain.cs +++ b/AutoUpdaterTest/FormMain.cs @@ -1,16 +1,12 @@ using System; using System.Globalization; -using System.IO; using System.Net; using System.Reflection; using System.Threading; -using System.Threading.Tasks; -using System.Timers; using System.Windows.Forms; using AutoUpdaterDotNET; using AutoUpdaterTest.Properties; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; namespace AutoUpdaterTest { @@ -35,7 +31,8 @@ private void FormMain_Load(object sender, EventArgs e) //Uncomment below line to see russian version - Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("hi"); + Thread.CurrentThread.CurrentCulture = + Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("hi"); //If you want to open download page when user click on download button uncomment below line. diff --git a/AutoUpdaterTest/FormMain.resx b/AutoUpdaterTest/FormMain.resx index 29dcb1b3..fee1f77c 100644 --- a/AutoUpdaterTest/FormMain.resx +++ b/AutoUpdaterTest/FormMain.resx @@ -1,120 +1,126 @@  - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AutoUpdaterTest/Program.cs b/AutoUpdaterTest/Program.cs index 3dc810a3..41649bb5 100644 --- a/AutoUpdaterTest/Program.cs +++ b/AutoUpdaterTest/Program.cs @@ -3,17 +3,17 @@ namespace AutoUpdaterTest { - static class Program + internal static class Program { /// - /// The main entry point for the application. + /// The main entry point for the application. /// [STAThread] - static void Main() + private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } } -} +} \ No newline at end of file diff --git a/AutoUpdaterTest/Properties/AssemblyInfo.cs b/AutoUpdaterTest/Properties/AssemblyInfo.cs index 9db0a84e..3926c13a 100644 --- a/AutoUpdaterTest/Properties/AssemblyInfo.cs +++ b/AutoUpdaterTest/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ using System.Reflection; -using System.Runtime.InteropServices; using System.Resources; +using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information @@ -34,4 +34,4 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: NeutralResourcesLanguageAttribute("en")] +[assembly: NeutralResourcesLanguageAttribute("en")] \ No newline at end of file diff --git a/AutoUpdaterTest/Properties/Resources.Designer.cs b/AutoUpdaterTest/Properties/Resources.Designer.cs index ed821b11..6b0ff199 100644 --- a/AutoUpdaterTest/Properties/Resources.Designer.cs +++ b/AutoUpdaterTest/Properties/Resources.Designer.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/AutoUpdaterTest/Properties/Resources.resx b/AutoUpdaterTest/Properties/Resources.resx index a434b939..3181e0a4 100644 --- a/AutoUpdaterTest/Properties/Resources.resx +++ b/AutoUpdaterTest/Properties/Resources.resx @@ -1,120 +1,126 @@  - - - - - - + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + Current version : {0} \ No newline at end of file diff --git a/AutoUpdaterTest/Properties/Settings.Designer.cs b/AutoUpdaterTest/Properties/Settings.Designer.cs index 1022ebfd..5c428b40 100644 --- a/AutoUpdaterTest/Properties/Settings.Designer.cs +++ b/AutoUpdaterTest/Properties/Settings.Designer.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -12,7 +11,7 @@ namespace AutoUpdaterTest.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/AutoUpdaterTest/Properties/Settings.settings b/AutoUpdaterTest/Properties/Settings.settings index abf36c5d..22837372 100644 --- a/AutoUpdaterTest/Properties/Settings.settings +++ b/AutoUpdaterTest/Properties/Settings.settings @@ -1,7 +1,7 @@  - - - - + + + + diff --git a/AutoUpdaterTest/app.config b/AutoUpdaterTest/app.config index 2a0024f7..032d5eac 100644 --- a/AutoUpdaterTest/app.config +++ b/AutoUpdaterTest/app.config @@ -1,3 +1,6 @@ - + + + + \ No newline at end of file diff --git a/AutoUpdaterTest/app.manifest b/AutoUpdaterTest/app.manifest index 6c647ae8..5beb6acb 100644 --- a/AutoUpdaterTest/app.manifest +++ b/AutoUpdaterTest/app.manifest @@ -1,75 +1,75 @@  - - - - - + + + + - - - + + + - Specifying requestedExecutionLevel element will disable file and registry virtualization. - Remove this element if your application requires this virtualization for backwards - compatibility. - --> - - - - + + - - - + + - - + + - - + + - - + + - - + + - - + + + + true + - - - - - - true - - - - - + + diff --git a/AutoUpdaterTest/packages.config b/AutoUpdaterTest/packages.config index ea29129e..f80feaa3 100644 --- a/AutoUpdaterTest/packages.config +++ b/AutoUpdaterTest/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/AutoUpdaterTestWPF/App.xaml b/AutoUpdaterTestWPF/App.xaml index aaf708fc..6af2a888 100644 --- a/AutoUpdaterTestWPF/App.xaml +++ b/AutoUpdaterTestWPF/App.xaml @@ -1,9 +1,8 @@  - + - + \ No newline at end of file diff --git a/AutoUpdaterTestWPF/App.xaml.cs b/AutoUpdaterTestWPF/App.xaml.cs index c29c8d56..37e395c3 100644 --- a/AutoUpdaterTestWPF/App.xaml.cs +++ b/AutoUpdaterTestWPF/App.xaml.cs @@ -1,16 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Windows; +using System.Windows; namespace AutoUpdaterTestWPF { /// - /// Interaction logic for App.xaml + /// Interaction logic for App.xaml /// public partial class App : Application { } -} +} \ No newline at end of file diff --git a/AutoUpdaterTestWPF/AutoUpdaterTestWPF.csproj b/AutoUpdaterTestWPF/AutoUpdaterTestWPF.csproj index 81a716cf..c1fe3052 100644 --- a/AutoUpdaterTestWPF/AutoUpdaterTestWPF.csproj +++ b/AutoUpdaterTestWPF/AutoUpdaterTestWPF.csproj @@ -1,102 +1,102 @@  - - - Debug - AnyCPU - {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3} - WinExe - AutoUpdaterTestWPF - AutoUpdaterTestWPF - v4.6.2 - 512 - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 4 - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - 4.0 - - - - - - - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - - - App.xaml - Code - - - MainWindow.xaml - Code - - - - - Code - - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - {fb9e7e6b-b19f-4f37-a708-2996190cef13} - AutoUpdater.NET - - - + + + Debug + AnyCPU + {9AEE4F21-5ED5-4C7E-9249-8A680123B5E3} + WinExe + AutoUpdaterTestWPF + AutoUpdaterTestWPF + v4.6.2 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + MainWindow.xaml + Code + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + {fb9e7e6b-b19f-4f37-a708-2996190cef13} + AutoUpdater.NET + + + \ No newline at end of file diff --git a/AutoUpdaterTestWPF/MainWindow.xaml b/AutoUpdaterTestWPF/MainWindow.xaml index 1bb9a965..4cacc66d 100644 --- a/AutoUpdaterTestWPF/MainWindow.xaml +++ b/AutoUpdaterTestWPF/MainWindow.xaml @@ -3,16 +3,17 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:local="clr-namespace:AutoUpdaterTestWPF" mc:Ignorable="d" Title="AutoUpdaterTestWPF" Height="111.048" Width="195.822" ResizeMode="NoResize"> - - + + - public static event ParseUpdateInfoHandler ParseUpdateInfoEvent; + /// + /// Set the owner for all dialogs. + /// + /// WPF Window or Windows Form object to be used as owner for all dialogs. + public static void SetOwner(object obj) + { + _owner = obj switch + { + Form form => form, + Window window => new Wpf32Window(window), + _ => _owner + }; + } + /// /// Start checking for new version of application and display a dialog to the user if update is available. /// @@ -503,7 +522,8 @@ private static bool StartUpdate(object result) if (ReportErrors) { - MessageBox.Show(Resources.UpdateUnavailableMessage, + MessageBox.Show(_owner, + Resources.UpdateUnavailableMessage, Resources.UpdateUnavailableCaption, MessageBoxButtons.OK, MessageBoxIcon.Information); } @@ -525,15 +545,17 @@ private static void ShowError(Exception exception) { if (exception is WebException) { - MessageBox.Show( + MessageBox.Show(_owner, Resources.UpdateCheckFailedMessage, - Resources.UpdateCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error); + Resources.UpdateCheckFailedCaption, + MessageBoxButtons.OK, MessageBoxIcon.Error); } else { - MessageBox.Show(exception.Message, - exception.GetType().ToString(), MessageBoxButtons.OK, - MessageBoxIcon.Error); + MessageBox.Show(_owner, + exception.Message, + exception.GetType().ToString(), + MessageBoxButtons.OK, MessageBoxIcon.Error); } } } @@ -662,7 +684,7 @@ public static bool DownloadUpdate(UpdateInfoEventArgs args) try { - return downloadDialog.ShowDialog().Equals(DialogResult.OK); + return downloadDialog.ShowDialog(_owner).Equals(DialogResult.OK); } catch (TargetInvocationException) { @@ -684,7 +706,7 @@ public static void ShowUpdateForm(UpdateInfoEventArgs args) updateForm.Size = UpdateFormSize.Value; } - if (updateForm.ShowDialog().Equals(DialogResult.OK)) + if (updateForm.ShowDialog(_owner).Equals(DialogResult.OK)) { Exit(); } diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 15977cd6..d5fc7735 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -260,7 +260,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent } catch (Exception e) { - MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(this, e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); _webClient = null; } finally diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index fae6e0ac..2fed23f7 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -96,7 +96,7 @@ private void WebView_CoreWebView2InitializationCompleted(object sender, { if (AutoUpdater.ReportErrors) { - MessageBox.Show(e.InitializationException.Message, e.InitializationException.GetType().ToString(), + MessageBox.Show(this, e.InitializationException.Message, e.InitializationException.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -194,7 +194,7 @@ private void ButtonRemindLaterClick(object sender, EventArgs e) if (AutoUpdater.LetUserSelectRemindLater) { using var remindLaterForm = new RemindLaterForm(); - DialogResult dialogResult = remindLaterForm.ShowDialog(); + DialogResult dialogResult = remindLaterForm.ShowDialog(this); switch (dialogResult) { diff --git a/AutoUpdater.NET/Wpf32Window.cs b/AutoUpdater.NET/Wpf32Window.cs new file mode 100644 index 00000000..ee0535f8 --- /dev/null +++ b/AutoUpdater.NET/Wpf32Window.cs @@ -0,0 +1,16 @@ +using System; +using System.Windows; +using System.Windows.Interop; +using IWin32Window = System.Windows.Forms.IWin32Window; + +namespace AutoUpdaterDotNET; + +internal class Wpf32Window : IWin32Window +{ + public Wpf32Window(Window wpfWindow) + { + Handle = new WindowInteropHelper(wpfWindow).EnsureHandle(); + } + + public IntPtr Handle { get; } +} \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 1fa09e16..263dc17f 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.1.0 + 1.8.2.0 AutoUpdater.NET rbsoft false @@ -17,16 +17,16 @@ autoupdate updater c# vb wpf winforms - + - + - + - + diff --git a/AutoUpdaterTest/AutoUpdaterTest.csproj b/AutoUpdaterTest/AutoUpdaterTest.csproj index 9c505a51..d5b76dea 100644 --- a/AutoUpdaterTest/AutoUpdaterTest.csproj +++ b/AutoUpdaterTest/AutoUpdaterTest.csproj @@ -10,11 +10,11 @@ - + - + diff --git a/AutoUpdaterTest/MainWindow.xaml b/AutoUpdaterTest/MainWindow.xaml index 474f4e27..4bd223d2 100644 --- a/AutoUpdaterTest/MainWindow.xaml +++ b/AutoUpdaterTest/MainWindow.xaml @@ -4,6 +4,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" + Topmost="True" Title="MainWindow" Height="200" Width="400" ResizeMode="NoResize"> diff --git a/AutoUpdaterTest/MainWindow.xaml.cs b/AutoUpdaterTest/MainWindow.xaml.cs index 15791f30..b247ed5d 100644 --- a/AutoUpdaterTest/MainWindow.xaml.cs +++ b/AutoUpdaterTest/MainWindow.xaml.cs @@ -191,6 +191,9 @@ private void ButtonCheckForUpdate_Click(object sender, RoutedEventArgs e) // Uncomment following line if you want to execute different executable after the update. This only works when you use zip file as an update file. AutoUpdater.ExecutablePath = "bin/AutoUpdaterTest.exe"; + // Uncomment following line to set this window as owner of the all dialogs initiated by AutoUpdater. It is necessary to do this if TopMost is set to true in your form or window. + AutoUpdater.SetOwner(this); + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } } \ No newline at end of file diff --git a/README.md b/README.md index e98646a4..33c941f9 100644 --- a/README.md +++ b/README.md @@ -325,6 +325,16 @@ You can specify the size of the update form by using below code. AutoUpdater.UpdateFormSize = new System.Drawing.Size(800, 600); ```` +### Set the owner Form / Window + +To ensure the dialogs showed by the auto updater are visible and always focussed correctly related to an application +Form or Window, it may be necessary to set an owner. You can assign a Form or WPF Window as the owner by following the +example below. + +````csharp +AutoUpdater.SetOwner(yourMainFormOrWpfWindow); +```` + ### Change storage method of Remind Later and Skip options You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 091aee83..8f916527 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -225,7 +225,7 @@ private void FormMain_Shown(object sender, EventArgs e) foreach (Process lockingProcess in lockingProcesses) { - DialogResult dialogResult = MessageBox.Show( + DialogResult dialogResult = MessageBox.Show(this, string.Format(Resources.FileStillInUseMessage, lockingProcess.ProcessName, filePath), Resources.FileStillInUseCaption, @@ -306,7 +306,7 @@ private void FormMain_Shown(object sender, EventArgs e) _logBuilder.AppendLine(); _logBuilder.AppendLine(exception.ToString()); - MessageBox.Show(exception.Message, exception.GetType().ToString(), + MessageBox.Show(this, exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); } finally diff --git a/appveyor.yml b/appveyor.yml index 1ab2defe..9a9e3836 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.1.{build} +version: 1.8.2.{build} environment: - my_version: 1.8.1 + my_version: 1.8.2 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From b872af7402bb9ecd723b61c5349331783859da1a Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sat, 10 Jun 2023 14:50:26 +0530 Subject: [PATCH 70/93] Fixed an issue that was causing ClearAppDirectory to not work. This fixes #623. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++++---- AutoUpdater.NET/DownloadUpdateDialog.cs | 2 +- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 10 +++++----- appveyor.yml | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 8b58a030..580797e4 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,9 +11,9 @@ RBSoft AutoUpdater.NET Copyright © 2012-2023 RBSoft - 1.8.1.0 - 1.8.1.0 - 1.8.1.0 + 1.8.3.0 + 1.8.3.0 + 1.8.3.0 true AutoUpdater.NET.snk en @@ -51,6 +51,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index d5fc7735..79bc6fc8 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -204,7 +204,7 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent if (AutoUpdater.ClearAppDirectory) { - arguments.Add(" --clear"); + arguments.Add("--clear"); } string[] args = Environment.GetCommandLineArgs(); diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 263dc17f..6aa4944b 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.2.0 + 1.8.3.0 AutoUpdater.NET rbsoft false @@ -17,16 +17,16 @@ autoupdate updater c# vb wpf winforms - + - + - + - + diff --git a/appveyor.yml b/appveyor.yml index 9a9e3836..b9ab01a4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.2.{build} +version: 1.8.3.{build} environment: - my_version: 1.8.2 + my_version: 1.8.3 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 35f46acbdca3c5a78869ec69fde9ec5dca3cbb22 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Mon, 12 Jun 2023 14:53:41 +0530 Subject: [PATCH 71/93] Updated appveyor.yml. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index b9ab01a4..ae1b144c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,7 +43,7 @@ deploy: - provider: NuGet api_key: - secure: EA3GtBMLgZneFXYFhyTQ+8ppC0bvjJl3CwE9sQ31gLQUI/4cpETFgPt6ql7uYD9/ + secure: niHgnyEf7tXImWdR3VEJ38p/3gaV7OiSijx0YUmycHTkh12id6zMKkTS+S2XjF2J skip_symbols: false artifact: Autoupdater.NET.Official.%my_version%.nupkg on: From 84fe92b684ee8a66cd49598062a1f30929c37c11 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 12 Jul 2023 13:19:11 +0530 Subject: [PATCH 72/93] Added ability to set TopMost property of all updater dialogs. This resolves #584. (#631) --- AutoUpdater.NET/AutoUpdater.NET.csproj | 10 +++++----- AutoUpdater.NET/AutoUpdater.cs | 5 +++++ AutoUpdater.NET/DownloadUpdateDialog.cs | 1 + AutoUpdater.NET/RemindLaterForm.cs | 1 + AutoUpdater.NET/UpdateForm.cs | 1 + AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- AutoUpdaterTest/MainWindow.xaml.cs | 5 ++++- README.md | 8 ++++++++ ZipExtractor/ZipExtractor.csproj | 2 +- appveyor.yml | 6 ++++-- 10 files changed, 31 insertions(+), 10 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 580797e4..41c1d175 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -3,7 +3,7 @@ {FB9E7E6B-B19F-4F37-A708-2996190CEF13} library - net45;netcoreapp3.1;net5.0-windows;net6.0-windows + net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows true true AutoUpdaterDotNET @@ -11,16 +11,16 @@ RBSoft AutoUpdater.NET Copyright © 2012-2023 RBSoft - 1.8.3.0 - 1.8.3.0 - 1.8.3.0 + 1.8.4.0 + 1.8.4.0 + 1.8.4.0 + 1.8.4.0 true AutoUpdater.NET.snk en Autoupdater.NET.Official true MIT - 1.8.1.0 AutoUpdater.NET rbsoft AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 3077f830..50c57bc5 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -228,6 +228,11 @@ public static class AutoUpdater /// public static Size? UpdateFormSize = null; + /// + /// Set this to modify TopMost property of all dialogs. + /// + public static bool TopMost = false; + /// /// Set this to any of the available modes to change behaviour of the Mandatory flag. /// diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 79bc6fc8..5ec41c40 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -26,6 +26,7 @@ internal partial class DownloadUpdateDialog : Form public DownloadUpdateDialog(UpdateInfoEventArgs args) { InitializeComponent(); + TopMost = AutoUpdater.TopMost; _args = args; diff --git a/AutoUpdater.NET/RemindLaterForm.cs b/AutoUpdater.NET/RemindLaterForm.cs index 49f598a8..c96a30d1 100644 --- a/AutoUpdater.NET/RemindLaterForm.cs +++ b/AutoUpdater.NET/RemindLaterForm.cs @@ -8,6 +8,7 @@ internal partial class RemindLaterForm : Form public RemindLaterForm() { InitializeComponent(); + TopMost = AutoUpdater.TopMost; } public RemindLaterFormat RemindLaterFormat { get; private set; } diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 2fed23f7..1d0bdc77 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -20,6 +20,7 @@ public UpdateForm(UpdateInfoEventArgs args) _args = args; InitializeComponent(); InitializeBrowserControl(); + TopMost = AutoUpdater.TopMost; buttonSkip.Visible = AutoUpdater.ShowSkipButton; buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton; var resources = new ComponentResourceManager(typeof(UpdateForm)); diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 6aa4944b..3a2752b8 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.3.0 + 1.8.4.0 AutoUpdater.NET rbsoft false diff --git a/AutoUpdaterTest/MainWindow.xaml.cs b/AutoUpdaterTest/MainWindow.xaml.cs index b247ed5d..a8bac535 100644 --- a/AutoUpdaterTest/MainWindow.xaml.cs +++ b/AutoUpdaterTest/MainWindow.xaml.cs @@ -191,8 +191,11 @@ private void ButtonCheckForUpdate_Click(object sender, RoutedEventArgs e) // Uncomment following line if you want to execute different executable after the update. This only works when you use zip file as an update file. AutoUpdater.ExecutablePath = "bin/AutoUpdaterTest.exe"; - // Uncomment following line to set this window as owner of the all dialogs initiated by AutoUpdater. It is necessary to do this if TopMost is set to true in your form or window. + // Uncomment following line to set this window as owner of the all dialogs initiated by AutoUpdater. AutoUpdater.SetOwner(this); + + // Uncomment following line to set TopMost to true for all updater dialogs. It is necessary to do this if TopMost is set to true in your form or window. + AutoUpdater.TopMost = true; AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } diff --git a/README.md b/README.md index 33c941f9..700d6191 100644 --- a/README.md +++ b/README.md @@ -335,6 +335,14 @@ example below. AutoUpdater.SetOwner(yourMainFormOrWpfWindow); ```` +### Set the TopMost property of all updater dialogs + +To ensure that the dialogs displayed by the auto updater are always on top, you can set the "TopMost" to true, as demonstrated in the code snippet below. + +````csharp +AutoUpdater.TopMost = true; +```` + ### Change storage method of Remind Later and Skip options You can change how AutoUpdater.NET saves the Remind Later and Skip values by assigning the PersistenceProvider. If you diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 1a3938e4..60ce8338 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,7 +3,7 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net45;netcoreapp3.1;net5.0-windows;net6.0-windows + net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows true ZipExtractor RBSoft diff --git a/appveyor.yml b/appveyor.yml index ae1b144c..a9ea6293 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.3.{build} +version: 1.8.4.{build} environment: - my_version: 1.8.3 + my_version: 1.8.4 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true @@ -20,6 +20,8 @@ install: - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" + - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" + - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net7.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" From 7b24dc703b9d5399680289a494d83cfc8d728cb4 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 13 Aug 2023 11:09:52 +0530 Subject: [PATCH 73/93] Added ability to change icon shown on the Updater dialog. This resolves #533. (#634) --- AutoUpdater.NET/AutoUpdater.cs | 14 ++- AutoUpdater.NET/DownloadUpdateDialog.cs | 6 ++ AutoUpdater.NET/Resources/clock_go1.png | Bin 2585 -> 0 bytes AutoUpdater.NET/Resources/download1.png | Bin 1128 -> 0 bytes AutoUpdater.NET/UpdateForm.cs | 7 ++ AutoUpdaterTest/AutoUpdaterTest.csproj | 19 ++++ AutoUpdaterTest/MainWindow.xaml | 2 +- AutoUpdaterTest/MainWindow.xaml.cs | 5 +- AutoUpdaterTest/Resource.Designer.cs | 72 +++++++++++++ AutoUpdaterTest/Resource.resx | 133 ++++++++++++++++++++++++ AutoUpdaterTest/Resources/icon.png | Bin 0 -> 3287 bytes README.md | 12 ++- 12 files changed, 263 insertions(+), 7 deletions(-) delete mode 100644 AutoUpdater.NET/Resources/clock_go1.png delete mode 100644 AutoUpdater.NET/Resources/download1.png create mode 100644 AutoUpdaterTest/Resource.Designer.cs create mode 100644 AutoUpdaterTest/Resource.resx create mode 100644 AutoUpdaterTest/Resources/icon.png diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 50c57bc5..c620353f 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using System.Diagnostics; +using System.Drawing; using System.Globalization; using System.IO; using System.Net; @@ -149,6 +150,11 @@ public static class AutoUpdater /// public static string HttpUserAgent; + /// + /// Set this to change the icon shown on updater dialog. + /// + public static Bitmap Icon; + /// /// If you are using a zip file as an update file then you can set this value to path where your app is installed. This /// is only necessary when your installation directory differs from your executable path. @@ -224,14 +230,14 @@ public static class AutoUpdater public static bool Synchronous = false; /// - /// Set if you want the default update form to have a different size. + /// Modify TopMost property of all dialogs. /// - public static Size? UpdateFormSize = null; + public static bool TopMost = false; /// - /// Set this to modify TopMost property of all dialogs. + /// Set this if you want the default update form to have a different size. /// - public static bool TopMost = false; + public static Size? UpdateFormSize = null; /// /// Set this to any of the available modes to change behaviour of the Mandatory flag. diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 5ec41c40..2507b2fc 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -2,6 +2,7 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; +using System.Drawing; using System.Globalization; using System.IO; using System.Linq; @@ -28,6 +29,11 @@ public DownloadUpdateDialog(UpdateInfoEventArgs args) InitializeComponent(); TopMost = AutoUpdater.TopMost; + if (AutoUpdater.Icon != null) + { + Icon = Icon.FromHandle(AutoUpdater.Icon.GetHicon()); + } + _args = args; if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload) diff --git a/AutoUpdater.NET/Resources/clock_go1.png b/AutoUpdater.NET/Resources/clock_go1.png deleted file mode 100644 index ae4c9d97a3c7c6dcc433154106f5f1c6db67ad33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmV+!3g-2RP)KtjX|P!uT<*oDAKBp^{lL_Er)1Ql1;(xOyqt@YR~MPLOv)}ZBqT#^JOKJOi{svhn1%_ch2U>mMC;JqXtfPCq`(Y7fYT7z=WBic*(`@~E zL)c_8hqxQ-(SG9S7n5GQ`?>VgtVIygRAR|6K;MiAw=hK*H8AvT7aGsLzVo$B@3?bs zya%bhNu7WZ(h#byN84%7mnnB`o7vqN=9Vfx%6qh5cJB}D1N%bg8iddQyM~I>J+b!V zOf+~iF=O&TT$_`Efte1(=r{kItMa4#R1-GuIES+I=1Y+roH6Yo$ z<<4f?fD9-InFkjvn~J{uhGO2mxj0o7#IZAe1W2!8NESd?u9w4{r;X5dMrB{qr_i)GupUci*Clfb9-7d5REi@wVAak$pvRBK{WG#rvZoF09R{3^Ao6bg9yeWc z21z{)#3j1nOiaScPY+=1_>r(XRV4NZAg5my(o-5yb1@BGpM=vMKW0oyM`evbMTH+X zr_1&E95 ze!M$=(pa+iLKxn59WF-zg_FyXkm|BMf{OL%VnG$>9d z+{tk$%qutfSq{r%xh$Xc!~!sCfOgA>=hAwoxQAtDC!?x1jBr@Ol<^+KCzFSyRMT{n zmL0?LRo}tsa!@;vv2ej%gl;l|us{eRJTOU+=sfc=Kg(fxESKf89@f|00HtrQ5etXk zkcR5|Ac6#xjC3Ee28OX@Wg z<<}-Z%VBvem*umbtAQ}?y6ibiMvUwi-_mA7Ck1HYgjOUbc4E}cxe?E(ZQMTQ8eFJv zCL{iV#zrsh7|5Q6iD4q5FYH*lD41Rx@7^!0sr`;u>`BlpR!^D6_zu^EWeR(cb zfWW3LdnsB0EPmwyic-itCz1EE%xMv3W0D<_=cY)3d4qHkdn3#^QJWdi4l)!R%X3`4{G1v9!jCCe9vapmZYhAj{b znFkH?P!LZ&QShq>$TT5khl+RK{Q{e}?!~lex8v1UA4Awr@g>g%4=BO_^F<>7aAYEF zI~WYd4Bze%ATasO2naR-dQgevkwIp_1el^IcyH+zd|i4N`FGxi7himc&iT!hG5T3{ z6fZ(>G{~rc9kSsjA_oI)kn}5;2QEVr5^TKG+{tmE@ENE)PmH8cmK1VMwu(ijk~A>s zH#d>;M`+H6Ol7g9$i(MOKH@)rJ`ttvcpOwS&`{S#vp_Ul&492!(6sMTQwQ{r-!x#~ zJ_0JW+SMO^Wwu;yJQNHpeD)qZ|H2#+6f&Rry)4`4sGTCjM4i&+z}j`C#P7uZy*;2% zWJV0Qj30VVgwGrJw);Y2x+Wl9Ojd`@aVOhhbGUHvqJ-QW1LG#-nyof!tHB}E4D()= z*;_k#>LQAVkeOWc$&HaCN20aPh0+~ys8ko@#VLP4OYj?h|Ole9uEt?(nm)`HXwCwx8y%a<8c zN{Wf{qN1&&Fy90$v)OIjPvWroNEwQs{VTlT?WA1kLb|XF;+;Vl$@o{@=a_usJc?3L zfp{GozF7obb~VK+)Q+QPKiWT}&rPK*HQ9NAa4iN5?vLhXfxo=1VeW$xDW4uWDn(Mj zEtiAGo_B^@aNx{WU3*gOWmdi@0S!@TJekPbVr)R8r1^)a?u`eb0{%*936>oNmEJ!hQD@M6f^-e0p6Zkyjx>ffD>nuF`&r zisnx+D)(A`p32Kmv@IHiWBaI1t;eu;-}@HNJUs!mo+MO;Jm}S@ClYDl@YLv7vpPVf z=a2LTGQ>`0rzY}%uY;^!t<6}%t@`I^=}G{H&y*wR#co7k5~+r5uiUaUAv@znDcOlB z1;^p9)=~ab3W6aY+I(J8N=v6I;Bu?xud0%AD!KDn%;Wv`LQM2+W8c8nkIewg`q>Sy~11~Ahr^lLD<-mUi?*HmaA{t;B vU2AQ{p{xDx`2Tf9+GXVObyv>UzXcco9Ofo**H;_*00000NkvXXu0mjfhlcSe diff --git a/AutoUpdater.NET/Resources/download1.png b/AutoUpdater.NET/Resources/download1.png deleted file mode 100644 index e3e037723656cc2c390198b21856a5fae01dd93d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmV-u1eg1XP)EaZ)V!6n%TFrhS_=V&2}>B>F(;PUswIAdWO9B_^#N%-IrYJ|aURA+ovvh01ID&q-uxIumTDOH3ILd%`Mafhf!oFPG5|wjIEKZS zv)5r*0}W_AWks*#2NAu!0#JL-g?OYn3~OY91_0oZq?w+g-d+GeAiFTYNVA~;25ky} z^`L}HZW;Rs!U)Y~0+YwFZx65zwy%21xa^jpE`p&3MpjWx60)8~1SV3S0NV3+PflKG z#z~y9Y2X|LE?b9n$-n&pSbgpL=J{hEVWrwz?;q|DKpdyq|28+54NOZD~4fxKB`mRPe)rqD653}q#@YtW;UdbDH7eZNS6 zic($)fM^kbbdj?-bpBUN{cuBxP2GwIj6MG-KHmN`?#D^NZcPA2s}SYUAVh&>PHQUxP156MxB>+k?WPS z)gdsp@J`*aWdOrbpax?GVDow{>tuXRz!d->r}4-NnGn+1>}ZY+hGD2=Gz`Gy0A$^1 z=A;@Hs_g+*EFdDs2Kh0e)ypYn)nVw=1H_hOEc1rFvWkh@<~s5qPW3vj=K-4;-+S&V zCcpcWW6vk#W6ify29$+BJRoD4-@1Dm?Zl(CWj*$eZ&DC7Ltt64!580N!>)I>aVR_t zpX%ou571x_2uU4}|GLw`yE|V(%Hx!)-oaCsuz$yMh%2s9)5~QdY4y{Q?Kph;BJRb6 z3%}gK)qmO?fNK>R(+r~RF?*zi6K5{sg(uf!#si1I zIqf4Rq|D2@$cen{ll}EPpw))>G)%NkirI-*@yXe*@XX^Q2!e>8P@z z1;BFr4M|!V{k%%quQNx-aq{dmo>i$d*XEc3E1aw0GLWdA?_e76*nmSCfWpR1mJ zXC;`K*nv+!yMV?}q`iz~Ue{@HkICzXuX7m@`6a;OgqhEUW@h4bjK23d=1%NX<1)`V zvgE3!iY%zU3rb=r1;+T4jlaRD@`6JPcSrU9N&pLb4A*vJD&3^FrdeL3KMpu+v68J! zUzrEICI9=IA0FEfCkg8OpUTO_xafNr7pdg$cr|yU{H*P%R#Z2+5N`4_$Iq>z%`yP| uFNI;;?u2`~Vl`*uzRl8o8_0000 + + + + + + + True + True + Resource.resx + + + + + + ResXFileCodeGenerator + Resource.Designer.cs + + + diff --git a/AutoUpdaterTest/MainWindow.xaml b/AutoUpdaterTest/MainWindow.xaml index 4bd223d2..f4c8e8da 100644 --- a/AutoUpdaterTest/MainWindow.xaml +++ b/AutoUpdaterTest/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Topmost="True" - Title="MainWindow" Height="200" Width="400" ResizeMode="NoResize"> + Title="MainWindow" Height="200" Width="400" ResizeMode="NoResize" Icon="/Resources/icon.png"> diff --git a/AutoUpdaterTest/MainWindow.xaml.cs b/AutoUpdaterTest/MainWindow.xaml.cs index a8bac535..4e3e35ff 100644 --- a/AutoUpdaterTest/MainWindow.xaml.cs +++ b/AutoUpdaterTest/MainWindow.xaml.cs @@ -193,10 +193,13 @@ private void ButtonCheckForUpdate_Click(object sender, RoutedEventArgs e) // Uncomment following line to set this window as owner of the all dialogs initiated by AutoUpdater. AutoUpdater.SetOwner(this); - + // Uncomment following line to set TopMost to true for all updater dialogs. It is necessary to do this if TopMost is set to true in your form or window. AutoUpdater.TopMost = true; + // Uncomment following line to change the Icon shown on the updater dialog. + AutoUpdater.Icon = Resource.Icon; + AutoUpdater.Start("https://rbsoft.org/updates/AutoUpdaterTest.xml"); } } \ No newline at end of file diff --git a/AutoUpdaterTest/Resource.Designer.cs b/AutoUpdaterTest/Resource.Designer.cs new file mode 100644 index 00000000..3b31b77f --- /dev/null +++ b/AutoUpdaterTest/Resource.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AutoUpdaterTest { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resource { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resource() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AutoUpdaterTest.Resource", typeof(Resource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Icon { + get { + object obj = ResourceManager.GetObject("Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/AutoUpdaterTest/Resource.resx b/AutoUpdaterTest/Resource.resx new file mode 100644 index 00000000..bf39e012 --- /dev/null +++ b/AutoUpdaterTest/Resource.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + + Resources\icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + + \ No newline at end of file diff --git a/AutoUpdaterTest/Resources/icon.png b/AutoUpdaterTest/Resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe5971da40f4970fe7849d779f543af682213cb GIT binary patch literal 3287 zcmV;|3@G!7P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T%*C$V}r>00R>fE)!F83o}bIGXo$nu{5zXN(3@2 z3?RS=Od1-PfJrbgfl2}SDB@gj2`JzK08gJ3Ca4c^&Hw-mJxN4CRCwCWTWfGt)fN8M zKIcC2eh^6vc_GNNVtf%0wAE^*rJbUH*0v+s`a)3Z_@K&&#a2)pTVuhYU<+t13PEvH zL~HGcVqy^q3i1jN^SA*6A#d*EoW1(v0s-#cC%L(aWY6r$OwQSN@9$e{ueJ8t>kxXm z4cZ`cZ4nv^pb)@tfbv0{1t1lGC;S%q0d4}(K`<)8yc@t)L%K@$O%T<+xjyRgUu359 zJ_wDoB~JliB7p{Xdlm+muosfo8-hyqU*p;YBJPs}2=e>w>VB@q=xJGLl|@YDq+0AOvc z#G-w6>>44tOoVW2>Ms#>)J+1J7YK8$C)u{&M!_#RW@1 zbnglG6x(8Ziv$3`tUPaU&EWOY(<3$@e>r=(UvM1}uItYJOmP9jk_iJ72wC3n-%+XR zY1h_BEZS@Ll&9F>Hr+u1})P?g|O=jjDims*{IsTwDG+|MMW++ttNim`eC%fq~2ViI@V6 zwbeEj?de$aqa#gRo7J&f8-t7`6*k_hlU?x;#Z}kG{Vr+(^4~aiD?rP;f+Q!7FmtGZ zqJE;sV#{fthEUbc7@SC0HpZoVr>tJ$sjn?Gg`C4_Ddn{4$?-3B*$C#B_=hpmqRtE+ zF)$_9z~9HX!r*(tKr*oTutaS;0}Nz&N&DWI41vFmc41HgIT}VHdST$}{vll>U^N>| zSOFk`8PN4O0X%V`i5Wu-xCMHwZ9XC~r`&=i!}IKFVptBxpG+^I_)-@xNFnW70ZOnK zE5Ix|B_L1urvq>da?)Ic;>%nZe@^GfB?CJe8Lw8_Sg_r~iw;(P^I?fOTP+0bj=Adn zjOV_#5OUb=2`2FL#V(9U)@uR*V{=~j-|c7va$b|^Bmxygl;-5tibuOpkm$VGYug#G ze*k}xLr-9Js!xD48I9>8*_S!ba!=GDt zZiikQQr*D3LK7}%qs4T%{SPU(K+bE8>BM{w95(*_BMpp5)r0@|ki@i&A*`>lVQV)e zM}prHLeO?FIH&Y=RW=^l973C=Ic+8rZad%5j%Ud;^ImC8iy(mDy#qvvItlzROJKqP zL+fgm@3AmiEA`qbG^iz&qI!qSM~BE5)c0`1iyxan+gmJ)OZF0B|*4vKb-(( zf|PgaCQLR7_l+>M3tIfOg_V2l4gov#6JR%g+dc3n`i`R#^UFiZISm5t9%ecT;7%~p zNh6rMs{INAZPcmueIrfWP@tCntNUy$*=0qSMT!rHv~~|<_hyYWalK}3cYhMZt|rYS zHjl6Rb^NBV21rcNv2~7z@UuMi1lx{CEZu2EExnpHhAn$0Xj;0{LcL!Na>_slEg+hF zatknHqR#HzP+-8N@H_zzzbzFQqzTzRfQg4Q1LL;w)yu58aEra>x} zOaMR5Q~TYL{Wg4U+#^zqwZB(oiP8&1GS_DeDdsqRR( z=eL2^_F89G^rv)7GB#AJwVW6GS3k z#g111`AL!LACy3Oz3fxc4@(oMXi{rIjwUE#MuA|7EY-uD1cFdRz5APFw}Y47?zOFI zwan1w6l9hO$*C%&{o~Xze^m?jIrTr$ngXmnF00l|EK*DYJgSFDE;RuS{=Q3qr8y-U zq$U8&UXxjkMuQ($=@+s&g%6$EWoubCMpO9V*38xbl?wWLiQn|+|Adq}yqmVizJ z$ZrDF2u9YK&su}}q(fgNAU8>^w%@j^g~{MXlNbkqNCJ*%(n{HhqE8aw5x}5Sq0C9v zG)wiGB^?sXRHs_XBq7mF z7?LLX906D7s>Am3Lk>Zkq+NofEZ4p8)wgQD^8Fm6Pk~Qy6Ryrz6Yy!Ro&Y9UE-ce1 zg;bxiKJ%${XTm@M6WnJ`gTEMNz+*(N^Qd3qi#pAzRWc9~rK0Yx_$p>ps2JK*EfG|3 zkP%0?ZeZWgf&mGHDMQtnpLZ+laB!qlf9$E9l~5DT2uZnKMN&(U@llofoPFCU7re&V z6}|xQ`>}3#6xtuMfs$R8cB~}4(~%M*l;{{>p3KtI*XWQZxYMBvRDl?z+f@ z3;V0Xzjb>o)VDk2ETkwoNkHAbNuRL9e$|UR4@;EQs38OL%3_nLG({d3B(ZdoCydOZL z-}#ir%rkrsCBNWYB(<82?8??nM9|g&kIEES_#+Pz+~i2YjjtUGyQ1UZ=U?MNQBIeO zIJ?v~R@(T}M*$q`{Ccvqwl#4)=8<%+5xS9VuxlDiwCT3ewu2Hg-VWektDbRF07Emx z$$+J&!3Qj$xHO149|X`I>cs5W+{PqtJrlf|006$(-rZoD0f!6BiX#%gecg{u-{@<8 ze9htgn3F7e6#S=EHm0pThBe!*&adPpKqRL79!%Mz%opk=Y58FOwxnww=?Cab;sX}& z!9E+lX2$oj1maFfByQMa;mzYwWRstfQ{-aixX# z_uBBa$Y@!6!?!hgD%NzfR2Bg8A3xv?x%;g{H;bha1qoYyHug72)U_}UG)U~Mm*I%6 zdn&UbJ~3%h#jIG0rB5ZnmA(o@lX{GVQIRA(_>LcC)jd!xF8Pi4)Hhlp} zi$O?;MM%Y;1OW!7Ug(Mh-#wLYBjBFexv4KjGc0Pe?0YO_CBT=kL|M$5@JSG>w}oPs zK1*2!6BpOcO?fF=Jl*n3zPTy8>$WG2hoqUzXow}N^Zds_{OgMl+JlUSc8+emL<1Nz z>SW3|-=k_j-&u?O!^y`R(=DQhh%p0%r0?Vwgweu;#cmHTJoRLERtPxJ@)k6vh5X_U zF!%1Kvm}?g0<^5^snovl>8!#S(Yb#(I*wUP24f^vh6ast0ILS{yBNGmRxe`RXn7Q0wyVUn&zh3=({{OB} V#2sXn$D;rM002ovPDHLkV1oJ_By<1( literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 700d6191..3d4f7916 100644 --- a/README.md +++ b/README.md @@ -325,6 +325,15 @@ You can specify the size of the update form by using below code. AutoUpdater.UpdateFormSize = new System.Drawing.Size(800, 600); ```` +### Change Icon of the UpdateForm + +You can change the icon of the update form by using below code. It assumes that you have an image resource named Icon in +your project. Size of icon file should be 64x64. + +````csharp +AutoUpdater.Icon = Resources.Icon; +```` + ### Set the owner Form / Window To ensure the dialogs showed by the auto updater are visible and always focussed correctly related to an application @@ -337,7 +346,8 @@ AutoUpdater.SetOwner(yourMainFormOrWpfWindow); ### Set the TopMost property of all updater dialogs -To ensure that the dialogs displayed by the auto updater are always on top, you can set the "TopMost" to true, as demonstrated in the code snippet below. +To ensure that the dialogs displayed by the auto updater are always on top, you can set the "TopMost" to true, as +demonstrated in the code snippet below. ````csharp AutoUpdater.TopMost = true; From dbc59d06b687db499cfdcd2666b3172aba206e6b Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 8 Nov 2023 15:09:10 +0530 Subject: [PATCH 74/93] ZipExtractor binary compiled using .NET Framework was bundled with all version of .NET Core libraries. Fixed the build process to remedy this issue. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 10 +++++----- .../build/Autoupdater.NET.Official.nuspec | 16 +++++++++++----- AutoUpdaterTest/AutoUpdaterTest.csproj | 5 ++++- README.md | 2 +- appveyor.yml | 12 ++++++------ 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 41c1d175..dafd8f24 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,10 +11,10 @@ RBSoft AutoUpdater.NET Copyright © 2012-2023 RBSoft - 1.8.4.0 - 1.8.4.0 - 1.8.4.0 - 1.8.4.0 + 1.8.5.0 + 1.8.5.0 + 1.8.5.0 + 1.8.5.0 true AutoUpdater.NET.snk en @@ -51,6 +51,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 3a2752b8..af46f11a 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.4.0 + 1.8.5.0 AutoUpdater.NET rbsoft false @@ -17,16 +17,19 @@ autoupdate updater c# vb wpf winforms - + - + - + - + + + + @@ -39,6 +42,9 @@ + + + diff --git a/AutoUpdaterTest/AutoUpdaterTest.csproj b/AutoUpdaterTest/AutoUpdaterTest.csproj index 7cef3fa1..5510d1fc 100644 --- a/AutoUpdaterTest/AutoUpdaterTest.csproj +++ b/AutoUpdaterTest/AutoUpdaterTest.csproj @@ -2,7 +2,7 @@ WinExe - net45 + net7.0-windows enable true latest @@ -36,4 +36,7 @@ + + + diff --git a/README.md b/README.md index 3d4f7916..a0a800c5 100644 --- a/README.md +++ b/README.md @@ -574,7 +574,7 @@ You can follow below steps to build the project on your local development enviro net5.0-windows ``` -* Build ZipExtractor project in "Release" configuration to create the executable in Resources folder. +* Build ZipExtractor project in "Release" configuration to create the executable in Resources folder. While compiling it for .NET Core 3.1 or above, you have to use publish command instead of build as shown [here](https://learn.microsoft.com/en-us/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-7-0) and copy the resulting executable to "AutoUpdater.NET/Resources" folder. * VS2022 doesn't allow building .NET Framework 4.5 by default, so if you are using it then you can just change it to any supported .NET version, or you have to follow steps from [here](https://stackoverflow.com/a/70109092/1273550) to use .NET Framework 4.5. diff --git a/appveyor.yml b/appveyor.yml index a9ea6293..416f6536 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.4.{build} +version: 1.8.5.{build} environment: - my_version: 1.8.4 + my_version: 1.8.5 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true @@ -14,13 +14,13 @@ install: - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" + - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" + - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" - - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" + - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" - - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\Resources" + - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net7.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse From 060eb7bd90453fbb5921b0e42f545d351d8ae14a Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 7 Feb 2024 13:19:53 +0530 Subject: [PATCH 75/93] Added support for .NET 8.0. This resolves #660. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 6 +++--- AutoUpdater.NET/AutoUpdater.cs | 3 ++- AutoUpdater.NET/UpdateForm.cs | 2 +- .../build/Autoupdater.NET.Official.nuspec | 18 ++++++++++++------ AutoUpdaterTest/AutoUpdaterTest.csproj | 2 +- ZipExtractor/ZipExtractor.csproj | 4 ++-- appveyor.yml | 2 ++ 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index dafd8f24..7f9429b8 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -3,14 +3,14 @@ {FB9E7E6B-B19F-4F37-A708-2996190CEF13} library - net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows + net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows true true AutoUpdaterDotNET AutoUpdater.NET RBSoft AutoUpdater.NET - Copyright © 2012-2023 RBSoft + Copyright © 2012-2024 RBSoft 1.8.5.0 1.8.5.0 1.8.5.0 @@ -51,6 +51,6 @@ - + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index c620353f..030e45e5 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -17,6 +17,7 @@ using MessageBox = System.Windows.Forms.MessageBox; using Size = System.Drawing.Size; using Timer = System.Timers.Timer; +using WinFormsMethodInvoker = System.Windows.Forms.MethodInvoker; namespace AutoUpdaterDotNET; @@ -620,7 +621,7 @@ internal static void Exit() { if (_isWinFormsApplication) { - MethodInvoker methodInvoker = Application.Exit; + WinFormsMethodInvoker methodInvoker = Application.Exit; methodInvoker.Invoke(); } else if (System.Windows.Application.Current != null) diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 7da349f5..345b9a71 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -60,7 +60,7 @@ private async void InitializeBrowserControl() var webView2RuntimeFound = false; try { - string availableBrowserVersion = CoreWebView2Environment.GetAvailableBrowserVersionString(); + string availableBrowserVersion = CoreWebView2Environment.GetAvailableBrowserVersionString(null); var requiredMinBrowserVersion = "86.0.616.0"; if (!string.IsNullOrEmpty(availableBrowserVersion) && CoreWebView2Environment.CompareBrowserVersions(availableBrowserVersion, diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index af46f11a..074ea6d1 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -13,23 +13,26 @@ functionality to their WinForms or WPF application projects. https://github.com/ravibpatel/AutoUpdater.NET/releases - Copyright © 2012-2023 RBSoft + Copyright © 2012-2024 RBSoft autoupdate updater c# vb wpf winforms - + - + - + - + - + + + + @@ -45,6 +48,9 @@ + + + diff --git a/AutoUpdaterTest/AutoUpdaterTest.csproj b/AutoUpdaterTest/AutoUpdaterTest.csproj index 5510d1fc..8b3995f6 100644 --- a/AutoUpdaterTest/AutoUpdaterTest.csproj +++ b/AutoUpdaterTest/AutoUpdaterTest.csproj @@ -2,7 +2,7 @@ WinExe - net7.0-windows + net8.0-windows enable true latest diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 60ce8338..8e5c4fee 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,12 +3,12 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows + net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows true ZipExtractor RBSoft ZipExtractor - Copyright © 2012-2023 RBSoft + Copyright © 2012-2024 RBSoft 1.4.0.0 1.4.0.0 1.4.0.0 diff --git a/appveyor.yml b/appveyor.yml index 416f6536..b1ece443 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,6 +22,8 @@ install: - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net7.0-windows7.0" + - dotnet publish --framework net8.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" + - dotnet publish --framework net8.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net8.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" From 119693c53fedb3feedf1f38b7832054237d1842a Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 7 Feb 2024 14:16:57 +0530 Subject: [PATCH 76/93] Now using Release configuration with dotnet publish command in appveyor.yml. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 1 - appveyor.yml | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 7f9429b8..1939e1ff 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -32,7 +32,6 @@ latest - build\lib pdbonly diff --git a/appveyor.yml b/appveyor.yml index b1ece443..22992433 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,16 +14,16 @@ install: - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - - dotnet publish --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - - dotnet publish --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" - - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - - dotnet publish --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" - - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - - dotnet publish --framework net7.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net7.0-windows7.0" - - dotnet publish --framework net8.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - - dotnet publish --framework net8.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net8.0-windows7.0" + - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" + - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" + - dotnet publish --configuration Release --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" + - dotnet publish --configuration Release --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" + - dotnet publish --configuration Release --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" + - dotnet publish --configuration Release --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" + - dotnet publish --configuration Release --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" + - dotnet publish --configuration Release --framework net7.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net7.0-windows7.0" + - dotnet publish --configuration Release --framework net8.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" + - dotnet publish --configuration Release --framework net8.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net8.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" From b15a8fbf5863902ec28a2adfb04829dd75dba226 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 14 Feb 2024 16:32:45 +0530 Subject: [PATCH 77/93] Added Readme file to NuGet package. This fixes #661. --- AutoUpdater.NET.sln | 1 + AutoUpdater.NET/AutoUpdater.NET.csproj | 2 +- .../build/Autoupdater.NET.Official.nuspec | 4 +++ README.md | 5 +++- ZipExtractor/FormMain.cs | 2 +- ZipExtractor/Properties/Resources.Designer.cs | 9 +++++++ ZipExtractor/Properties/Resources.resx | 3 +++ appveyor.yml | 2 +- build.bat | 25 +++++++++++++++++++ 9 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 build.bat diff --git a/AutoUpdater.NET.sln b/AutoUpdater.NET.sln index b5ec7904..8b512fc2 100644 --- a/AutoUpdater.NET.sln +++ b/AutoUpdater.NET.sln @@ -14,6 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution appveyor.yml = appveyor.yml LICENSE = LICENSE README.md = README.md + build.bat = build.bat EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipExtractor", "ZipExtractor\ZipExtractor.csproj", "{EDB311FC-50D3-468B-AC36-4CDFE04D29A3}" diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 1939e1ff..74fc2549 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -28,7 +28,7 @@ autoupdate updater c# vb wpf winforms https://github.com/ravibpatel/AutoUpdater.NET/releases build - $(OutputPath)\$(Configuration)\AutoUpdater.NET.xml + $(OutDir)\AutoUpdater.NET.xml latest diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 074ea6d1..11c9f00b 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -7,6 +7,7 @@ rbsoft false MIT + docs\README.md https://licenses.nuget.org/MIT https://github.com/ravibpatel/AutoUpdater.NET AutoUpdater.NET is a class library that allows .NET developers to easily add auto update @@ -65,4 +66,7 @@ + + + \ No newline at end of file diff --git a/README.md b/README.md index a0a800c5..a7671c8d 100644 --- a/README.md +++ b/README.md @@ -574,7 +574,10 @@ You can follow below steps to build the project on your local development enviro net5.0-windows ``` -* Build ZipExtractor project in "Release" configuration to create the executable in Resources folder. While compiling it for .NET Core 3.1 or above, you have to use publish command instead of build as shown [here](https://learn.microsoft.com/en-us/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-7-0) and copy the resulting executable to "AutoUpdater.NET/Resources" folder. +* Build ZipExtractor project in "Release" configuration to create the executable in Resources folder. While compiling it + for .NET Core 3.1 or above, you have to use publish command instead of build as + shown [here](https://learn.microsoft.com/en-us/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-7-0) + and copy the resulting executable to "AutoUpdater.NET/Resources" folder. * VS2022 doesn't allow building .NET Framework 4.5 by default, so if you are using it then you can just change it to any supported .NET version, or you have to follow steps from [here](https://stackoverflow.com/a/70109092/1273550) to use .NET Framework 4.5. diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 8f916527..783db970 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -89,7 +89,7 @@ private void FormMain_Shown(object sender, EventArgs e) { _logBuilder.AppendLine("Waiting for application process to exit..."); - _backgroundWorker.ReportProgress(0, "Waiting for application to exit..."); + _backgroundWorker.ReportProgress(0, Resources.WaitingForAppToExitMessage); process.WaitForExit(); } } diff --git a/ZipExtractor/Properties/Resources.Designer.cs b/ZipExtractor/Properties/Resources.Designer.cs index 4cd731a4..54d50a84 100644 --- a/ZipExtractor/Properties/Resources.Designer.cs +++ b/ZipExtractor/Properties/Resources.Designer.cs @@ -100,6 +100,15 @@ internal static string Removing { } } + /// + /// Looks up a localized string similar to Waiting for application to exit…. + /// + internal static string WaitingForAppToExitMessage { + get { + return ResourceManager.GetString("WaitingForAppToExitMessage", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/ZipExtractor/Properties/Resources.resx b/ZipExtractor/Properties/Resources.resx index 6eeaaa8b..d637d95e 100644 --- a/ZipExtractor/Properties/Resources.resx +++ b/ZipExtractor/Properties/Resources.resx @@ -142,4 +142,7 @@ Removing {0} + + Waiting for application to exit… + \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 22992433..53ca7c21 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ install: - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.snk.enc" -secret %my_secret% - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net45;TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - dotnet publish --configuration Release --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" diff --git a/build.bat b/build.bat new file mode 100644 index 00000000..50aee66d --- /dev/null +++ b/build.bat @@ -0,0 +1,25 @@ +:: .NET Framework 4.5 +msbuild "ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal +msbuild "AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net45;TargetFramework=net45;Configuration=Release /verbosity:minimal + +:: .NET Core 3.1 +dotnet publish --configuration Release --framework netcoreapp3.1 "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" +dotnet publish --configuration Release --framework netcoreapp3.1 "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\netcoreapp3.1" + +:: .NET 5.0 +dotnet publish --configuration Release --framework net5.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" +dotnet publish --configuration Release --framework net5.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net5.0-windows7.0" + +:: .NET 6.0 +dotnet publish --configuration Release --framework net6.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" +dotnet publish --configuration Release --framework net6.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net6.0-windows7.0" + +:: .NET 7.0 +dotnet publish --configuration Release --framework net7.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" +dotnet publish --configuration Release --framework net7.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net7.0-windows7.0" + +:: .NET 8.0 +dotnet publish --configuration Release --framework net8.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" +dotnet publish --configuration Release --framework net8.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net8.0-windows7.0" + +pause \ No newline at end of file From 125154427549b69371e8b465f12da2fe8092d57c Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 14 Feb 2024 17:05:40 +0530 Subject: [PATCH 78/93] Fixed an issue in build process that was causing it to build empty NuGet package. --- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 6 ++++++ README.md | 2 +- appveyor.yml | 2 +- build.bat | 6 ++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 11c9f00b..19027734 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -68,5 +68,11 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index a7671c8d..0d6777c9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![AutoUpdater.NET](Logo/Horizontal.png) +# ![AutoUpdater.NET](https://raw.githubusercontent.com/ravibpatel/AutoUpdater.NET/b15a8fbf5863902ec28a2adfb04829dd75dba226/Logo/Horizontal.png) [![Build status](https://ci.appveyor.com/api/projects/status/yng987o7dauk9gqc?svg=true)](https://ci.appveyor.com/project/ravibpatel/autoupdater-net) diff --git a/appveyor.yml b/appveyor.yml index 53ca7c21..75beff1e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -26,7 +26,7 @@ install: - dotnet publish --configuration Release --framework net8.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net8.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse - - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" + - nuget pack "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec" -Verbosity detailed artifacts: - path: AutoUpdater.NET-%my_version%.zip diff --git a/build.bat b/build.bat index 50aee66d..f6305ac4 100644 --- a/build.bat +++ b/build.bat @@ -22,4 +22,10 @@ dotnet publish --configuration Release --framework net7.0-windows "AutoUpdater.N dotnet publish --configuration Release --framework net8.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" dotnet publish --configuration Release --framework net8.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net8.0-windows7.0" +:: Remove unnecessary files +Powershell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Remove-Item -path AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse" + +:: Create NuGet package +nuget pack AutoUpdater.NET\build\Autoupdater.NET.Official.nuspec -Verbosity detailed -OutputDirectory AutoUpdater.NET\build + pause \ No newline at end of file From 8e878844719bc0aa750b6ab20cd39b00c5ada059 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 15 Feb 2024 11:12:58 +0530 Subject: [PATCH 79/93] Using Utils.BuildArguments to create arguments string for MSI installer causes issues so reverted that change. This fixes #664. --- AutoUpdater.NET/DownloadUpdateDialog.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index 2507b2fc..e63e58f5 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -230,18 +230,11 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent FileName = "msiexec" }; - var arguments = new Collection - { - "/i", - tempPath - }; - + processStartInfo.Arguments = $"/i \"{tempPath}\""; if (!string.IsNullOrEmpty(installerArgs)) { - arguments.Add(installerArgs); + processStartInfo.Arguments += $" {installerArgs}"; } - - processStartInfo.Arguments = Utils.BuildArguments(arguments); } if (AutoUpdater.RunUpdateAsAdmin) From c5b8cfb0508c1efcd130f3859fba10cd6a6789eb Mon Sep 17 00:00:00 2001 From: David R Date: Fri, 15 Mar 2024 06:04:00 -0600 Subject: [PATCH 80/93] Fixed DownloadUpdateDialog spanish translation (#672) --- AutoUpdater.NET/DownloadUpdateDialog.es.resx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoUpdater.NET/DownloadUpdateDialog.es.resx b/AutoUpdater.NET/DownloadUpdateDialog.es.resx index bc3e02f2..0c06e579 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.es.resx +++ b/AutoUpdater.NET/DownloadUpdateDialog.es.resx @@ -127,6 +127,6 @@ Descargar Update... - actualización de software + Actualización de software - \ No newline at end of file + From b3ea407cef733663363bcbfdcdba8a4dc62566b9 Mon Sep 17 00:00:00 2001 From: Fabian Hohmuth Date: Thu, 9 May 2024 00:49:26 -0700 Subject: [PATCH 81/93] Fixed an issue with Process.Start() in NETCOREAPP (#677) --- AutoUpdater.NET/UpdateForm.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/AutoUpdater.NET/UpdateForm.cs b/AutoUpdater.NET/UpdateForm.cs index 345b9a71..cc33d13d 100644 --- a/AutoUpdater.NET/UpdateForm.cs +++ b/AutoUpdater.NET/UpdateForm.cs @@ -177,8 +177,13 @@ private void ButtonUpdateClick(object sender, EventArgs e) { if (AutoUpdater.OpenDownloadPage) { + var processStartInfo = new ProcessStartInfo(_args.DownloadURL); - +#if NETCOREAPP + // for .NET Core, UseShellExecute must be set to true, otherwise + // opening URLs via Process.Start() fails + processStartInfo.UseShellExecute = true; +#endif Process.Start(processStartInfo); DialogResult = DialogResult.OK; From c1e08e068f938997a707dc5045f734830646a606 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 10 May 2024 17:52:05 +0530 Subject: [PATCH 82/93] Grouped resource files with their respective forms using .csproj. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 201 +++++++++++++++++- .../build/Autoupdater.NET.Official.nuspec | 14 +- LICENSE | 2 +- appveyor.yml | 4 +- 4 files changed, 206 insertions(+), 15 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 74fc2549..3c5273a6 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,10 +11,10 @@ RBSoft AutoUpdater.NET Copyright © 2012-2024 RBSoft - 1.8.5.0 - 1.8.5.0 - 1.8.5.0 - 1.8.5.0 + 1.8.6.0 + 1.8.6.0 + 1.8.6.0 + 1.8.6.0 true AutoUpdater.NET.snk en @@ -50,6 +50,197 @@ - + + + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 19027734..398fd245 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.5.0 + 1.8.6.0 AutoUpdater.NET rbsoft false @@ -18,22 +18,22 @@ autoupdate updater c# vb wpf winforms - + - + - + - + - + - + diff --git a/LICENSE b/LICENSE index 3e4ea36b..f8d69934 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2023 RBSoft +Copyright (c) 2012-2024 RBSoft Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/appveyor.yml b/appveyor.yml index 75beff1e..319cadcd 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.5.{build} +version: 1.8.6.{build} environment: - my_version: 1.8.5 + my_version: 1.8.6 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From 86ae08d9f04e3018ce582b45541bdb968aaf746e Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 24 May 2024 23:50:08 +0530 Subject: [PATCH 83/93] Now using both win-x86 and win-x64 RuntimeIdentifiers for ZipExtractor. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++++---- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- ZipExtractor/ZipExtractor.csproj | 10 +++++----- appveyor.yml | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 3c5273a6..5672e4f6 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,10 +11,10 @@ RBSoft AutoUpdater.NET Copyright © 2012-2024 RBSoft - 1.8.6.0 - 1.8.6.0 - 1.8.6.0 - 1.8.6.0 + 1.8.7.0 + 1.8.7.0 + 1.8.7.0 + 1.8.7.0 true AutoUpdater.NET.snk en diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 398fd245..7042888e 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.6.0 + 1.8.7.0 AutoUpdater.NET rbsoft false diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 8e5c4fee..9f654f91 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2024 RBSoft - 1.4.0.0 - 1.4.0.0 - 1.4.0.0 - 1.4.0.0 + 1.4.1.0 + 1.4.1.0 + 1.4.1.0 + 1.4.1.0 ZipExtractor.ico app.manifest true @@ -22,7 +22,7 @@ false - win-x86 + win-x86;win-x64 true false false diff --git a/appveyor.yml b/appveyor.yml index 319cadcd..6df74cfb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.6.{build} +version: 1.8.7.{build} environment: - my_version: 1.8.6 + my_version: 1.8.7 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From efba394e5af657f2cb92c669f30015e9da3f0217 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 31 May 2024 17:23:49 +0530 Subject: [PATCH 84/93] Now handling all exceptions raised while trying to exit the process. --- AutoUpdater.NET/AutoUpdater.cs | 37 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 030e45e5..685df310 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -583,34 +583,33 @@ internal static void Exit() var currentProcess = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) { - string processPath; - try - { - processPath = process.MainModule?.FileName; - } - catch (Win32Exception) + if (process.HasExited) { - // Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances. - // This means this is not the process we are looking for so we can safely skip this. continue; } - // Get all instances of assembly except current - if (process.Id == currentProcess.Id || currentProcess.MainModule?.FileName != processPath) + try { - continue; - } + string processPath = process.MainModule?.FileName; - if (process.CloseMainWindow()) - { - process.WaitForExit((int)TimeSpan.FromSeconds(10) - .TotalMilliseconds); // Give some time to process message - } + // Get all instances of assembly except current + if (process.Id == currentProcess.Id || currentProcess.MainModule?.FileName != processPath) + { + continue; + } + + if (process.CloseMainWindow()) + { + process.WaitForExit((int)TimeSpan.FromSeconds(10) + .TotalMilliseconds); // Give some time to process message + } - if (!process.HasExited) - { process.Kill(); //TODO: Show UI message asking user to close program himself instead of silently killing it } + catch (Exception) + { + // ignored + } } if (ApplicationExitEvent != null) From 9e4587d11047fa475491d9aa28ee0abee7b85c3d Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 31 May 2024 21:49:07 +0530 Subject: [PATCH 85/93] Now targeting .NET Framework 4.6.2 instead of .NET Framework 4.5. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 16 ++++---- AutoUpdater.NET/DownloadUpdateDialog.cs | 29 +++++++++----- .../build/Autoupdater.NET.Official.nuspec | 38 +++++++++---------- AutoUpdaterTest/AutoUpdaterTest.csproj | 2 +- README.md | 7 +--- ZipExtractor/FormMain.cs | 2 +- ZipExtractor/ZipExtractor.csproj | 14 +++---- appveyor.yml | 8 ++-- build.bat | 6 +-- 9 files changed, 64 insertions(+), 58 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 5672e4f6..f185f0b9 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -3,7 +3,7 @@ {FB9E7E6B-B19F-4F37-A708-2996190CEF13} library - net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows + net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows true true AutoUpdaterDotNET @@ -11,10 +11,10 @@ RBSoft AutoUpdater.NET Copyright © 2012-2024 RBSoft - 1.8.7.0 - 1.8.7.0 - 1.8.7.0 - 1.8.7.0 + 1.9.0.0 + 1.9.0.0 + 1.9.0.0 + 1.9.0.0 true AutoUpdater.NET.snk en @@ -37,7 +37,7 @@ full - + @@ -47,10 +47,10 @@ - - + + diff --git a/AutoUpdater.NET/DownloadUpdateDialog.cs b/AutoUpdater.NET/DownloadUpdateDialog.cs index e63e58f5..55c25133 100644 --- a/AutoUpdater.NET/DownloadUpdateDialog.cs +++ b/AutoUpdater.NET/DownloadUpdateDialog.cs @@ -227,10 +227,10 @@ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEvent { processStartInfo = new ProcessStartInfo { - FileName = "msiexec" + FileName = "msiexec", + Arguments = $"/i \"{tempPath}\"" }; - processStartInfo.Arguments = $"/i \"{tempPath}\""; if (!string.IsNullOrEmpty(installerArgs)) { processStartInfo.Arguments += $" {installerArgs}"; @@ -287,20 +287,29 @@ private static string BytesToString(long byteCount) private static void CompareChecksum(string fileName, CheckSum checksum) { - using var hashAlgorithm = - HashAlgorithm.Create( - string.IsNullOrEmpty(checksum.HashingAlgorithm) ? "MD5" : checksum.HashingAlgorithm); - using FileStream stream = File.OpenRead(fileName); - - if (hashAlgorithm == null) + HashAlgorithm hashAlgorithm; + if (string.IsNullOrEmpty(checksum.HashingAlgorithm) || checksum.HashingAlgorithm == "MD5") { - throw new Exception(Resources.HashAlgorithmNotSupportedMessage); + hashAlgorithm = MD5.Create(); } + else + { + hashAlgorithm = checksum.HashingAlgorithm switch + { + "SHA1" => SHA1.Create(), + "SHA256" => SHA256.Create(), + "SHA384" => SHA384.Create(), + "SHA512" => SHA512.Create(), + _ => throw new NotSupportedException(Resources.HashAlgorithmNotSupportedMessage) + }; + } + + using FileStream stream = File.OpenRead(fileName); byte[] hash = hashAlgorithm.ComputeHash(stream); string fileChecksum = BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant(); - if (fileChecksum == checksum.Value.ToLower()) + if (fileChecksum.Equals(checksum.Value, StringComparison.OrdinalIgnoreCase)) { return; } diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 7042888e..342e7050 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.8.7.0 + 1.9.0.0 AutoUpdater.NET rbsoft false @@ -17,23 +17,23 @@ Copyright © 2012-2024 RBSoft autoupdate updater c# vb wpf winforms - - + + - + - + - + - + - + @@ -52,23 +52,23 @@ - + - - - - - - - - - + + + + + + + + + - + diff --git a/AutoUpdaterTest/AutoUpdaterTest.csproj b/AutoUpdaterTest/AutoUpdaterTest.csproj index 8b3995f6..c9eb2b55 100644 --- a/AutoUpdaterTest/AutoUpdaterTest.csproj +++ b/AutoUpdaterTest/AutoUpdaterTest.csproj @@ -36,7 +36,7 @@ - + diff --git a/README.md b/README.md index 0d6777c9..de6b758b 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ PM> Install-Package Autoupdater.NET.Official ## Supported .NET versions -* .NET Framework 4.5 or above +* .NET Framework 4.6.2 or above * .NET Core 3.1 * .NET 5.0 or above @@ -565,7 +565,7 @@ You can follow below steps to build the project on your local development enviro Before ```xml - net45;netcoreapp3.1;net5.0-windows + net462;netcoreapp3.1;net5.0-windows ``` After @@ -578,6 +578,3 @@ You can follow below steps to build the project on your local development enviro for .NET Core 3.1 or above, you have to use publish command instead of build as shown [here](https://learn.microsoft.com/en-us/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-7-0) and copy the resulting executable to "AutoUpdater.NET/Resources" folder. -* VS2022 doesn't allow building .NET Framework 4.5 by default, so if you are using it then you can just change it to any - supported .NET version, or you have to follow steps from [here](https://stackoverflow.com/a/70109092/1273550) to use - .NET Framework 4.5. diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 783db970..f87e372b 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -253,7 +253,7 @@ private void FormMain_Shown(object sender, EventArgs e) _backgroundWorker.ProgressChanged += (_, eventArgs) => { progressBar.Value = eventArgs.ProgressPercentage; - textBoxInformation.Text = eventArgs.UserState?.ToString(); + textBoxInformation.Text = eventArgs.UserState?.ToString() ?? string.Empty; if (textBoxInformation.Text == null) { return; diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 9f654f91..43c7ff4e 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,16 +3,16 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net45;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows + net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows true ZipExtractor RBSoft ZipExtractor Copyright © 2012-2024 RBSoft - 1.4.1.0 - 1.4.1.0 - 1.4.1.0 - 1.4.1.0 + 1.5.0.0 + 1.5.0.0 + 1.5.0.0 + 1.5.0.0 ZipExtractor.ico app.manifest true @@ -21,7 +21,7 @@ default false - + win-x86;win-x64 true false @@ -39,7 +39,7 @@ none false - + diff --git a/appveyor.yml b/appveyor.yml index 6df74cfb..04dbde4d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.8.7.{build} +version: 1.9.0.{build} environment: - my_version: 1.8.7 + my_version: 1.9.0 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true @@ -12,8 +12,8 @@ install: - cmd: nuget restore - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.snk.enc" -secret %my_secret% - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% - - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net45;TargetFramework=net45;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net462;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net462;TargetFramework=net462;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - dotnet publish --configuration Release --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" diff --git a/build.bat b/build.bat index f6305ac4..9d4c4f6f 100644 --- a/build.bat +++ b/build.bat @@ -1,6 +1,6 @@ -:: .NET Framework 4.5 -msbuild "ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net45;Configuration=Release /verbosity:minimal -msbuild "AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net45;TargetFramework=net45;Configuration=Release /verbosity:minimal +:: .NET Framework 4.6.2 +msbuild "ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net462;Configuration=Release /verbosity:minimal +msbuild "AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net462;TargetFramework=net462;Configuration=Release /verbosity:minimal :: .NET Core 3.1 dotnet publish --configuration Release --framework netcoreapp3.1 "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" From 6788c0ea914edefecebccad1b8a6fb695c03b843 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sat, 1 Jun 2024 22:10:13 +0530 Subject: [PATCH 86/93] Now killing the other app process only if it didn't exited after call to CloseMainWindow. --- AutoUpdater.NET/AutoUpdater.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 685df310..32e9baab 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -583,11 +583,6 @@ internal static void Exit() var currentProcess = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) { - if (process.HasExited) - { - continue; - } - try { string processPath = process.MainModule?.FileName; @@ -604,6 +599,11 @@ internal static void Exit() .TotalMilliseconds); // Give some time to process message } + if (process.HasExited) + { + continue; + } + process.Kill(); //TODO: Show UI message asking user to close program himself instead of silently killing it } catch (Exception) From bfd4c1e9d7e436f210d7d6863f12c5e57d5307bb Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 12 Jun 2024 12:26:38 +0530 Subject: [PATCH 87/93] Updated appveyor.yml. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 04dbde4d..c28c2d77 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -47,7 +47,7 @@ deploy: - provider: NuGet api_key: - secure: niHgnyEf7tXImWdR3VEJ38p/3gaV7OiSijx0YUmycHTkh12id6zMKkTS+S2XjF2J + secure: nkE/u7bLXRlBGJEKORohjPizTbDTdypw5jeTfJyzNd4scE6W9c6wFfT8f4UXdNKx skip_symbols: false artifact: Autoupdater.NET.Official.%my_version%.nupkg on: From a3a9db26fba54a98c14d497f6b7e888edfb40c54 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 16 Jun 2024 13:27:17 +0530 Subject: [PATCH 88/93] Now using ZipExtractor compiled using .NET Framework 4.5 instead of same .NET version as the host project to natively support Windows 8 and above while preventing issues with self-contained apps. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 386 +++++++++--------- .../build/Autoupdater.NET.Official.nuspec | 2 +- README.md | 9 + ZipExtractor/ZipExtractor.csproj | 14 +- appveyor.yml | 11 +- 5 files changed, 213 insertions(+), 209 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index f185f0b9..ec10cc03 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,10 +11,10 @@ RBSoft AutoUpdater.NET Copyright © 2012-2024 RBSoft - 1.9.0.0 - 1.9.0.0 - 1.9.0.0 - 1.9.0.0 + 1.9.1.0 + 1.9.1.0 + 1.9.1.0 + 1.9.1.0 true AutoUpdater.NET.snk en @@ -53,194 +53,194 @@ - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 342e7050..86bb0e62 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.9.0.0 + 1.9.1.0 AutoUpdater.NET rbsoft false diff --git a/README.md b/README.md index de6b758b..a4b24c69 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,12 @@ PM> Install-Package Autoupdater.NET.Official * .NET Core 3.1 * .NET 5.0 or above +## Supported Windows versions + +* Windows 8 or above +* Windows version lower than 8 requires .NET Framework 4.5 or above installed for ZipExtractor to work. You can use + installer instead of zip file as an update file to avoid this issue. + This library only works for WinForms or WPF application projects. ## How it works @@ -578,3 +584,6 @@ You can follow below steps to build the project on your local development enviro for .NET Core 3.1 or above, you have to use publish command instead of build as shown [here](https://learn.microsoft.com/en-us/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-7-0) and copy the resulting executable to "AutoUpdater.NET/Resources" folder. +* Visual Studio 2022 doesn't allow building .NET Framework 4.5 by default, so if you are using Visual Studio 2022 then + you can just change it to any supported .NET version, or you have to follow steps + from [here](https://stackoverflow.com/a/70109092/1273550) to use .NET Framework 4.5. diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 43c7ff4e..87e50531 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -3,16 +3,16 @@ {91DE558C-6DB8-429B-A069-C0491DCFF15B} WinExe - net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows + net45 true ZipExtractor RBSoft ZipExtractor Copyright © 2012-2024 RBSoft - 1.5.0.0 - 1.5.0.0 - 1.5.0.0 - 1.5.0.0 + 1.5.1.0 + 1.5.1.0 + 1.5.1.0 + 1.5.1.0 ZipExtractor.ico app.manifest true @@ -21,7 +21,7 @@ default false - + win-x86;win-x64 true false @@ -39,7 +39,7 @@ none false - + diff --git a/appveyor.yml b/appveyor.yml index c28c2d77..7818846d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.9.0.{build} +version: 1.9.1.{build} environment: - my_version: 1.9.0 + my_version: 1.9.1 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true @@ -12,17 +12,12 @@ install: - cmd: nuget restore - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.snk.enc" -secret %my_secret% - secure-file\tools\secure-file -decrypt "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.snk.enc" -secret %my_secret% - - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net462;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" + - msbuild "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" /p:Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net462;TargetFramework=net462;Configuration=Release /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework netcoreapp3.1 "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\netcoreapp3.1" - - dotnet publish --configuration Release --framework net5.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework net5.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net5.0-windows7.0" - - dotnet publish --configuration Release --framework net6.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework net6.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net6.0-windows7.0" - - dotnet publish --configuration Release --framework net7.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework net7.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net7.0-windows7.0" - - dotnet publish --configuration Release --framework net8.0-windows "c:\projects\AutoUpdater.NET\ZipExtractor\ZipExtractor.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\Resources" - dotnet publish --configuration Release --framework net8.0-windows "c:\projects\AutoUpdater.NET\AutoUpdater.NET\AutoUpdater.NET.csproj" --output "c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\net8.0-windows7.0" - cmd: 7z a AutoUpdater.NET-%my_version%.zip %APPVEYOR_BUILD_FOLDER%\AutoUpdater.NET\build\lib\* - ps: Remove-Item -path c:\projects\AutoUpdater.NET\AutoUpdater.NET\build\lib\* -include runtimes,Microsoft.Web.WebView2*,AutoUpdater.NET.deps.json -Recurse From 8cb90b57dc54f43315e0063412df9c2814f9ded3 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Wed, 19 Jun 2024 22:07:48 +0530 Subject: [PATCH 89/93] Set ReadOnly property of ZipExtractor information TextBox to true. This fixes #695. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 8 ++++---- AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec | 2 +- ZipExtractor/FormMain.Designer.cs | 1 + ZipExtractor/ZipExtractor.csproj | 8 ++++---- appveyor.yml | 4 ++-- build.bat | 9 +++------ 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index ec10cc03..afe8211f 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -11,10 +11,10 @@ RBSoft AutoUpdater.NET Copyright © 2012-2024 RBSoft - 1.9.1.0 - 1.9.1.0 - 1.9.1.0 - 1.9.1.0 + 1.9.2.0 + 1.9.2.0 + 1.9.2.0 + 1.9.2.0 true AutoUpdater.NET.snk en diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 86bb0e62..b0d4dd56 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.9.1.0 + 1.9.2.0 AutoUpdater.NET rbsoft false diff --git a/ZipExtractor/FormMain.Designer.cs b/ZipExtractor/FormMain.Designer.cs index 52995e3a..1daef6e1 100644 --- a/ZipExtractor/FormMain.Designer.cs +++ b/ZipExtractor/FormMain.Designer.cs @@ -63,6 +63,7 @@ private void InitializeComponent() this.textBoxInformation.BorderStyle = System.Windows.Forms.BorderStyle.None; this.textBoxInformation.Location = new System.Drawing.Point(96, 20); this.textBoxInformation.Name = "textBoxInformation"; + this.textBoxInformation.ReadOnly = true; this.textBoxInformation.Size = new System.Drawing.Size(514, 16); this.textBoxInformation.TabIndex = 4; this.textBoxInformation.Text = "Extracting..."; diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 87e50531..a51283f0 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2024 RBSoft - 1.5.1.0 - 1.5.1.0 - 1.5.1.0 - 1.5.1.0 + 1.5.2.0 + 1.5.2.0 + 1.5.2.0 + 1.5.2.0 ZipExtractor.ico app.manifest true diff --git a/appveyor.yml b/appveyor.yml index 7818846d..eaf3dbc0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.9.1.{build} +version: 1.9.2.{build} environment: - my_version: 1.9.1 + my_version: 1.9.2 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true diff --git a/build.bat b/build.bat index 9d4c4f6f..ea6aea42 100644 --- a/build.bat +++ b/build.bat @@ -1,25 +1,22 @@ +:: Build ZipExtractor +msbuild "ZipExtractor\ZipExtractor.csproj" /p:Configuration=Release /verbosity:minimal + :: .NET Framework 4.6.2 -msbuild "ZipExtractor\ZipExtractor.csproj" /p:TargetFramework=net462;Configuration=Release /verbosity:minimal msbuild "AutoUpdater.NET\AutoUpdater.NET.csproj" /p:OutputPath=build\lib\net462;TargetFramework=net462;Configuration=Release /verbosity:minimal :: .NET Core 3.1 -dotnet publish --configuration Release --framework netcoreapp3.1 "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" dotnet publish --configuration Release --framework netcoreapp3.1 "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\netcoreapp3.1" :: .NET 5.0 -dotnet publish --configuration Release --framework net5.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" dotnet publish --configuration Release --framework net5.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net5.0-windows7.0" :: .NET 6.0 -dotnet publish --configuration Release --framework net6.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" dotnet publish --configuration Release --framework net6.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net6.0-windows7.0" :: .NET 7.0 -dotnet publish --configuration Release --framework net7.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" dotnet publish --configuration Release --framework net7.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net7.0-windows7.0" :: .NET 8.0 -dotnet publish --configuration Release --framework net8.0-windows "ZipExtractor\ZipExtractor.csproj" --output "AutoUpdater.NET\Resources" dotnet publish --configuration Release --framework net8.0-windows "AutoUpdater.NET\AutoUpdater.NET.csproj" --output "AutoUpdater.NET\build\lib\net8.0-windows7.0" :: Remove unnecessary files From e3894e3856238ede09c796b60a7f037dd9173303 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 1 Aug 2024 00:22:38 +0530 Subject: [PATCH 90/93] Fixed an issue that caused Resource.Embedder to be used for .NET Core assemblies too. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 4 ++-- .../build/Autoupdater.NET.Official.nuspec | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index afe8211f..d1eff1e7 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -47,10 +47,10 @@ + - - + diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index b0d4dd56..162e09be 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -18,22 +18,22 @@ autoupdate updater c# vb wpf winforms - + - + - + - + - + - + From 7fef4e11bcdf3b8163be791d6c8cd61588e87a41 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Thu, 1 Aug 2024 16:27:04 +0530 Subject: [PATCH 91/93] Resource.Embedder caused the strong name validation failure, so no longer using it to embed satellite assemblies. Fixes #696. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index d1eff1e7..045870bc 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -47,7 +47,6 @@ - From d3ea38f2d9ca5282e294d71755569d3aa6521d49 Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Fri, 13 Sep 2024 14:28:55 +0530 Subject: [PATCH 92/93] Now it is possible to run AutoUpdater without XML url but it requires handling ParseUpdateInfoEvent in that case. Added more space for Remind Later button when current locale is Spanish. This closes #432 and closes #708. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 484 +++++++++--------- AutoUpdater.NET/AutoUpdater.cs | 35 +- AutoUpdater.NET/UpdateForm.es.resx | 10 +- .../build/Autoupdater.NET.Official.nuspec | 14 +- ZipExtractor/FormMain.cs | 2 + ZipExtractor/ZipExtractor.csproj | 8 +- appveyor.yml | 4 +- 7 files changed, 286 insertions(+), 271 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 045870bc..4a83c8a8 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -1,245 +1,245 @@ - - {FB9E7E6B-B19F-4F37-A708-2996190CEF13} - library - net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows - true - true - AutoUpdaterDotNET - AutoUpdater.NET - RBSoft - AutoUpdater.NET - Copyright © 2012-2024 RBSoft - 1.9.2.0 - 1.9.2.0 - 1.9.2.0 - 1.9.2.0 - true - AutoUpdater.NET.snk - en - Autoupdater.NET.Official - true - MIT - AutoUpdater.NET - rbsoft - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. - https://github.com/ravibpatel/AutoUpdater.NET - autoupdate updater c# vb wpf winforms - https://github.com/ravibpatel/AutoUpdater.NET/releases - build - $(OutDir)\AutoUpdater.NET.xml - latest - - - pdbonly - - - full - - - - - - - - - - - - - - - - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - + + {FB9E7E6B-B19F-4F37-A708-2996190CEF13} + library + net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows + true + true + AutoUpdaterDotNET + AutoUpdater.NET + RBSoft + AutoUpdater.NET + Copyright © 2012-2024 RBSoft + 1.9.3.0 + 1.9.3.0 + 1.9.3.0 + 1.9.3.0 + true + AutoUpdater.NET.snk + en + Autoupdater.NET.Official + true + MIT + AutoUpdater.NET + rbsoft + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. + https://github.com/ravibpatel/AutoUpdater.NET + autoupdate updater c# vb wpf winforms + https://github.com/ravibpatel/AutoUpdater.NET/releases + build + $(OutDir)\AutoUpdater.NET.xml + latest + + + pdbonly + + + full + + + + + + + + + + + + + + + + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + \ No newline at end of file diff --git a/AutoUpdater.NET/AutoUpdater.cs b/AutoUpdater.NET/AutoUpdater.cs index 32e9baab..480419c5 100644 --- a/AutoUpdater.NET/AutoUpdater.cs +++ b/AutoUpdater.NET/AutoUpdater.cs @@ -405,25 +405,32 @@ private static object CheckUpdate(Assembly mainAssembly) PersistenceProvider ??= new RegistryPersistenceProvider(registryLocation); - BaseUri = new Uri(AppCastURL); - UpdateInfoEventArgs args; - using (MyWebClient client = GetWebClient(BaseUri, BasicAuthXML)) + string xml = null; + + if (AppCastURL != null) { - string xml = client.DownloadString(BaseUri); + BaseUri = new Uri(AppCastURL); + using MyWebClient client = GetWebClient(BaseUri, BasicAuthXML); + xml = client.DownloadString(BaseUri); + } - if (ParseUpdateInfoEvent == null) - { - var xmlSerializer = new XmlSerializer(typeof(UpdateInfoEventArgs)); - var xmlTextReader = new XmlTextReader(new StringReader(xml)) { XmlResolver = null }; - args = (UpdateInfoEventArgs)xmlSerializer.Deserialize(xmlTextReader); - } - else + if (ParseUpdateInfoEvent == null) + { + if (string.IsNullOrEmpty(xml)) { - var parseArgs = new ParseUpdateInfoEventArgs(xml); - ParseUpdateInfoEvent(parseArgs); - args = parseArgs.UpdateInfo; + throw new Exception("It is required to handle ParseUpdateInfoEvent when XML url is not specified."); } + + var xmlSerializer = new XmlSerializer(typeof(UpdateInfoEventArgs)); + var xmlTextReader = new XmlTextReader(new StringReader(xml)) { XmlResolver = null }; + args = (UpdateInfoEventArgs)xmlSerializer.Deserialize(xmlTextReader); + } + else + { + var parseArgs = new ParseUpdateInfoEventArgs(xml); + ParseUpdateInfoEvent(parseArgs); + args = parseArgs.UpdateInfo; } if (string.IsNullOrEmpty(args?.CurrentVersion) || string.IsNullOrEmpty(args.DownloadURL)) diff --git a/AutoUpdater.NET/UpdateForm.es.resx b/AutoUpdater.NET/UpdateForm.es.resx index 8967ff10..d777568a 100644 --- a/AutoUpdater.NET/UpdateForm.es.resx +++ b/AutoUpdater.NET/UpdateForm.es.resx @@ -133,9 +133,15 @@ Notas de la versión : - actualizar + Actualizar - + + 300, 573 + + + 175, 28 + + Recuérdame más tarde diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 162e09be..0928bd79 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -2,7 +2,7 @@ Autoupdater.NET.Official - 1.9.2.0 + 1.9.3.0 AutoUpdater.NET rbsoft false @@ -18,22 +18,22 @@ autoupdate updater c# vb wpf winforms - + - + - + - + - + - + diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index f87e372b..43c538aa 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -100,6 +100,8 @@ private void FormMain_Shown(object sender, EventArgs e) _logBuilder.AppendLine("BackgroundWorker started successfully."); + ControlBox = false; + // Ensures that the last character on the extraction path // is the directory separator char. // Without this, a malicious zip file could try to traverse outside of the expected diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index a51283f0..76942690 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2024 RBSoft - 1.5.2.0 - 1.5.2.0 - 1.5.2.0 - 1.5.2.0 + 1.5.3.0 + 1.5.3.0 + 1.5.3.0 + 1.5.3.0 ZipExtractor.ico app.manifest true diff --git a/appveyor.yml b/appveyor.yml index eaf3dbc0..06ea9ea5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ -version: 1.9.2.{build} +version: 1.9.3.{build} environment: - my_version: 1.9.2 + my_version: 1.9.3 my_secret: secure: vbPRaZLQYpGPr4BrZZ4p6TofpSZMud+FKtlpqjgO8aA= skip_branch_with_pr: true From f3f1bf2d756e7255c70c7b6f8aac744a0ecf631e Mon Sep 17 00:00:00 2001 From: Ravi Patel Date: Sun, 27 Oct 2024 12:11:42 +0530 Subject: [PATCH 93/93] Now invoking MessageBox in UI thread to prevent any issues. --- AutoUpdater.NET/AutoUpdater.NET.csproj | 484 +++++++++--------- .../build/Autoupdater.NET.Official.nuspec | 12 +- ZipExtractor/FormMain.cs | 20 +- ZipExtractor/ZipExtractor.csproj | 8 +- 4 files changed, 266 insertions(+), 258 deletions(-) diff --git a/AutoUpdater.NET/AutoUpdater.NET.csproj b/AutoUpdater.NET/AutoUpdater.NET.csproj index 4a83c8a8..2d680f5c 100644 --- a/AutoUpdater.NET/AutoUpdater.NET.csproj +++ b/AutoUpdater.NET/AutoUpdater.NET.csproj @@ -1,245 +1,245 @@ - - {FB9E7E6B-B19F-4F37-A708-2996190CEF13} - library - net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows - true - true - AutoUpdaterDotNET - AutoUpdater.NET - RBSoft - AutoUpdater.NET - Copyright © 2012-2024 RBSoft - 1.9.3.0 - 1.9.3.0 - 1.9.3.0 - 1.9.3.0 - true - AutoUpdater.NET.snk - en - Autoupdater.NET.Official - true - MIT - AutoUpdater.NET - rbsoft - AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. - https://github.com/ravibpatel/AutoUpdater.NET - autoupdate updater c# vb wpf winforms - https://github.com/ravibpatel/AutoUpdater.NET/releases - build - $(OutDir)\AutoUpdater.NET.xml - latest - - - pdbonly - - - full - - - - - - - - - - - - - - - - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - DownloadUpdateDialog.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - RemindLaterForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - - UpdateForm.cs - - + + {FB9E7E6B-B19F-4F37-A708-2996190CEF13} + library + net462;netcoreapp3.1;net5.0-windows;net6.0-windows;net7.0-windows;net8.0-windows + true + true + AutoUpdaterDotNET + AutoUpdater.NET + RBSoft + AutoUpdater.NET + Copyright © 2012-2024 RBSoft + 1.9.3.0 + 1.9.3.0 + 1.9.3.0 + 1.9.3.0 + true + AutoUpdater.NET.snk + en + Autoupdater.NET.Official + true + MIT + AutoUpdater.NET + rbsoft + AutoUpdater.NET is a class library that allows .NET developers to easily add auto update functionality to their WinForms or WPF application projects. + https://github.com/ravibpatel/AutoUpdater.NET + autoupdate updater c# vb wpf winforms + https://github.com/ravibpatel/AutoUpdater.NET/releases + build + $(OutDir)\AutoUpdater.NET.xml + latest + + + pdbonly + + + full + + + + + + + + + + + + + + + + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + DownloadUpdateDialog.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + RemindLaterForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + + UpdateForm.cs + + \ No newline at end of file diff --git a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec index 0928bd79..f71cf5ca 100644 --- a/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec +++ b/AutoUpdater.NET/build/Autoupdater.NET.Official.nuspec @@ -18,22 +18,22 @@ autoupdate updater c# vb wpf winforms - + - + - + - + - + - + diff --git a/ZipExtractor/FormMain.cs b/ZipExtractor/FormMain.cs index 43c538aa..bed5bb12 100644 --- a/ZipExtractor/FormMain.cs +++ b/ZipExtractor/FormMain.cs @@ -83,6 +83,7 @@ private void FormMain_Shown(object sender, EventArgs e) _backgroundWorker.DoWork += (_, eventArgs) => { foreach (Process process in Process.GetProcessesByName(Path.GetFileNameWithoutExtension(currentExe))) + { try { if (process.MainModule is { FileName: not null } && process.MainModule.FileName.Equals(currentExe)) @@ -97,10 +98,11 @@ private void FormMain_Shown(object sender, EventArgs e) { Debug.WriteLine(exception.Message); } + } _logBuilder.AppendLine("BackgroundWorker started successfully."); - ControlBox = false; + Invoke(new Action(() => { ControlBox = false; })); // Ensures that the last character on the extraction path // is the directory separator char. @@ -227,11 +229,17 @@ private void FormMain_Shown(object sender, EventArgs e) foreach (Process lockingProcess in lockingProcesses) { - DialogResult dialogResult = MessageBox.Show(this, - string.Format(Resources.FileStillInUseMessage, - lockingProcess.ProcessName, filePath), - Resources.FileStillInUseCaption, - MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); + var dialogResult = DialogResult.None; + + Invoke(new Action(() => + { + dialogResult = MessageBox.Show(this, + string.Format(Resources.FileStillInUseMessage, + lockingProcess.ProcessName, filePath), + Resources.FileStillInUseCaption, + MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); + })); + if (dialogResult == DialogResult.Cancel) { throw; diff --git a/ZipExtractor/ZipExtractor.csproj b/ZipExtractor/ZipExtractor.csproj index 76942690..b27d1ac7 100644 --- a/ZipExtractor/ZipExtractor.csproj +++ b/ZipExtractor/ZipExtractor.csproj @@ -9,10 +9,10 @@ RBSoft ZipExtractor Copyright © 2012-2024 RBSoft - 1.5.3.0 - 1.5.3.0 - 1.5.3.0 - 1.5.3.0 + 1.5.4.0 + 1.5.4.0 + 1.5.4.0 + 1.5.4.0 ZipExtractor.ico app.manifest true