From 892d7e1f6caa91cd0a0061c1deed3e58b2af9669 Mon Sep 17 00:00:00 2001 From: wule Date: Mon, 14 Jul 2025 09:19:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=AF=E4=BB=B6=E5=8D=87=E7=BA=A7=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AllBase/BaseClass.cs | 26 +- TEMUKJD/Program.cs | 1 + TEMUKJD/StartUp.cs | 55 +++ TEMUKJD/UserForm/LoginForm.cs | 13 +- Update/Update.sln | 25 ++ Update/Update/MainForm.cs | 231 ++++++++++ Update/Update/MainForm.designer.cs | 166 +++++++ Update/Update/MainForm.resx | 408 ++++++++++++++++++ Update/Update/Program.cs | 207 +++++++++ Update/Update/Properties/AssemblyInfo.cs | 36 ++ .../Update/Properties/Resources.Designer.cs | 63 +++ Update/Update/Properties/Resources.resx | 117 +++++ Update/Update/Properties/Settings.Designer.cs | 26 ++ Update/Update/Properties/Settings.settings | 7 + Update/Update/Update.csproj | 98 +++++ Update/Update/WebClientUtils.cs | 144 +++++++ Update/Update/Win32.cs | 70 +++ Update/Update/app.config | 3 + Update/Update/packages.config | 4 + Update/Update/update.ico | Bin 0 -> 16958 bytes 20 files changed, 1697 insertions(+), 3 deletions(-) create mode 100644 Update/Update.sln create mode 100644 Update/Update/MainForm.cs create mode 100644 Update/Update/MainForm.designer.cs create mode 100644 Update/Update/MainForm.resx create mode 100644 Update/Update/Program.cs create mode 100644 Update/Update/Properties/AssemblyInfo.cs create mode 100644 Update/Update/Properties/Resources.Designer.cs create mode 100644 Update/Update/Properties/Resources.resx create mode 100644 Update/Update/Properties/Settings.Designer.cs create mode 100644 Update/Update/Properties/Settings.settings create mode 100644 Update/Update/Update.csproj create mode 100644 Update/Update/WebClientUtils.cs create mode 100644 Update/Update/Win32.cs create mode 100644 Update/Update/app.config create mode 100644 Update/Update/packages.config create mode 100644 Update/Update/update.ico diff --git a/AllBase/BaseClass.cs b/AllBase/BaseClass.cs index 0397013..3dff292 100644 --- a/AllBase/BaseClass.cs +++ b/AllBase/BaseClass.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; +using System.IO; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; @@ -26,7 +27,7 @@ namespace AllBase /// /// 版本ID /// - public static int VersionCount = 357; + public static int VersionCount = 358; /// /// 版本号 @@ -614,6 +615,29 @@ namespace AllBase return BitConverter.ToString(output).Replace("-", ""); } + /// + /// 获取文件MD5值 + /// + /// + /// + public static string GetFileMd5(string FilePath) + { + try + { + FileStream get_file = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read); + System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); + byte[] hash_byte = get_md5.ComputeHash(get_file); + string resule = System.BitConverter.ToString(hash_byte); + resule = resule.Replace("-", ""); + get_file.Close(); + return resule; + } + catch (Exception e) + { + return e.ToString(); + } + } + /// /// MD5加密 /// diff --git a/TEMUKJD/Program.cs b/TEMUKJD/Program.cs index a6e1c6e..5b697aa 100644 --- a/TEMUKJD/Program.cs +++ b/TEMUKJD/Program.cs @@ -25,6 +25,7 @@ namespace TemuKJD //安装客户端必备字体 InstallFont(Application.StartupPath + @"\Fonts\STZHONGS.TTF"); + StartUp.CheckUpdate(); System.Threading.Tasks.Task.Run(() => { new Initialization().Get(); diff --git a/TEMUKJD/StartUp.cs b/TEMUKJD/StartUp.cs index 92642e9..e7e5f15 100644 --- a/TEMUKJD/StartUp.cs +++ b/TEMUKJD/StartUp.cs @@ -504,5 +504,60 @@ namespace TemuKJD if (ViolateRuleParam.LstViolateRuleNameSelect != null) NaiBa.Util.Helper.ConfigHelper.SaveConfig>("violate_rule_name_select", ViolateRuleParam.LstViolateRuleNameSelect); } + + public static void CheckUpdate() + { + try + { + // while (true) + { + string updatefilepath = System.Environment.CurrentDirectory + "\\Update.exe"; + var url = BaseClass.BuildObjString("update/get_update"); + var data = UserLogin.GetSignaturex(); + var html = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) + return; + + var updateExeChk = BaseRegex.GetStringJson(ref html, "exe_check").ParseToString(); + var updateExeAddress = BaseRegex.GetStringJson(ref html, "exe_address"); + var updateFileAddress = BaseRegex.GetStringJson(ref html, "file_address"); + var newVersion = BaseRegex.GetIntJson(ref html, "next_version").ParseToInt(); + + if (File.Exists(updatefilepath)) + { + string fc = BaseClass.GetFileMd5(updatefilepath); + if (fc != updateExeChk) + { + NaiBa.Util.Helper.HttpHelper.DownloadFile(updateExeAddress, updatefilepath); + } + } + else // 如果自动更新exe文件不存在,则强制更新exe文件 + NaiBa.Util.Helper.HttpHelper.DownloadFile(updateExeAddress, updatefilepath); + + if (newVersion > BaseClass.VersionCount) + { + try + { + if (File.Exists(updatefilepath)) + { + File.WriteAllText(System.Environment.CurrentDirectory + "\\UpdateConfig.ini", + "TemuKJD.exe\r\n" + + BaseClass.VersionCount + "\r\n" + + newVersion + "\r\n" + + updateFileAddress); + + Process.Start(updatefilepath); + } + } + catch (Exception ex) + { + BaseMsgForm.ShowError(ex.Message); + } + } + //Thread.Sleep(1000 * 60 * 60); + } + } + catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } + } } } diff --git a/TEMUKJD/UserForm/LoginForm.cs b/TEMUKJD/UserForm/LoginForm.cs index ceed620..a8109aa 100644 --- a/TEMUKJD/UserForm/LoginForm.cs +++ b/TEMUKJD/UserForm/LoginForm.cs @@ -40,8 +40,17 @@ namespace TemuKJD.UserForm { GetUserList(); #if DEBUG - grpEnvironmentChoice.Visible = true; - pnlShowRemember.Visible = true; + if (File.Exists(System.Environment.CurrentDirectory + "\\TemuKJD.exe.choice.debug.tools")) + { + grpEnvironmentChoice.Visible = true; + pnlShowRemember.Visible = true; + } + else + { + grpEnvironmentChoice.Visible = false; + pnlShowRemember.Visible = false; + rbtPrd.Checked = true; + } #else grpEnvironmentChoice.Visible = false; pnlShowRemember.Visible = false; diff --git a/Update/Update.sln b/Update/Update.sln new file mode 100644 index 0000000..436c9fd --- /dev/null +++ b/Update/Update.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31424.327 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Update", "Update\Update.csproj", "{A170CD54-8361-401B-842B-6B24387F07A5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A170CD54-8361-401B-842B-6B24387F07A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A170CD54-8361-401B-842B-6B24387F07A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A170CD54-8361-401B-842B-6B24387F07A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A170CD54-8361-401B-842B-6B24387F07A5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {163B8880-80D1-40DE-9082-BB270299C75B} + EndGlobalSection +EndGlobal diff --git a/Update/Update/MainForm.cs b/Update/Update/MainForm.cs new file mode 100644 index 0000000..8e4efb1 --- /dev/null +++ b/Update/Update/MainForm.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Update +{ + public partial class MainForm : Form + { + public string Title { get { return Text; } set { Text = value; } } + private Point mouseOffset; // 记录鼠标指针的坐标 + private bool isMouseDown; // 记录鼠标左键是否按下 + + public MainForm() + { + InitializeComponent(); + + this.TopMost = true; + } + + private void MessageForm_Paint(object sender, PaintEventArgs e) + { + SetFormRoundRectRgn(this, 7); + SetFormRoundRectRgn(panel2, 7); + SetFormRoundRectRgn(this.btnOk, 7); + } + + private void btnOk_Click(object sender, EventArgs e) + { + if (lblMessage.Text == "升级完成,点击确定重启程序") + { + string mainPath = System.Environment.CurrentDirectory + "\\" + Program.softName + ".exe"; + System.Diagnostics.Process.Start(mainPath); + Application.Exit(); + return; + } + + btnOk.Enabled = false; + + CloseMainProgram(); + + if (!System.IO.Directory.Exists("upBak")) + System.IO.Directory.CreateDirectory("upBak"); + var upBakPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "upBak"; + if (!System.IO.Directory.Exists("upTemp")) + System.IO.Directory.CreateDirectory("upTemp"); + var upTempPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "upTemp"; + + + this.lblMessage.Text = "升级中请稍候..."; + progressBar1.Visible = true; + progressBar1.Maximum = 1;//fileNameArr.Count(); + progressBar1.Value = 0; + new TaskFactory().StartNew(() => + { + bool result = Program.DownloadFile(Program.updateUrl, upTempPath + "\\" + Program.updateUrl.Substring(Program.updateUrl.LastIndexOf("/") + 1)); + + if (result) + { + Thread.Sleep(50); + Invoke(new Action(() => + { + lblMessage.Text = "升级完成,点击确定重启程序"; + btnOk.Enabled = true; + })); + } + else + { + Invoke(new Action(() => + { + this.lblMessage.Text = "升级失败,未获取到升级文件"; + btnOk.Enabled = true; + })); + } + + //var fileNames = Program.updateUrl; + //var fileNameArr = fileNames.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries); + + //if (fileNameArr.Count() > 0) + //{ + // foreach (var path in fileNameArr) + // { + // Thread.Sleep(new Random().Next(500, 1000)); + + // var localPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + path.Substring(path.LastIndexOf("/") + 1); + // var tempPath = upBakPath + "\\" + path.Substring(path.LastIndexOf("/") + 1); + // File.Copy(localPath, tempPath, true); + + // if (!result) + // { + // Invoke(new Action(() => + // { + // this.lblMessage.Text = "升级失败,请稍后点击确定重试"; + // btnOk.Enabled = true; + // })); + // return; + // } + // else + // { + // Invoke(new Action(() => + // { + // if (progressBar1.Value < progressBar1.Maximum) + // progressBar1.Value++; + // })); + // } + + // } + //} + //else + //{ + // this.lblMessage.Text = "升级失败,未获取到升级文件"; + // btnOk.Enabled = true; + //} + }); + } + + /// + /// 拷贝文档目录 + /// + /// + /// + public static void CopyDirectory(string srcPath, string destPath) + { + try + { + DirectoryInfo dir = new DirectoryInfo(srcPath); + FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //获取目录下(不包含子目录)的文件和子目录 + foreach (FileSystemInfo i in fileinfo) + { + if (i is DirectoryInfo) //判断是否文件夹 + { + if (!Directory.Exists(destPath + "\\" + i.Name)) + { + Directory.CreateDirectory(destPath + "\\" + i.Name); //目标目录下不存在此文件夹即创建子文件夹 + } + CopyDirectory(i.FullName, destPath + "\\" + i.Name); //递归调用复制子文件夹 + } + else + { + File.Copy(i.FullName, destPath + "\\" + i.Name, true); //不是文件夹即复制文件,true表示可以覆盖同名文件 + } + } + } + catch (Exception e) + { + throw; + } + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void panel1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + mouseOffset = new Point(-e.X, -e.Y); + isMouseDown = true; + } + } + + private void panel1_MouseUp(object sender, MouseEventArgs e) + { + isMouseDown = false; + } + + private void panel1_MouseMove(object sender, MouseEventArgs e) + { + if (isMouseDown) + { + // 获取鼠标的位置 + Point mousePos = MousePosition; + mousePos.Offset(mouseOffset.X, mouseOffset.Y); + Location = mousePos; + } + } + + public static void SetFormRoundRectRgn(Control c, int rgnRadius) + { + int hRgn = 0; + hRgn = Win32.CreateRoundRectRgn(0, 0, c.Width + 1, c.Height + 1, rgnRadius, rgnRadius); + Win32.SetWindowRgn(c.Handle, hRgn, true); + Win32.DeleteObject(hRgn); + } + + private void btnClose_Click(object sender, EventArgs e) + { + Application.Exit(); + } + + private void CloseMainProgram() + { + string in_sAppName = Program.softName; //(一个word文档程序) + + try + { + System.Diagnostics.Process[] psiNewcas = System.Diagnostics.Process.GetProcessesByName(in_sAppName); + + foreach (System.Diagnostics.Process p in psiNewcas) + { + p.Kill(); + //p.WaitForExit(); + //p.Close(); + //Console.WriteLine(in_sAppName + "已经停止了"); + } + } + catch + { + Console.WriteLine(in_sAppName + "停止失败"); + } + } + } + + public enum FormLevel + { + SMALL, + MEDIUM, + LARGE = 500 + } + + +} diff --git a/Update/Update/MainForm.designer.cs b/Update/Update/MainForm.designer.cs new file mode 100644 index 0000000..60a82e8 --- /dev/null +++ b/Update/Update/MainForm.designer.cs @@ -0,0 +1,166 @@ + +namespace Update +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.lblMessage = new System.Windows.Forms.Label(); + this.btnOk = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.panel1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // lblMessage + // + this.lblMessage.Location = new System.Drawing.Point(14, 12); + this.lblMessage.Name = "lblMessage"; + this.lblMessage.Size = new System.Drawing.Size(224, 69); + this.lblMessage.TabIndex = 0; + this.lblMessage.Text = "发现新版本,即将为您升级!"; + this.lblMessage.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // btnOk + // + this.btnOk.BackColor = System.Drawing.Color.Blue; + this.btnOk.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnOk.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); + this.btnOk.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnOk.Font = new System.Drawing.Font("微软雅黑", 11F); + this.btnOk.ForeColor = System.Drawing.Color.White; + this.btnOk.Location = new System.Drawing.Point(129, 137); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(109, 30); + this.btnOk.TabIndex = 9; + this.btnOk.TabStop = false; + this.btnOk.Text = "确 定"; + this.btnOk.UseVisualStyleBackColor = false; + this.btnOk.Click += new System.EventHandler(this.btnOk_Click); + // + // btnCancel + // + this.btnCancel.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnCancel.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); + this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnCancel.Font = new System.Drawing.Font("微软雅黑", 11F); + this.btnCancel.ForeColor = System.Drawing.Color.Blue; + this.btnCancel.Location = new System.Drawing.Point(14, 137); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(109, 30); + this.btnCancel.TabIndex = 10; + this.btnCancel.TabStop = false; + this.btnCancel.Text = "取 消"; + this.btnCancel.UseVisualStyleBackColor = false; + this.btnCancel.Visible = false; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.Blue; + this.panel1.Controls.Add(this.btnClose); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(256, 16); + this.panel1.TabIndex = 11; + this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); + this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove); + this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp); + // + // btnClose + // + this.btnClose.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnClose.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); + this.btnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnClose.Font = new System.Drawing.Font("微软雅黑", 11F); + this.btnClose.ForeColor = System.Drawing.Color.White; + this.btnClose.Location = new System.Drawing.Point(240, -8); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(17, 28); + this.btnClose.TabIndex = 11; + this.btnClose.TabStop = false; + this.btnClose.Text = "x"; + this.btnClose.UseVisualStyleBackColor = false; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.White; + this.panel2.Controls.Add(this.progressBar1); + this.panel2.Controls.Add(this.lblMessage); + this.panel2.Controls.Add(this.btnOk); + this.panel2.Controls.Add(this.btnCancel); + this.panel2.Location = new System.Drawing.Point(2, 16); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(252, 178); + this.panel2.TabIndex = 12; + // + // progressBar1 + // + this.progressBar1.Location = new System.Drawing.Point(14, 95); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(224, 23); + this.progressBar1.TabIndex = 11; + this.progressBar1.Visible = false; + // + // MainForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))); + this.ClientSize = new System.Drawing.Size(256, 196); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.Font = new System.Drawing.Font("微软雅黑", 10F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "MessageForm"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.MessageForm_Paint); + this.panel1.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblMessage; + private System.Windows.Forms.Button btnOk; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.ProgressBar progressBar1; + } +} \ No newline at end of file diff --git a/Update/Update/MainForm.resx b/Update/Update/MainForm.resx new file mode 100644 index 0000000..e836480 --- /dev/null +++ b/Update/Update/MainForm.resx @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEIAAMQOAADEDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAecEhK3nBIZB5wSHYecEh+nnBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + IfR5wSHUecEhkHnBISwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEGecEhlHnBIf15wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH9ecEhmHnBIQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEGecEhu3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSG9ecEhBgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhlXnB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIZUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAecEhLHnBIfx5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH8ecEhLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIY95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIZAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSHXecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh2HnBIVJ5wSENAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSENecEhUnnBIdh5wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh+XnB + If95wSH/ecEh/3nBIf95wSH/ecEh13nBIRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEQecEh13nB + If95wSH/ecEh/3nBIf95wSH/ecEh8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIVIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIVJ5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSEOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEMecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB + If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB + If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB + If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x05Ke8dO53vHTv97x07/e8dO/3vHTv97x07ke8dOSgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO5nvHTv97x07/e8dO/3vH + Tv97x07/e8dO/3vHTucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH + TuZ7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB + If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB7x05Je8dO5nvHTv97x07/e8dO/3vHTv97x07me8dOSQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB + If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB7x06Ae8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB + If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB + If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB + If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvHTv97x07/e8dO/3vHTv97x07/e8dO/3vH + Tv97x07/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x07/e8dO/3vH + Tv97x07/e8dO/3vHTv97x07/e8dO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB + If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB + If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB + If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB + If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x07/e8dO/3vHTv97x07/e8dO/3vH + Tv97x07/e8dO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vH + Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB + If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHvHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB + If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB + If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vHTv97x07/e8dO/3vH + Tv97x07/e8dO/3vHTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH + Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB + If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB + If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vH + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvHTot7x07de8dO3XvHTt17x07de8dO3XvHTv97x07/e8dO/3vH + Tv97x07/e8dO/3vHTv97x07/e8dO3XvHTt17x07de8dO3XvHTt17x06MAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x04Ge8dOvXvHTv97x07/e8dO/3vH + Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x069e8dOBgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB + If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB + If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH + Tg17x07Ie8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vH + Tv97x07Ie8dODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB + If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAe8dOFXvHTtZ7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vH + Tv97x07/e8dO/3vHTv97x07We8dOFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x04ce8dO43vHTv97x07/e8dO/3vH + Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07je8dOHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB + If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH + TiZ7x07qe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07qe8dOJgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB + If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB + If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAe8dONXvHTvB7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07we8dONgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB + If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x05Ce8dO+XvHTv97x07/e8dO/3vH + Tv97x075e8dOQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH + Tk57x078e8dO/3vHTv97x078e8dOTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB + If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAe8dOYnvHTv57x07+e8dOYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB + If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB + If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x053e8dOdwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSEOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAB5wSEMecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEhUgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhUnnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIfl5wSH/ecEh/3nB + If95wSH/ecEh/3nBIdh5wSEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhEHnBIdh5wSH/ecEh/3nB + If95wSH/ecEh/3nBIfkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB5wSHXecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh2nnBIVJ5wSEOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEOecEhUnnB + Idp5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSHXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAecEhj3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEhjwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBISt5wSH8ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/HnB + ISsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhlXnB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHnBIQZ5wSG7ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIb15wSEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhBnnBIZR5wSH9ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/XnBIZh5wSEJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhKnnB + IY55wSHXecEh+HnBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB + If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIfh5wSHWecEhjnnBISoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/////////////////////////////////////////////////////////////////8AAAAAA + A///AAAAAAAA//4AAAAAAAB//gAAAAAAAH/8AAAAAAAAP/wAAAAAAAA//AD/////AD/8A//////AP/wH + /////+A//Af/////4D/8D//////wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A////// + 8D/8D//////wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP + //AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//8A// + 8D/8D/wAAD/wP/wP/AAAP/A//A/+AAB/8D/8D/8AAP/wP/wP/4AB//A//A//wAP/8D/8D//gB//wP/wP + //AP//A//A//+B//8D/8D//8P//wP/wP//5///A//Af/////4D/8B//////gP/wD/////8A//AD///// + AD/8AAAAAAAAP/wAAAAAAAA//gAAAAAAAH/+AAAAAAAAf/8AAAAAAAD//8AAAAAAA/////////////// + //////////////////////////////////////////////////8= + + + \ No newline at end of file diff --git a/Update/Update/Program.cs b/Update/Update/Program.cs new file mode 100644 index 0000000..bc3fabc --- /dev/null +++ b/Update/Update/Program.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace Update +{ + static class Program + { + public static string softName = ""; + public static int oldVersion = 0; + public static int newVersion = 0; + public static string updateUrl = ""; + public static List updateFileUrls = new List(); + + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + if (File.Exists("UpdateConfig.ini")) + { + try + { + var text = File.ReadAllText("UpdateConfig.ini"); + File.Delete("UpdateConfig.ini"); + + var arr = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length > 3) + { + softName = arr[0]; + oldVersion = Convert.ToInt32(arr[1]); + newVersion = Convert.ToInt32(arr[2]); + updateUrl = arr[3]; + + if (oldVersion == 0 || string.IsNullOrEmpty(softName) || string.IsNullOrEmpty(updateUrl)) + return; + + if (newVersion > oldVersion) + { + //Application.Current.Shutdown(); // 强制升级 + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } + } + catch (Exception ex) { } + } + } + + public static string HttpRequestPost(string url, string postData, string cookies = "", string codeType = "utf-8", string accept = "", string contentType = "") + { + HttpWebResponse response = null; + string result; + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "POST"; + request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; + if (!string.IsNullOrEmpty(accept)) + request.Accept = accept; + request.ContentType = "application/x-www-form-urlencoded; charset=" + codeType; + if (!string.IsNullOrEmpty(contentType)) + request.ContentType = contentType; + + request.Referer = url; + request.AllowAutoRedirect = false; + if (!string.IsNullOrEmpty(cookies)) + request.Headers.Set(HttpRequestHeader.Cookie, cookies); + + byte[] byteData = Encoding.GetEncoding(codeType).GetBytes(postData); + request.ContentLength = byteData.Length; + using (Stream requestStream = request.GetRequestStream()) + { + requestStream.Write(byteData, 0, byteData.Length); + } + + response = (HttpWebResponse)request.GetResponse(); + } + catch (WebException ex) + { + if (ex.Status == WebExceptionStatus.ProtocolError) + { + response = (HttpWebResponse)ex.Response; + result = ReadResponse(response); + if (response != null) response.Close(); + return result; + } + else return ex.Message; + } + catch (Exception e) + { + if (response != null) response.Close(); + return e.Message; + } + result = ReadResponse(response); + if (response != null) response.Close(); + return result; + } + + public static string ReadResponse(HttpWebResponse response) + { + using (Stream responseStream = response.GetResponseStream()) + { + Stream streamToRead = responseStream; + if (response.ContentEncoding.ToLower().Contains("gzip")) + { + streamToRead = new GZipStream(streamToRead, CompressionMode.Decompress); + } + else if (response.ContentEncoding.ToLower().Contains("deflate")) + { + streamToRead = new DeflateStream(streamToRead, CompressionMode.Decompress); + } + + using (StreamReader streamReader = new StreamReader(streamToRead, Encoding.UTF8)) + { + return streamReader.ReadToEnd(); + } + } + } + + /// + /// 获取json中的int值 + /// + /// + /// + /// + public static int GetIntJson(ref string html, string reg) + { + string temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*['""]([^']+?)['""]"); + if (string.IsNullOrEmpty(temp)) + temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*([\d-]+)"); + int i; + if (int.TryParse(temp, out i)) + return i; + return 0; + } + + /// + /// 获取字符串 + /// + /// + /// + /// + public static string GetStringJson(ref string html, string reg) + { + string temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*['""]([^']+?)['""]"); + if (string.IsNullOrEmpty(temp)) + temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*([\d]+)"); + if (!string.IsNullOrEmpty(temp) && temp.Contains("\"")) + temp = temp.Substring(0, temp.IndexOf("\"")); + if (!string.IsNullOrEmpty(temp) && temp.Contains("'")) + temp = temp.Substring(0, temp.IndexOf("'")); + return temp; + } + + /// + /// 返回单个正则匹配项 + /// + /// + /// + /// + public static string GetMatchRegexString(string sourceString, string RegexString) + { + if (!string.IsNullOrEmpty(sourceString)) + { + MatchCollection mc = Regex.Matches(sourceString, RegexString, RegexOptions.IgnoreCase); + if (mc.Count > 0) + { + return mc[0].Groups[1].Value.ToString(); + } + } + return null; + } + + /// + /// 下载文件 + /// + /// 下载地址 + /// 保存目录 + /// + public static bool DownloadFile(string Urlstring, string FilePath) + { + try + { + WebClientUtils webClient = new WebClientUtils(); + webClient.Timeout = 300; + if (File.Exists(FilePath)) + File.Delete(FilePath); + webClient.DownloadFile(Urlstring, FilePath); + return true; + } + catch (Exception ex) + { + return false; + } + } + } +} diff --git a/Update/Update/Properties/AssemblyInfo.cs b/Update/Update/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2866b10 --- /dev/null +++ b/Update/Update/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Update")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Update")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("a170cd54-8361-401b-842b-6b24387f07a5")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Update/Update/Properties/Resources.Designer.cs b/Update/Update/Properties/Resources.Designer.cs new file mode 100644 index 0000000..95ddb3e --- /dev/null +++ b/Update/Update/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Update.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("Update.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Update/Update/Properties/Resources.resx b/Update/Update/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Update/Update/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/Update/Update/Properties/Settings.Designer.cs b/Update/Update/Properties/Settings.Designer.cs new file mode 100644 index 0000000..74146ed --- /dev/null +++ b/Update/Update/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Update.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Update/Update/Properties/Settings.settings b/Update/Update/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Update/Update/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Update/Update/Update.csproj b/Update/Update/Update.csproj new file mode 100644 index 0000000..4e7ecde --- /dev/null +++ b/Update/Update/Update.csproj @@ -0,0 +1,98 @@ + + + + + Debug + AnyCPU + {A170CD54-8361-401B-842B-6B24387F07A5} + WinExe + Update + Update + v4.5.2 + 512 + true + + + + AnyCPU + true + full + false + ..\..\bin\ + DEBUG;TRACE + prompt + 4 + Off + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + update.ico + + + + ..\packages\Tencent.QCloud.Cos.Sdk.5.4.48\lib\net45\COSXML.dll + + + + + + + + + + + + + + + Form + + + MainForm.cs + + + + + Component + + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/Update/Update/WebClientUtils.cs b/Update/Update/WebClientUtils.cs new file mode 100644 index 0000000..267f420 --- /dev/null +++ b/Update/Update/WebClientUtils.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Cache; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Text; + +namespace Update +{ + public class WebClientUtils : WebClient + {/// + /// 默认超时多少秒 + /// + public int Timeout = 100; + /// + /// 允许自动重定向 + /// + public bool AllowAutoRedirect = true; + public bool IsDelete = false; + + private string OutIP = ""; + /// + /// 证书列表 + /// + public static List X509List = new List(); + /// + /// 绑定IP + /// + /// + public WebClientUtils(string outIp) + { + OutIP = outIp; + CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); + } + + public WebClientUtils() + { + } + /// + /// 重写 + /// + /// + /// + protected override WebRequest GetWebRequest(Uri address) + { + string s = address.ToString(); + if (string.IsNullOrEmpty(s) || s.Length < 7 || !(s.Substring(0, 7).ToLower() == "http://" || s.Substring(0, 8).ToLower() == "https://")) + return null; + var request = (HttpWebRequest)base.GetWebRequest(address); + request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; + request.Timeout = 1000 * Timeout; + request.ReadWriteTimeout = 500 * Timeout; + request.AllowAutoRedirect = AllowAutoRedirect; + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); + if (IsDelete) + request.Method = "DELETE"; + if (!string.IsNullOrEmpty(OutIP)) + { + request.ServicePoint.BindIPEndPointDelegate = (servicePoint, remoteEndPoint, retryCount) => + { + servicePoint.MaxIdleTime = 20; + return new IPEndPoint(IPAddress.Parse(OutIP), 0); + }; + } + if (request.RequestUri.Scheme == "https") //挂接验证服务端证书的回调 + { + X509Certificate2 x509c = null; + for (int i = 0; i < X509List.Count; i++) + { + if (X509List[i].Domain.ToLower() == address.Host.ToLower()) + { + x509c = X509List[i].X509; + break; + } + } + if (x509c == null) + { + ServicePointManager.ServerCertificateValidationCallback = + new RemoteCertificateValidationCallback(RemoteCertificateValidationCallback); + try + { + X509Store _store = new X509Store(StoreName.My, StoreLocation.LocalMachine); + _store.Open(OpenFlags.ReadWrite); + string findValue = Dns.GetHostName(); //获取本地主机名称作为证书查找的参数 + X509Certificate2Collection _certsCollection = + _store.Certificates.Find(X509FindType.FindByIssuerName, findValue, false); + if (_certsCollection.Count > 0) + { + x509c = _certsCollection[0]; + request.ClientCertificates.Add(x509c); + } + } + catch { } + + } + } + return request; + } + + /// + /// 获取证书 + /// + /// + /// + /// + /// + /// + public bool RemoteCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + return true; + } + + public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + //if (sslPolicyErrors == SslPolicyErrors.None) { + // return true; + //} + + //Console.WriteLine("Certificate error: {0}", sslPolicyErrors); + + //// Do not allow this client to communicate with unauthenticated servers. + //return false; + + return true; + } + } + + /// + /// 网站证书 + /// + public class Certificate + { + /// + /// 域名 + /// + public string Domain { get; set; } + /// + /// 证书 + /// + public X509Certificate2 X509 { get; set; } + } +} diff --git a/Update/Update/Win32.cs b/Update/Update/Win32.cs new file mode 100644 index 0000000..c5668e6 --- /dev/null +++ b/Update/Update/Win32.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Update +{ + public class Win32 + { + #region Window Const + + public const int WM_ERASEBKGND = 0x0014; + public const int WM_LBUTTONDOWN = 0x0201; + public const int WM_LBUTTONUP = 0x0202; + public const int WM_LBUTTONDBLCLK = 0x0203; + public const int WM_WINDOWPOSCHANGING = 0x46; + public const int WM_PAINT = 0xF; + public const int WM_CREATE = 0x0001; + public const int WM_ACTIVATE = 0x0006; + public const int WM_NCCREATE = 0x0081; + public const int WM_NCCALCSIZE = 0x0083; + public const int WM_NCPAINT = 0x0085; + public const int WM_NCACTIVATE = 0x0086; + public const int WM_NCLBUTTONDOWN = 0x00A1; + public const int WM_NCLBUTTONUP = 0x00A2; + public const int WM_NCLBUTTONDBLCLK = 0x00A3; + public const int WM_NCMOUSEMOVE = 0x00A0; + + public const int WM_NCHITTEST = 0x0084; + + public const int HTLEFT = 10; + public const int HTRIGHT = 11; + public const int HTTOP = 12; + public const int HTTOPLEFT = 13; + public const int HTTOPRIGHT = 14; + public const int HTBOTTOM = 15; + public const int HTBOTTOMLEFT = 0x10; + public const int HTBOTTOMRIGHT = 17; + public const int HTCAPTION = 2; + public const int HTCLIENT = 1; + + public const int WM_FALSE = 0; + public const int WM_TRUE = 1; + + + + #endregion + + #region Public extern methods + + [DllImport("gdi32.dll")] + public static extern int CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3); + + [DllImport("user32.dll")] + public static extern int SetWindowRgn(IntPtr hwnd, int hRgn, Boolean bRedraw); + + [DllImport("gdi32.dll", EntryPoint = "DeleteObject", CharSet = CharSet.Ansi)] + public static extern int DeleteObject(int hObject); + + [DllImport("user32.dll")] + public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); + + [DllImport("user32.dll")] + public static extern bool ReleaseCapture(); + + #endregion + } +} diff --git a/Update/Update/app.config b/Update/Update/app.config new file mode 100644 index 0000000..ff99501 --- /dev/null +++ b/Update/Update/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Update/Update/packages.config b/Update/Update/packages.config new file mode 100644 index 0000000..54163b8 --- /dev/null +++ b/Update/Update/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Update/Update/update.ico b/Update/Update/update.ico new file mode 100644 index 0000000000000000000000000000000000000000..54e8eb1a733fbb8c96da98df8e630aac1b0828fd GIT binary patch literal 16958 zcmeHO!DPXYB3LXxXqC*&3n5%LN85h5OT?~2JG0sln;D+u}lArV0c zC<%C4&_h|TDlqet+59Pm%y1Ga&=(M*%gAPqw;q{;f_@ldJ)Ts;pT z)#bL7Z_@ds3Gh9$AJY4Kyi;AbrCfh2pS1aOOEvg-Fpr<0>v=%iO`mS5Vl5u&eXHhc z>DJ=meqMaodIX#S8N)Za#`C3PE!|o?Tt7UXGT&|;&Un6btfgCvhwC5V|CHxT$6C6z zc({J}-}Kag`eKvkOUGKewRoiZtLAIz*5aw^N4j21w-yiAj~;IW?mN#tZ}WWVSWCAS z57!^?KBxoFmyWe`Yw>XX(Z9F%f5S3@I3<@07V`pbHq{lceqt`+q!D-K=&N*u|f@Kt?2g+8oH?lT0GFd033}` z16s3SpGVoKrCW=Kbi>CY@KsO)%3Un$+0E0^t;J)t!Os%#y+jQtXUVRUMlIc1Jg$ED zdH{3-HK1z`-8Is4E!|o?TtED60KI}5&>VIsS39(HYw;AhfzK@r3tr0EDCjVrG9 zcpfVdD-bIXD-bKdE09T#4lzt;!;K1AKPPP2nC9c;BGL^^l441gb&_ksvr*St) z=d&*UhN8{0aa6wYbvQ~$pN(+b8t649*WI4VV`n;#C$o99I?nIr<21=*zeSPP!`8{b XCe@AA)7IHW`y8?kB@PzT!qUedl?m#2 literal 0 HcmV?d00001