diff --git a/KeyGo/AppControl.cs b/KeyGo/AppControl.cs index 03905b2..f91fa29 100644 --- a/KeyGo/AppControl.cs +++ b/KeyGo/AppControl.cs @@ -5,13 +5,13 @@ using System.Runtime.InteropServices; namespace KeyGo { - public class AppControl + public static class AppControl { /// /// 获取本应用程序当前正在运行的进程,若不存在则返回null /// /// 当前正在运行的进程 - private static Process GetCurrentRunningInstance() + public static Process GetCurrentRunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); @@ -36,21 +36,28 @@ namespace KeyGo /// 显示指定实例窗体 /// /// The instance. - private static void ShowWindow(Process instance) + public static void ShowWindow(Process instance) { if (instance != null && instance.MainWindowHandle != IntPtr.Zero) - ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.Show); - //SetForegroundWindow(instance.MainWindowHandle); + { + ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.ShowNormal); + SetForegroundWindow(instance.MainWindowHandle); + } } /// /// 隐藏指定实例窗体 /// /// The instance. - public static void HideWindow(Process instance) + public static void MinimizeWindow(Process instance) { if (instance != null && instance.MainWindowHandle != IntPtr.Zero) - ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.Hide); + ShowWindowAsync(instance.MainWindowHandle, (int)CmdShow.Minimize); + } + + public static bool IsForegroundWindow(Process instance) + { + return GetForegroundWindow() == instance.MainWindowHandle; } private enum CmdShow : int @@ -139,5 +146,8 @@ namespace KeyGo [DllImport("User32.dll")] private static extern bool SetForegroundWindow(System.IntPtr hWnd); + + [DllImport("User32.dll")] + private static extern IntPtr GetForegroundWindow(); } } \ No newline at end of file diff --git a/KeyGo/FormHotKey.Designer.cs b/KeyGo/FormHotKey.Designer.cs index e29f853..56f23fb 100644 --- a/KeyGo/FormHotKey.Designer.cs +++ b/KeyGo/FormHotKey.Designer.cs @@ -175,6 +175,7 @@ namespace KeyGo this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "热键设置"; + this.Load += new System.EventHandler(this.FormHotKey_Load); this.ResumeLayout(false); this.PerformLayout(); diff --git a/KeyGo/FormHotKey.cs b/KeyGo/FormHotKey.cs index 8903464..bb1c4b4 100644 --- a/KeyGo/FormHotKey.cs +++ b/KeyGo/FormHotKey.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using System.Windows.Forms; namespace KeyGo @@ -10,9 +11,53 @@ namespace KeyGo InitializeComponent(); } + public HotKeyItem HotKeyItem { get; set; } + private void FormHotKey_Load(object sender, EventArgs e) + { + if (HotKeyItem != null) + { + TxtProcessName.Text = HotKeyItem.ProcessName; + TxtStartupPath.Text = HotKeyItem.StartupPath; + TxtHotKey.Text = HotKeyItem.HotKey; + } + } + private void BtnAccept_Click(object sender, EventArgs e) { - DialogResult = DialogResult.OK; + if (string.IsNullOrWhiteSpace(TxtProcessName.Text)) + { + MessageBox.Show("请设置进程名", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (!string.IsNullOrWhiteSpace(TxtStartupPath.Text) && !File.Exists(TxtStartupPath.Text)) + { + MessageBox.Show("请选择有效的启动路径", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(TxtHotKey.Text)) + { + MessageBox.Show("请设置快捷键", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + bool Modified = true; + + if (HotKeyItem == null) + HotKeyItem = new HotKeyItem(); + else + Modified = !(HotKeyItem.ProcessName == TxtProcessName.Text && HotKeyItem.StartupPath == TxtStartupPath.Text && HotKeyItem.HotKey == TxtHotKey.Text); + + if (Modified) + { + HotKeyItem.ProcessName = TxtProcessName.Text.Trim(); + HotKeyItem.StartupPath = TxtStartupPath.Text.Trim(); + HotKeyItem.HotKey = TxtHotKey.Text; + DialogResult = DialogResult.OK; + } + else + { + DialogResult = DialogResult.Cancel; + } } private void TxtHotKey_KeyDown(object sender, KeyEventArgs e) @@ -40,7 +85,14 @@ namespace KeyGo { var p = frm.SelectedItem; TxtProcessName.Text = p.ProcessName; - TxtStartupPath.Text = p.MainModule.FileName; + try + { + TxtStartupPath.Text = p.MainModule.FileName; + } + catch (Exception ex) + { + MessageBox.Show("无法获取进程的启动路径:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } } } @@ -58,5 +110,6 @@ namespace KeyGo TxtStartupPath.Text = frm.FileName; } } + } } \ No newline at end of file diff --git a/KeyGo/FormMain.Designer.cs b/KeyGo/FormMain.Designer.cs index 84d69a9..dd2d8bd 100644 --- a/KeyGo/FormMain.Designer.cs +++ b/KeyGo/FormMain.Designer.cs @@ -29,41 +29,70 @@ namespace KeyGo /// private void InitializeComponent() { - this.BtnTest = new System.Windows.Forms.Button(); + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain)); + this.FLPHotKeys = new System.Windows.Forms.FlowLayoutPanel(); + this.BtnAdd = new System.Windows.Forms.Button(); + this.NotifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.FLPHotKeys.SuspendLayout(); this.SuspendLayout(); // - // BtnTest + // FLPHotKeys // - this.BtnTest.Location = new System.Drawing.Point(155, 162); - this.BtnTest.Name = "BtnTest"; - this.BtnTest.Size = new System.Drawing.Size(193, 66); - this.BtnTest.TabIndex = 0; - this.BtnTest.Text = "Test"; - this.BtnTest.UseVisualStyleBackColor = true; - this.BtnTest.Click += new System.EventHandler(this.button1_Click); + this.FLPHotKeys.AutoScroll = true; + this.FLPHotKeys.BackColor = System.Drawing.Color.White; + this.FLPHotKeys.Controls.Add(this.BtnAdd); + this.FLPHotKeys.Dock = System.Windows.Forms.DockStyle.Fill; + this.FLPHotKeys.Location = new System.Drawing.Point(0, 0); + this.FLPHotKeys.Margin = new System.Windows.Forms.Padding(0); + this.FLPHotKeys.Name = "FLPHotKeys"; + this.FLPHotKeys.Padding = new System.Windows.Forms.Padding(3); + this.FLPHotKeys.Size = new System.Drawing.Size(488, 197); + this.FLPHotKeys.TabIndex = 0; + // + // BtnAdd + // + this.BtnAdd.Image = global::KeyGo.Properties.Resources.ImgAdd; + this.BtnAdd.Location = new System.Drawing.Point(6, 6); + this.BtnAdd.Name = "BtnAdd"; + this.BtnAdd.Size = new System.Drawing.Size(110, 90); + this.BtnAdd.TabIndex = 0; + this.BtnAdd.UseVisualStyleBackColor = true; + this.BtnAdd.Click += new System.EventHandler(this.BtnAdd_Click); + // + // NotifyIcon + // + this.NotifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("NotifyIcon.Icon"))); + this.NotifyIcon.Visible = true; + this.NotifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseClick); // // FormMain // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(564, 390); - this.Controls.Add(this.BtnTest); + this.ClientSize = new System.Drawing.Size(488, 197); + this.Controls.Add(this.FLPHotKeys); this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.MaximizeBox = false; this.Name = "FormMain"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "KeyGo!"; + this.Deactivate += new System.EventHandler(this.FormMain_Deactivate); this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormMain_FormClosed); this.Load += new System.EventHandler(this.FormMain_Load); + this.FLPHotKeys.ResumeLayout(false); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.Button BtnTest; + private System.Windows.Forms.FlowLayoutPanel FLPHotKeys; + private System.Windows.Forms.Button BtnAdd; + private System.Windows.Forms.NotifyIcon NotifyIcon; } } diff --git a/KeyGo/FormMain.cs b/KeyGo/FormMain.cs index c861958..ae9a1f4 100644 --- a/KeyGo/FormMain.cs +++ b/KeyGo/FormMain.cs @@ -1,50 +1,63 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Diagnostics; -using System.Drawing; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; -using System.Xml.Serialization; namespace KeyGo { public partial class FormMain : Form { - static readonly string _DataFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "KeyGo", "HotKey.xml"); - readonly KeyGo _KeyGo; - + private static readonly string _DataFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "KeyGo", "HotKey.xml"); + private readonly KeyGo _KeyGo; + public FormMain() { InitializeComponent(); _KeyGo = LoadHotKeyItems(_DataFilePath); _KeyGo.FormHandle = Handle; + var p = Process.GetCurrentProcess(); + if (_KeyGo.Items.Count == 0) + { + _KeyGo.Items.Add(new HotKeyItem + { + ProcessName = p.ProcessName, + StartupPath = p.MainModule.FileName, + HotKey = "Ctrl+G", + }); + } _KeyGo.RegAllKey(); - } + FLPHotKeys.SuspendLayout(); + foreach (var item in _KeyGo.Items) + FLP_AddItem(item); + FLPHotKeys.ResumeLayout(); + } private void FormMain_Load(object sender, EventArgs e) { + Console.WriteLine(_DataFilePath); + } + private void FormMain_FormClosed(object sender, FormClosedEventArgs e) + { + _KeyGo.UnRegAllKey(); + SaveHotKeyItems(_KeyGo); } #region 数据文件IO private KeyGo LoadHotKeyItems(string xmlFilePath) { + KeyGo instance = null; try { - return KeyGo.LoadXml(xmlFilePath); + instance = KeyGo.LoadXml(xmlFilePath); } catch (Exception ex) { MessageBox.Show("载入数据文件异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } - return new KeyGo(); + return instance ?? new KeyGo(); } private void SaveHotKeyItems(KeyGo data) @@ -59,27 +72,12 @@ namespace KeyGo } } - #endregion - - private void FormMain_FormClosed(object sender, FormClosedEventArgs e) - { - _KeyGo.UnRegAllKey(); - } - - - - - - - - - - - - + #endregion 数据文件IO #region 窗体消息 热键回调 + private const int WM_HOTKEY = 0x312; + protected override void WndProc(ref Message m) { base.WndProc(ref m); @@ -90,10 +88,10 @@ namespace KeyGo break; } } - #endregion + #endregion 窗体消息 热键回调 - private void button1_Click(object sender, EventArgs e) + private void BtnTest_Click(object sender, EventArgs e) { //_KeyGo.Items.Add(new HotKeyItem //{ @@ -108,5 +106,79 @@ namespace KeyGo //SaveHotKeyItems(_KeyGo); //new FormHotKey().ShowDialog(); } + + private void BtnAdd_Click(object sender, EventArgs e) + { + var frm = new FormHotKey(); + if (frm.ShowDialog() == DialogResult.OK) + { + try + { + var item = frm.HotKeyItem; + _KeyGo.AddHotKey(item); + FLP_AddItem(item); + SaveHotKeyItems(_KeyGo); + } + catch (Exception ex) + { + MessageBox.Show("在添加新的热键时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void FLP_AddItem(HotKeyItem item) + { + var ucitem = new UCHotKeyItem + { + KeyGo = _KeyGo, + HotKeyItem = item, + }; + // 值改变则保存 + ucitem.ValueChangedEvent += (s, e) => SaveHotKeyItems(_KeyGo); + + // 添加到最后 + FLPHotKeys.Controls.Add(ucitem); + + // 与添加按钮交换位置 + var i1 = FLPHotKeys.Controls.GetChildIndex(ucitem); + var i2 = FLPHotKeys.Controls.GetChildIndex(BtnAdd); + FLPHotKeys.Controls.SetChildIndex(ucitem, i2); + FLPHotKeys.Controls.SetChildIndex(BtnAdd, i1); + } + + private void NotifyIcon_MouseClick(object sender, MouseEventArgs e) + { + // 如果点击托盘图标 + + // 当前在前台则隐藏 + if (Visible) + { + Hide(); + } + else + { + // 否则,显示窗体 + Show(); + + // 如果最小化状态,则切出窗体 + if (WindowState == FormWindowState.Minimized) + { + WindowState = FormWindowState.Normal; + } + else + { + // 否则,激活窗体到最前端 + TopMost = true; + TopMost = false; + } + } + } + + private void FormMain_Deactivate(object sender, EventArgs e) + { + // 如果最小化,则隐藏窗体 + if (WindowState == FormWindowState.Minimized) + Hide(); + } } } \ No newline at end of file diff --git a/KeyGo/FormMain.resx b/KeyGo/FormMain.resx index 1af7de1..2358fcf 100644 --- a/KeyGo/FormMain.resx +++ b/KeyGo/FormMain.resx @@ -117,4 +117,576 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclxI/25YSwNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKt3JYTIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EwPblxNK25YS1NuWEv/blhL/25YS9NuXEpPblxIgAAAAAAAAAAAAAAAAAAAAANuXEhXblxJ525YS49uW + Ev/blhLo25YRewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbkxAJ25YSY9uW + EtvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS6duXEj7blhIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cSBNuXEk7blhLU25YS/9uWEv/blhLz25cSk9uXEiEAAAAAAAAAAAAA + AAAAAAAA25cSFduWEnPblhLD25YSrNqWEUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMTBdqV + EhXblhIq25USVtuWErbblhL525YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJ025cSEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEF3JYRUduWEtTblhL/25YS/9uW + EvLblxKT25cSIgAAAAAAAAAAAAAAAAAAAADalBMK2pUTK9uWEigAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIJ25YSKduWElXblhKC25YSrduWEuDblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSqtuXEh0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuW + EQbblhFV25YS1NuWEv/blhL/25YS8duXEpPblxIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblhEQ25YSTtuWEqnblhLq25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EsTblxIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pUSCNqVEljblhLU25YS/9uWEv/blhLw25cSlNuXEiQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIi25YSeduWEsvblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhK02pYSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalRIJ2pUSW9uWEtTblhL/25YS/9uW + Eu3clhKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhEZ25YSi9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSpNuXERwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQrblxFd25YS1duWEv/blhL13JYSoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxIR25YSbNuW + EubblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uXEpDblxIXAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pcSC9qXElvblhKw25YSrNuWE1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADdmREE25cSRduWEs7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blxF53JcREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalBMF2pUTI9uWEivbmxINAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cREtuWEnvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/3JcSft2XEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEibblhKj25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9yWEqPclhIcAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxI525YSzNuW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLb3JcTPd2Y + FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADclRII25YSXduWEu/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEpLblxIc3ZkRAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiJFAHajBMI3JERENqS + EBnakxEh2pQTKdqUEjLalRI925URXtuVErPblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLm25YTcNuVEw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblREI25URQ9uW + Em3clhJ925USiNuVEpDblRKZ25USotuVEqrblhKz25YSvtuWEtfblhL425YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEtrblhJY25YSCgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIE25USOduWEsTblhLt25YS+9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YSy9qVEUTZlBEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YTDNuWEnfblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKy25cRLduXEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEhTblhKt25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS9tyWEpDfmRMV6KIXAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIQ25YSk9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhLo3JYSbdyXEgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA2pUTBNuVEzrblhLR25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEtralhFN2pYRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEM25YSbduWEvHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSsdiTExXRixcBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pYPAtuWESLblhKn25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EvDblhFb25YRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblhIG25YSQduWEtHblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS99qWEs7blhKb25YSctuWEoPblhKi25YS49uWEv3blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YSwN6YEx3gmRQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANyWEw7clhNx25YS89uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS2NuWEoTalhNE25USItyUEgvblxIU2pYRJtuW + ElfblhLE25YS+NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvbblhFq25YRBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADelhQC3JYSJtuWEqrblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS4NuWEmzclhMY4JkUAwAA + AAAAAAAAAAAAAAAAAADflRUG25YROduXEsvblhL825YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS0N2W + EyXelhQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQbblhJD25YS0tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS6tuW + EnXblhIUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhJh25cS49uWEv7blhL/25YS/9uW + Ev/blhL/25YS/9uWEvvblxF425cRBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YSEduWEnbblhL125YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWErPclhEvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pQSEdyX + Ep3blhL025YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS396XER/flxABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyXEQPblxIq25YSrNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKI3JYTFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclxNm25YS6duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJW25YSAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pcTB9qW + EkXblhLS25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSZ9yWFAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25URP9uWEuHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YRlduWEQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblxIN2pYSX9uWEt7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uV + EnzbkxARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEVbblhLm25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uXEtvTkAwKv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ZkRAdqWERXalhFr25YS2NuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blRKf2pUSJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADalhN925YS7tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL73JYTOtyWEwEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalg8C25YREduW + EkPblhKb25YS4duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS29uVEkvRixcDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADgmRQP2pYSt9uWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EoDblhICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclRMG3JUTG9uWETjblhFm25YSkNuXEpvblxKb25cSjNyXEmPblxJO2pYSZduW + EpjblhLY25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvvblhKq3JcSKwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25UTa9uWEuXblhL+25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhPM25YTAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclQ4C25UQDNuWERfblxIa25cSGtyX + EhbelxIL3JgSBtqXEgzblhIZ2pUSVNuWEsXblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS8tuWErDblhIvAAAAAAAAAAAAAAAAAAAAAAAAAADbmBIa25YSgtuWEt3blhL825YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS+NyXESYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqVEgrblhFA25YSrtuWEvfblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL225cRv9yWEW3clhM23JYUC9yWESzalhFo25YSuduW + EuzblhL925YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/dlRNOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YQBtqW + ETPalhKd25YS8NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvnblhLq25YS3tuW + EtbblhLc25YS6duWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YTaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADYlxEF2ZcRI9uXEnjblhLa25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9qVEYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANeXEALblxIO25YTStuWErPblhLz25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKaAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqV + EwbalhEk25cSeduWEtzblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/2pUSswAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclxI/25YSwNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKt3JYTIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EwPblxNK25YS1NuWEv/blhL/25YS9NuXEpPblxIgAAAAAAAAAAAAAAAAAAAAANuXEhXblxJ525YS49uW + Ev/blhLo25YRewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbkxAJ25YSY9uW + EtvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS6duXEj7blhIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cSBNuXEk7blhLU25YS/9uWEv/blhLz25cSk9uXEiEAAAAAAAAAAAAA + AAAAAAAA25cSFduWEnPblhLD25YSrNqWEUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMTBdqV + EhXblhIq25USVtuWErbblhL525YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJ025cSEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEF3JYRUduWEtTblhL/25YS/9uW + EvLblxKT25cSIgAAAAAAAAAAAAAAAAAAAADalBMK2pUTK9uWEigAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIJ25YSKduWElXblhKC25YSrduWEuDblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSqtuXEh0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuW + EQbblhFV25YS1NuWEv/blhL/25YS8duXEpPblxIjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblhEQ25YSTtuWEqnblhLq25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EsTblxIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pUSCNqVEljblhLU25YS/9uWEv/blhLw25cSlNuXEiQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIi25YSeduWEsvblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhK02pYSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalRIJ2pUSW9uWEtTblhL/25YS/9uW + Eu3clhKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhEZ25YSi9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25cSpNuXERwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQrblxFd25YS1duWEv/blhL13JYSoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxIR25YSbNuW + EubblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uXEpDblxIXAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA2pcSC9qXElvblhKw25YSrNuWE1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADdmREE25cSRduWEs7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blxF53JcREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalBMF2pUTI9uWEivbmxINAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25cREtuWEnvblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/3JcSft2XEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEibblhKj25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9yWEqPclhIcAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblxI525YSzNuW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLb3JcTPd2Y + FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADclRII25YSXduWEu/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEpLblxIc3ZkRAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANiJFAHajBMI3JERENqS + EBnakxEh2pQTKdqUEjLalRI925URXtuVErPblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhLm25YTcNuVEw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblREI25URQ9uW + Em3clhJ925USiNuVEpDblRKZ25USotuVEqrblhKz25YSvtuWEtfblhL425YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEtrblhJY25YSCgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblRIE25USOduWEsTblhLt25YS+9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YSy9qVEUTZlBEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YTDNuWEnfblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKy25cRLduXEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEhTblhKt25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS9tyWEpDfmRMV6KIXAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhIQ25YSk9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhLo3JYSbdyXEgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA2pUTBNuVEzrblhLR25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEtralhFN2pYRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclhEM25YSbduWEvHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSsdiTExXRixcBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pYPAtuWESLblhKn25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EvDblhFb25YRBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADblhIG25YSQduWEtHblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS99qWEs7blhKb25YSctuWEoPblhKi25YS49uWEv3blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YSwN6YEx3gmRQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANyWEw7clhNx25YS89uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS2NuWEoTalhNE25USItyUEgvblxIU2pYRJtuW + ElfblhLE25YS+NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvbblhFq25YRBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADelhQC3JYSJtuWEqrblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS4NuWEmzclhMY4JkUAwAA + AAAAAAAAAAAAAAAAAADflRUG25YROduXEsvblhL825YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS0N2W + EyXelhQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuX + EQbblhJD25YS0tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS6tuW + EnXblhIUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhJh25cS49uWEv7blhL/25YS/9uW + Ev/blhL/25YS/9uWEvvblxF425cRBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA25YSEduWEnbblhL125YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWErPclhEvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pQSEdyX + Ep3blhL025YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS396XER/flxABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyXEQPblxIq25YSrNuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKI3JYTFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclxNm25YS6duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhJW25YSAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pcTB9qW + EkXblhLS25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YSZ9yWFAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25URP9uWEuHblhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YRlduWEQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADblxIN2pYSX9uWEt7blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uV + EnzbkxARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEVbblhLm25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uXEtvTkAwKv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ZkRAdqWERXalhFr25YS2NuWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blRKf2pUSJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADalhN925YS7tuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL73JYTOtyWEwEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADalg8C25YREduW + EkPblhKb25YS4duWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS29uVEkvRixcDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADgmRQP2pYSt9uWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + EoDblhICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADclRMG3JUTG9uWETjblhFm25YSkNuXEpvblxKb25cSjNyXEmPblxJO2pYSZduW + EpjblhLY25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvvblhKq3JcSKwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25UTa9uWEuXblhL+25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhPM25YTAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADclQ4C25UQDNuWERfblxIa25cSGtyX + EhbelxIL3JgSBtqXEgzblhIZ2pUSVNuWEsXblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS8tuWErDblhIvAAAAAAAAAAAAAAAAAAAAAAAAAADbmBIa25YSgtuWEt3blhL825YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS+NyXESYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqVEgrblhFA25YSrtuWEvfblhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL225cRv9yWEW3clhM23JYUC9yWESzalhFo25YSuduW + EuzblhL925YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/dlRNOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YQBtqW + ETPalhKd25YS8NuWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEvnblhLq25YS3tuW + EtbblhLc25YS6duWEvnblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YTaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADYlxEF2ZcRI9uXEnjblhLa25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9qVEYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANeXEALblxIO25YTStuWErPblhLz25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhKaAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqV + EwbalhEk25cSeduWEtzblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW + Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/2pUSswAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA + + \ No newline at end of file diff --git a/KeyGo/HotKeyItem.cs b/KeyGo/HotKeyItem.cs index fdb75ca..dcea1c4 100644 --- a/KeyGo/HotKeyItem.cs +++ b/KeyGo/HotKeyItem.cs @@ -48,7 +48,7 @@ namespace KeyGo /// /// true if enabled; otherwise, false. /// - public bool Enabled { get; set; } + public bool Enabled { get; set; } = true; /// /// Gets or sets the trigger counter. @@ -64,7 +64,7 @@ namespace KeyGo /// /// The creation time. /// - public DateTime CreationTime { get; set; } + public DateTime CreationTime { get; set; } = DateTime.Now; /// /// Gets or sets the last modified time. @@ -72,6 +72,6 @@ namespace KeyGo /// /// The last modified time. /// - public DateTime LastModifiedTime { get; set; } + public DateTime LastModifiedTime { get; set; } = DateTime.Now; } } \ No newline at end of file diff --git a/KeyGo/KeyGo.cs b/KeyGo/KeyGo.cs index 9a5385e..7a37fb0 100644 --- a/KeyGo/KeyGo.cs +++ b/KeyGo/KeyGo.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; +using System.Linq; using System.Threading; using System.Windows.Forms; using System.Xml.Serialization; @@ -16,6 +18,7 @@ namespace KeyGo public List Items { get; set; } = new List(); + #region FILE IO /// @@ -58,24 +61,6 @@ namespace KeyGo #endregion - - /// - /// Processes the hotkey. - /// - /// The hot key identifier. - public void ProcessHotkey(int hotKey_id) - { - var hotkey = Items.Find(k => k.HotKeyID == hotKey_id); - if (hotkey != null) - { - ++hotkey.TriggerCounter; - MessageBox.Show($"ID:{hotkey.HotKeyID}\nKeys:{hotkey.HotKey}\nProcessName:{hotkey.ProcessName}\nStartupPath:{hotkey.StartupPath}", "HotKey", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - - - #region HotKey Register /// @@ -99,6 +84,7 @@ namespace KeyGo } } + /// /// Uns the reg all key. /// @@ -195,5 +181,84 @@ namespace KeyGo } #endregion + + /// + /// Processes the hotkey. + /// + /// The hot key identifier. + public void ProcessHotkey(int hotKey_id) + { + var hotkey = Items.Find(k => k.HotKeyID == hotKey_id); + if (hotkey != null) + { + ++hotkey.TriggerCounter; + + // 热键相应逻辑: + // 若应用未启动:启动应用 + // 若应用未在最前:激活窗体,推到最前 + // 若应用已在最前:最小化窗体 + + var process = Process.GetProcessesByName(hotkey.ProcessName).Where(p => p.MainWindowHandle != IntPtr.Zero).ToArray().FirstOrDefault(); + if (process != null) + { + if (AppControl.IsForegroundWindow(process)) + AppControl.MinimizeWindow(process); + else + AppControl.ShowWindow(process); + } + else + { + if (!string.IsNullOrWhiteSpace(hotkey.StartupPath) && File.Exists(hotkey.StartupPath)) + Process.Start(hotkey.StartupPath); + } + + Console.WriteLine($"ID:{hotkey.HotKeyID} Keys:{hotkey.HotKey} ProcessName:{hotkey.ProcessName}\nStartupPath:{hotkey.StartupPath}"); + } + } + + /// + /// 添加一个新热键 + /// + /// The item. + public void AddHotKey(HotKeyItem item) + { + if (item is null) + throw new ArgumentNullException(nameof(item)); + + Items.Add(item); + if (item.Enabled) + RegKey(item); + } + + /// + /// 删除一个热键 + /// + /// The item. + public void DelHotKey(HotKeyItem item) + { + if (item is null) + throw new ArgumentNullException(nameof(item)); + + Items.Remove(item); + + if (item.HotKeyID != 0) + UnRegKey(item); + } + + /// + /// 修改热键 + /// + /// The item. + public void ChangeHotKey(HotKeyItem item) + { + if (item is null) + throw new ArgumentNullException(nameof(item)); + + // 重新注册 + if (item.HotKeyID != 0) + UnRegKey(item); + if (item.Enabled) + RegKey(item); + } } } \ No newline at end of file diff --git a/KeyGo/KeyGo.csproj b/KeyGo/KeyGo.csproj index b148b9f..959cbcc 100644 --- a/KeyGo/KeyGo.csproj +++ b/KeyGo/KeyGo.csproj @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -32,6 +33,9 @@ prompt 4 + + KeyGo.ico + @@ -70,6 +74,12 @@ + + UserControl + + + UCHotKeyItem.cs + FormHotKey.cs @@ -87,7 +97,11 @@ True Resources.resx + True + + UCHotKeyItem.cs + SettingsSingleFileGenerator Settings.Designer.cs @@ -101,8 +115,14 @@ + - + + + + + + \ No newline at end of file diff --git a/KeyGo/KeyGo.ico b/KeyGo/KeyGo.ico new file mode 100644 index 0000000..8e3e9c2 Binary files /dev/null and b/KeyGo/KeyGo.ico differ diff --git a/KeyGo/Program.cs b/KeyGo/Program.cs index 1ee0e4b..b742d01 100644 --- a/KeyGo/Program.cs +++ b/KeyGo/Program.cs @@ -1,22 +1,27 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using System.Windows.Forms; namespace KeyGo { - static class Program + internal static class Program { /// /// 应用程序的主入口点。 /// [STAThread] - static void Main() + private static void Main() { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new FormMain()); + var p = AppControl.GetCurrentRunningInstance(); + if (p != null) + { + AppControl.ShowWindow(p); + } + else + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormMain()); + } } } -} +} \ No newline at end of file diff --git a/KeyGo/Properties/Resources.Designer.cs b/KeyGo/Properties/Resources.Designer.cs index 66926cc..d7af1bc 100644 --- a/KeyGo/Properties/Resources.Designer.cs +++ b/KeyGo/Properties/Resources.Designer.cs @@ -1,70 +1,113 @@ //------------------------------------------------------------------------------ // // 此代码由工具生成。 -// 运行时版本: 4.0.30319.42000 +// 运行时版本:4.0.30319.42000 // -// 对此文件的更改可能导致不正确的行为,如果 -// 重新生成代码,则所做更改将丢失。 +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ - -namespace KeyGo.Properties -{ +namespace KeyGo.Properties { + using System; + + /// - /// 强类型资源类,用于查找本地化字符串等。 + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// // 此类是由 StronglyTypedResourceBuilder // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [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 - { - + 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() - { + internal Resources() { } - + /// - /// 返回此类使用的缓存 ResourceManager 实例。 + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("KeyGo.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 - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgAdd { + get { + object obj = ResourceManager.GetObject("ImgAdd", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgDel { + get { + object obj = ResourceManager.GetObject("ImgDel", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgDisable { + get { + object obj = ResourceManager.GetObject("ImgDisable", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgEnable { + get { + object obj = ResourceManager.GetObject("ImgEnable", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap ImgSet { + get { + object obj = ResourceManager.GetObject("ImgSet", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/KeyGo/Properties/Resources.resx b/KeyGo/Properties/Resources.resx index af7dbeb..91703f5 100644 --- a/KeyGo/Properties/Resources.resx +++ b/KeyGo/Properties/Resources.resx @@ -46,7 +46,7 @@ mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 @@ -60,6 +60,7 @@ : and then encoded with base64 encoding. --> + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -109,9 +112,25 @@ 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 + + + ..\Resources\ImgAdd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgDel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgDisable.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgEnable.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ImgSet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/KeyGo/Resources/ImgAdd.png b/KeyGo/Resources/ImgAdd.png new file mode 100644 index 0000000..cef8c3a Binary files /dev/null and b/KeyGo/Resources/ImgAdd.png differ diff --git a/KeyGo/Resources/ImgDel.png b/KeyGo/Resources/ImgDel.png new file mode 100644 index 0000000..920feba Binary files /dev/null and b/KeyGo/Resources/ImgDel.png differ diff --git a/KeyGo/Resources/ImgDisable.png b/KeyGo/Resources/ImgDisable.png new file mode 100644 index 0000000..781a6c6 Binary files /dev/null and b/KeyGo/Resources/ImgDisable.png differ diff --git a/KeyGo/Resources/ImgEnable.png b/KeyGo/Resources/ImgEnable.png new file mode 100644 index 0000000..fed2202 Binary files /dev/null and b/KeyGo/Resources/ImgEnable.png differ diff --git a/KeyGo/Resources/ImgSet.png b/KeyGo/Resources/ImgSet.png new file mode 100644 index 0000000..4531c1c Binary files /dev/null and b/KeyGo/Resources/ImgSet.png differ diff --git a/KeyGo/UCHotKeyItem.Designer.cs b/KeyGo/UCHotKeyItem.Designer.cs new file mode 100644 index 0000000..32fdff8 --- /dev/null +++ b/KeyGo/UCHotKeyItem.Designer.cs @@ -0,0 +1,119 @@ + +namespace KeyGo +{ + partial class UCHotKeyItem + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.LblHotKey = new System.Windows.Forms.Label(); + this.LblTitle = new System.Windows.Forms.Label(); + this.BtnEnable = new System.Windows.Forms.Button(); + this.BtnDel = new System.Windows.Forms.Button(); + this.BtnSet = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // LblHotKey + // + this.LblHotKey.Font = new System.Drawing.Font("微软雅黑", 7F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.LblHotKey.Location = new System.Drawing.Point(5, 31); + this.LblHotKey.Name = "LblHotKey"; + this.LblHotKey.Size = new System.Drawing.Size(100, 20); + this.LblHotKey.TabIndex = 0; + this.LblHotKey.Text = "Ctrl+W"; + this.LblHotKey.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LblTitle + // + this.LblTitle.AutoEllipsis = true; + this.LblTitle.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.LblTitle.Location = new System.Drawing.Point(5, 6); + this.LblTitle.Name = "LblTitle"; + this.LblTitle.Size = new System.Drawing.Size(100, 25); + this.LblTitle.TabIndex = 0; + this.LblTitle.Text = "WeChat"; + this.LblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // BtnEnable + // + this.BtnEnable.BackgroundImage = global::KeyGo.Properties.Resources.ImgEnable; + this.BtnEnable.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BtnEnable.Location = new System.Drawing.Point(6, 54); + this.BtnEnable.Name = "BtnEnable"; + this.BtnEnable.Size = new System.Drawing.Size(30, 30); + this.BtnEnable.TabIndex = 1; + this.BtnEnable.UseVisualStyleBackColor = true; + this.BtnEnable.Click += new System.EventHandler(this.BtnEnable_Click); + // + // BtnDel + // + this.BtnDel.BackgroundImage = global::KeyGo.Properties.Resources.ImgDel; + this.BtnDel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BtnDel.Location = new System.Drawing.Point(74, 54); + this.BtnDel.Name = "BtnDel"; + this.BtnDel.Size = new System.Drawing.Size(30, 30); + this.BtnDel.TabIndex = 3; + this.BtnDel.UseVisualStyleBackColor = true; + this.BtnDel.Click += new System.EventHandler(this.BtnDel_Click); + // + // BtnSet + // + this.BtnSet.BackgroundImage = global::KeyGo.Properties.Resources.ImgSet; + this.BtnSet.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.BtnSet.Location = new System.Drawing.Point(40, 54); + this.BtnSet.Name = "BtnSet"; + this.BtnSet.Size = new System.Drawing.Size(30, 30); + this.BtnSet.TabIndex = 2; + this.BtnSet.UseVisualStyleBackColor = true; + this.BtnSet.Click += new System.EventHandler(this.BtnSet_Click); + // + // UCHotKeyItem + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(238)))), ((int)(((byte)(238)))), ((int)(((byte)(238))))); + this.Controls.Add(this.BtnEnable); + this.Controls.Add(this.BtnDel); + this.Controls.Add(this.BtnSet); + this.Controls.Add(this.LblTitle); + this.Controls.Add(this.LblHotKey); + this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.Name = "UCHotKeyItem"; + this.Size = new System.Drawing.Size(110, 90); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label LblHotKey; + private System.Windows.Forms.Label LblTitle; + private System.Windows.Forms.Button BtnSet; + private System.Windows.Forms.Button BtnDel; + private System.Windows.Forms.Button BtnEnable; + } +} diff --git a/KeyGo/UCHotKeyItem.cs b/KeyGo/UCHotKeyItem.cs new file mode 100644 index 0000000..4dcdcfd --- /dev/null +++ b/KeyGo/UCHotKeyItem.cs @@ -0,0 +1,135 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +using KeyGo.Properties; + +namespace KeyGo +{ + public partial class UCHotKeyItem : UserControl + { + public UCHotKeyItem() + { + InitializeComponent(); + } + + private HotKeyItem _HotKeyItem; + + public HotKeyItem HotKeyItem + { + get => _HotKeyItem; + set => ShowHotKeyItem(_HotKeyItem = value); + } + + public KeyGo KeyGo { get; set; } + + /// + /// 值改变时触发 + /// + public event EventHandler ValueChangedEvent; + + private void OnValueChanged() => ValueChangedEvent?.Invoke(this, EventArgs.Empty); + + /// + /// 显示信息 + /// + /// The item. + private void ShowHotKeyItem(HotKeyItem item) + { + LblTitle.Text = item.ProcessName; + LblHotKey.Text = item.HotKey; + HotKeyBtnEnable = item.Enabled; + if (item.Enabled && item.HotKeyID == 0) + LblHotKey.ForeColor = Color.Red; + else + LblHotKey.ForeColor = Color.Black; + } + + /// + /// 热键使能按钮状态 + /// + private bool HotKeyBtnEnable + { + set + { + if (value) + BtnEnable.BackgroundImage = Resources.ImgEnable; + else + BtnEnable.BackgroundImage = Resources.ImgDisable; + } + } + + /// + /// 切换热键使能状态 + /// + private void BtnEnable_Click(object sender, EventArgs e) + { + try + { + if (HotKeyItem.Enabled) + { + KeyGo.UnRegKey(HotKeyItem); + HotKeyItem.Enabled = false; + } + else + { + KeyGo.RegKey(HotKeyItem); + HotKeyItem.Enabled = true; + } + HotKeyBtnEnable = HotKeyItem.Enabled; + OnValueChanged(); + } + catch (Exception ex) + { + MessageBox.Show("在切换热键使能时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// 设置热键参数 + /// + private void BtnSet_Click(object sender, EventArgs e) + { + string oldKey = HotKeyItem.HotKey; + var frm = new FormHotKey() + { + HotKeyItem = this.HotKeyItem, + }; + if (frm.ShowDialog() == DialogResult.OK) + { + var item = frm.HotKeyItem; + // 如果热键发生改变,则需要重新注册 + if (oldKey != item.HotKey) + { + try + { + KeyGo.ChangeHotKey(item); + } + catch (Exception ex) + { + MessageBox.Show("在重新注册热键时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + ShowHotKeyItem(item); + OnValueChanged(); + } + } + + /// + /// 删除热键项 + /// + private void BtnDel_Click(object sender, EventArgs e) + { + try + { + KeyGo.DelHotKey(HotKeyItem); + Parent?.Controls.Remove(this); + OnValueChanged(); + } + catch (Exception ex) + { + MessageBox.Show("在注销热键时异常:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} \ No newline at end of file diff --git a/KeyGo/UCHotKeyItem.resx b/KeyGo/UCHotKeyItem.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/KeyGo/UCHotKeyItem.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file