diff --git a/cmonitor.install.win/.build/default.Manifest.xml b/cmonitor.install.win/.build/default.Manifest.xml
new file mode 100644
index 00000000..6eea2331
--- /dev/null
+++ b/cmonitor.install.win/.build/default.Manifest.xml
@@ -0,0 +1,62 @@
+
+
+
+ cmonitor.install.win
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True/PM
+ PerMonitorV2, PerMonitor
+
+
+
\ No newline at end of file
diff --git a/cmonitor.install.win/.build/default.init.aardio b/cmonitor.install.win/.build/default.init.aardio
new file mode 100644
index 00000000..11c61af2
--- /dev/null
+++ b/cmonitor.install.win/.build/default.init.aardio
@@ -0,0 +1,2 @@
+//发布前触发
+import ide;
\ No newline at end of file
diff --git a/cmonitor.install.win/.build/default.main.aardio b/cmonitor.install.win/.build/default.main.aardio
new file mode 100644
index 00000000..f2f1b0a7
--- /dev/null
+++ b/cmonitor.install.win/.build/default.main.aardio
@@ -0,0 +1,6 @@
+//此触发器在生成EXE以后执行
+import ide;
+import fsys;
+
+//获取生成的EXE文件路径
+var publishFile = ide.getPublishPath();
\ No newline at end of file
diff --git a/cmonitor.install.win/Config.cs b/cmonitor.install.win/Config.cs
deleted file mode 100644
index 20fdfc83..00000000
--- a/cmonitor.install.win/Config.cs
+++ /dev/null
@@ -1,194 +0,0 @@
-using common.libs;
-using common.libs.extends;
-using System.Net;
-using System.Text.Json.Serialization;
-
-namespace cmonitor.install.win
-{
- public sealed class Config
- {
- FileStream fs = null;
- StreamWriter writer = null;
- StreamReader reader = null;
- SemaphoreSlim slim = new SemaphoreSlim(1);
-
- public Config()
- {
- if (Directory.Exists(ConfigPath) == false)
- {
- Directory.CreateDirectory(ConfigPath);
- }
- string path = Path.Join(ConfigPath, "config.json");
- fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
- reader = new StreamReader(fs, System.Text.Encoding.UTF8);
- writer = new StreamWriter(fs, System.Text.Encoding.UTF8);
-
- Load();
- }
-
- public ConfigCommonInfo Common { get; set; } = new ConfigCommonInfo();
- public ConfigClientInfo Client { get; set; } = new ConfigClientInfo();
- public ConfigServerInfo Server { get; set; } = new ConfigServerInfo();
-
- public string ConfigPath { get; } = "./configs/";
-
-
- private Dictionary> JsonDic = new Dictionary>();
- public T Get(T defaultValue)
- {
- return Get(typeof(T).Name, defaultValue);
- }
- public T Get(string name, T defaultValue)
- {
- if (JsonDic.ContainsKey(name))
- {
- return JsonDic[name].ToJson().DeJson();
- }
- return defaultValue;
- }
- public void Set(T value)
- {
- Set(typeof(T).Name, value);
- }
- public void Set(string name, T value)
- {
- JsonDic[name] = value.ToJson().DeJson>();
- Save();
- }
-
- private void Load()
- {
- InitFileConfig();
- ReadJson();
- Save();
- }
- private void InitFileConfig()
- {
- slim.Wait();
- try
- {
- fs.Seek(0, SeekOrigin.Begin);
- string text = reader.ReadToEnd();
- if (string.IsNullOrWhiteSpace(text))
- {
- return;
- }
- JsonDic = text.DeJson>>();
- }
- catch (Exception ex)
- {
- Logger.Instance.Error(ex);
- }
- finally
- {
- slim.Release();
- }
- }
- private void ReadJson()
- {
- if (JsonDic.TryGetValue("Client", out Dictionary elClient))
- {
- Client = elClient.ToJson().DeJson();
- }
-
- if (JsonDic.TryGetValue("Server", out Dictionary elServer))
- {
- Server = elServer.ToJson().DeJson();
- }
- if (JsonDic.TryGetValue("Common", out Dictionary elCommon))
- {
- Common = elCommon.ToJson().DeJson();
- }
- }
-
- public void Save()
- {
- slim.Wait();
- try
- {
- JsonDic["Client"] = Client.ToJson().DeJson>();
- JsonDic["Server"] = Server.ToJson().DeJson>();
- JsonDic["Common"] = Common.ToJson().DeJson>();
-
- fs.Seek(0, SeekOrigin.Begin);
- fs.SetLength(0);
- writer.Write(JsonDic.ToJsonFormat());
- writer.Flush();
- }
- catch (Exception ex)
- {
- Logger.Instance.Error(ex);
- }
- finally
- {
- slim.Release();
- }
- }
- }
-
- public sealed partial class ConfigCommonInfo
- {
- public string[] Modes { get; set; } = new string[] { "client", "server" };
- public bool BlueProtect { get; set; }
- }
- public sealed partial class ConfigClientInfo
- {
- private string server = new IPEndPoint(IPAddress.Loopback, 1802).ToString();
- public string Server
- {
- get => server; set
- {
- server = value;
- if (string.IsNullOrWhiteSpace(server) == false)
- {
- string[] arr = server.Split(':');
- int port = arr.Length == 2 ? int.Parse(arr[1]) : 1802;
- IPAddress ip = NetworkHelper.GetDomainIp(arr[0]);
- ServerEP = new IPEndPoint(ip, port);
- }
- }
- }
-
- [JsonIgnore]
- public IPEndPoint ServerEP { get; set; } = new IPEndPoint(IPAddress.Loopback, 1802);
-
- private string name = Dns.GetHostName().SubStr(0, 12);
- public string Name
- {
- get => name; set
- {
- name = value.SubStr(0, 12);
- }
- }
- public string ShareMemoryKey { get; set; } = "cmonitor/share";
- public int ShareMemoryCount { get; set; } = 100;
- public int ShareMemorySize { get; set; } = 1024;
-
- }
- public sealed partial class ConfigServerInfo
- {
- public int WebPort { get; set; } = 1800;
- public string WebRoot { get; set; } = "./web/";
- public int ApiPort { get; set; } = 1801;
- public int ServicePort { get; set; } = 1802;
-
- }
-}
-
-
-namespace cmonitor.install.win
-{
- public sealed class ViewerConfigInfo
- {
- }
-
- public sealed partial class ConfigClientInfo
- {
- public ViewerConfigInfo Viewer { get; set; } = new ViewerConfigInfo();
- }
-
- public sealed partial class ConfigServerInfo
- {
- public ViewerConfigInfo Viewer { get; set; } = new ViewerConfigInfo();
- }
-}
\ No newline at end of file
diff --git a/cmonitor.install.win/MainForm.Designer.cs b/cmonitor.install.win/MainForm.Designer.cs
deleted file mode 100644
index e7e4a792..00000000
--- a/cmonitor.install.win/MainForm.Designer.cs
+++ /dev/null
@@ -1,248 +0,0 @@
-namespace cmonitor.install.win
-{
- 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));
- serverIP = new TextBox();
- label1 = new Label();
- label2 = new Label();
- serverPort = new TextBox();
- label3 = new Label();
- webPort = new TextBox();
- label4 = new Label();
- apiPort = new TextBox();
- modeClient = new CheckBox();
- modeServer = new CheckBox();
- label5 = new Label();
- shareLen = new TextBox();
- label6 = new Label();
- shareKey = new TextBox();
- label11 = new Label();
- machineName = new TextBox();
- installBtn = new Button();
- runBtn = new Button();
- checkStateBtn = new Button();
- label16 = new Label();
- shareItemLen = new TextBox();
- gbClient = new GroupBox();
- gbServer = new GroupBox();
- gbClient.SuspendLayout();
- gbServer.SuspendLayout();
- SuspendLayout();
- //
- // serverIP
- //
- resources.ApplyResources(serverIP, "serverIP");
- serverIP.Name = "serverIP";
- //
- // label1
- //
- resources.ApplyResources(label1, "label1");
- label1.Name = "label1";
- //
- // label2
- //
- resources.ApplyResources(label2, "label2");
- label2.Name = "label2";
- //
- // serverPort
- //
- resources.ApplyResources(serverPort, "serverPort");
- serverPort.Name = "serverPort";
- //
- // label3
- //
- resources.ApplyResources(label3, "label3");
- label3.Name = "label3";
- //
- // webPort
- //
- resources.ApplyResources(webPort, "webPort");
- webPort.Name = "webPort";
- //
- // label4
- //
- resources.ApplyResources(label4, "label4");
- label4.Name = "label4";
- //
- // apiPort
- //
- resources.ApplyResources(apiPort, "apiPort");
- apiPort.Name = "apiPort";
- //
- // modeClient
- //
- resources.ApplyResources(modeClient, "modeClient");
- modeClient.Name = "modeClient";
- modeClient.UseVisualStyleBackColor = true;
- //
- // modeServer
- //
- resources.ApplyResources(modeServer, "modeServer");
- modeServer.Name = "modeServer";
- modeServer.UseVisualStyleBackColor = true;
- //
- // label5
- //
- resources.ApplyResources(label5, "label5");
- label5.Name = "label5";
- //
- // shareLen
- //
- resources.ApplyResources(shareLen, "shareLen");
- shareLen.Name = "shareLen";
- //
- // label6
- //
- resources.ApplyResources(label6, "label6");
- label6.Name = "label6";
- //
- // shareKey
- //
- resources.ApplyResources(shareKey, "shareKey");
- shareKey.Name = "shareKey";
- //
- // label11
- //
- resources.ApplyResources(label11, "label11");
- label11.Name = "label11";
- //
- // machineName
- //
- resources.ApplyResources(machineName, "machineName");
- machineName.Name = "machineName";
- //
- // installBtn
- //
- resources.ApplyResources(installBtn, "installBtn");
- installBtn.Name = "installBtn";
- installBtn.UseVisualStyleBackColor = true;
- installBtn.Click += OnInstallClick;
- //
- // runBtn
- //
- resources.ApplyResources(runBtn, "runBtn");
- runBtn.Name = "runBtn";
- runBtn.UseVisualStyleBackColor = true;
- runBtn.Click += RunClick;
- //
- // checkStateBtn
- //
- resources.ApplyResources(checkStateBtn, "checkStateBtn");
- checkStateBtn.Name = "checkStateBtn";
- checkStateBtn.UseVisualStyleBackColor = true;
- checkStateBtn.Click += checkStateBtn_Click;
- //
- // label16
- //
- resources.ApplyResources(label16, "label16");
- label16.Name = "label16";
- //
- // shareItemLen
- //
- resources.ApplyResources(shareItemLen, "shareItemLen");
- shareItemLen.Name = "shareItemLen";
- //
- // gbClient
- //
- resources.ApplyResources(gbClient, "gbClient");
- gbClient.Controls.Add(machineName);
- gbClient.Controls.Add(label16);
- gbClient.Controls.Add(serverIP);
- gbClient.Controls.Add(shareItemLen);
- gbClient.Controls.Add(label1);
- gbClient.Controls.Add(label11);
- gbClient.Controls.Add(shareLen);
- gbClient.Controls.Add(shareKey);
- gbClient.Controls.Add(label5);
- gbClient.Controls.Add(label6);
- gbClient.Name = "gbClient";
- gbClient.TabStop = false;
- //
- // gbServer
- //
- resources.ApplyResources(gbServer, "gbServer");
- gbServer.Controls.Add(apiPort);
- gbServer.Controls.Add(serverPort);
- gbServer.Controls.Add(label2);
- gbServer.Controls.Add(label4);
- gbServer.Controls.Add(webPort);
- gbServer.Controls.Add(label3);
- gbServer.Name = "gbServer";
- gbServer.TabStop = false;
- //
- // MainForm
- //
- resources.ApplyResources(this, "$this");
- AutoScaleMode = AutoScaleMode.Font;
- Controls.Add(gbServer);
- Controls.Add(gbClient);
- Controls.Add(checkStateBtn);
- Controls.Add(runBtn);
- Controls.Add(installBtn);
- Controls.Add(modeServer);
- Controls.Add(modeClient);
- Name = "MainForm";
- Load += OnLoad;
- gbClient.ResumeLayout(false);
- gbClient.PerformLayout();
- gbServer.ResumeLayout(false);
- gbServer.PerformLayout();
- ResumeLayout(false);
- PerformLayout();
- }
-
- private System.Windows.Forms.TextBox serverIP;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox serverPort;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.TextBox webPort;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.TextBox apiPort;
- private System.Windows.Forms.CheckBox modeClient;
- private System.Windows.Forms.CheckBox modeServer;
- private System.Windows.Forms.Label label5;
- private System.Windows.Forms.TextBox shareLen;
- private System.Windows.Forms.Label label6;
- private System.Windows.Forms.TextBox shareKey;
- private System.Windows.Forms.Label label11;
- private System.Windows.Forms.TextBox machineName;
- private System.Windows.Forms.Button installBtn;
- private System.Windows.Forms.Button runBtn;
- private System.Windows.Forms.Button checkStateBtn;
-
- #endregion
-
- private Label label16;
- private TextBox shareItemLen;
- private GroupBox gbClient;
- private GroupBox gbServer;
- }
-}
diff --git a/cmonitor.install.win/MainForm.cs b/cmonitor.install.win/MainForm.cs
deleted file mode 100644
index 710f40f9..00000000
--- a/cmonitor.install.win/MainForm.cs
+++ /dev/null
@@ -1,304 +0,0 @@
-using common.libs;
-using System.Diagnostics;
-
-namespace cmonitor.install.win
-{
- public partial class MainForm : Form
- {
-
- Config config = new Config();
- public MainForm()
- {
- InitializeComponent();
-
- this.FormBorderStyle = FormBorderStyle.FixedSingle;
- this.MaximizeBox = false;
- }
-
- private void OnLoad(object sender, EventArgs e)
- {
- LoadConfig();
- SaveConfig();
-
- CheckInstall();
- CheckRunning();
- }
-
- private void SaveConfig()
- {
- config.Save();
-
- }
- private void LoadConfig()
- {
- modeClient.Checked = config.Common.Modes.Contains("client");
- modeServer.Checked = config.Common.Modes.Contains("server");
-
- machineName.Text = config.Client.Name;
- serverIP.Text = config.Client.Server;
-
- shareKey.Text = config.Client.ShareMemoryKey;
- shareLen.Text = config.Client.ShareMemoryCount.ToString();
- shareItemLen.Text = config.Client.ShareMemorySize.ToString();
-
- serverPort.Text = config.Server.ServicePort.ToString();
- apiPort.Text = config.Server.ApiPort.ToString();
- webPort.Text = config.Server.WebPort.ToString();
- }
-
- private bool loading = false;
- private bool installed = false;
- private bool running = false;
- private string serviceName = "cmonitor.sas.service";
- private string exeName = "cmonitor.sas.service.exe";
- private void OnInstallClick(object sender, EventArgs e)
- {
- if (loading)
- {
- return;
- }
-
- bool result = CheckMode();
- if (result == false) return;
- result = CheckIPAndPort();
- if (result == false) return;
- result = CheckShare();
- if (result == false) return;
-
- CheckLoading(true);
- SaveConfig();
-
- string filename = Process.GetCurrentProcess().MainModule.FileName;
- string dir = Path.GetDirectoryName(filename);
- string sasPath = Path.Combine(dir, exeName);
-
- string sasIndexStr = "4";
-
- string shareKeyStr = shareKey.Text;
- string shareLenStr = shareLen.Text;
- string shareItemLenStr = shareItemLen.Text;
-
- Task.Run(async () =>
- {
- if (installed == false)
- {
- string taskStr = $"sc create \"{serviceName}\" binpath= \"{sasPath} {shareKeyStr} {shareLenStr} {shareItemLenStr} {sasIndexStr} \" start= AUTO";
- CommandHelper.Windows(string.Empty, new string[] {
- taskStr,
- $"net start {serviceName}",
- });
- }
- else
- {
- while (running)
- {
- Stop();
- await Task.Delay(1000);
- CheckRunning();
- }
- string resultStr = CommandHelper.Windows(string.Empty, new string[] {
- "schtasks /delete /TN \"cmonitorService\" /f",
- $"net stop {serviceName}",
- $"sc delete {serviceName}",
- });
- }
-
- CheckLoading(false);
- CheckInstall();
- CheckRunning();
- });
- }
-
- private bool CheckMode()
- {
- if (modeClient.Checked == false && modeServer.Checked == false)
- {
- MessageBox.Show("客户端和服务端必须选择一样!");
- return false;
- }
- if (string.IsNullOrWhiteSpace(machineName.Text))
- {
- MessageBox.Show("机器名必填!");
- return false;
- }
- config.Client.Name = machineName.Text;
-
- List modeStr = new List();
- if (modeClient.Checked)
- {
- modeStr.Add("client");
- }
- if (modeServer.Checked)
- {
- modeStr.Add("server");
- }
- config.Common.Modes = modeStr.ToArray();
-
- return true;
- }
- private bool CheckIPAndPort()
- {
- if (string.IsNullOrWhiteSpace(serverIP.Text))
- {
- MessageBox.Show("服务器ip必填");
- return false;
- }
- if (string.IsNullOrWhiteSpace(serverPort.Text))
- {
- MessageBox.Show("服务器端口必填");
- return false;
- }
- if (string.IsNullOrWhiteSpace(apiPort.Text))
- {
- MessageBox.Show("管理端口必填");
- return false;
- }
- if (string.IsNullOrWhiteSpace(webPort.Text))
- {
- MessageBox.Show("web端口必填");
- return false;
- }
- config.Client.Server = serverIP.Text;
- config.Server.WebPort = int.Parse(webPort.Text);
- config.Server.ApiPort = int.Parse(apiPort.Text);
- config.Server.ServicePort = int.Parse(serverPort.Text);
-
- return true;
- }
-
- private bool CheckShare()
- {
- if (string.IsNullOrWhiteSpace(shareKey.Text))
- {
- MessageBox.Show("共享数据键必填");
- return false;
- }
- if (string.IsNullOrWhiteSpace(shareLen.Text))
- {
- MessageBox.Show("共享数量必填");
- return false;
- }
- if (string.IsNullOrWhiteSpace(shareItemLen.Text))
- {
- MessageBox.Show("共享每项数据长度必填");
- return false;
- }
- config.Client.ShareMemoryKey = shareKey.Text;
- config.Client.ShareMemoryCount = int.Parse(shareLen.Text);
- config.Client.ShareMemorySize = int.Parse(shareItemLen.Text);
- return true;
- }
-
- private void CheckLoading(bool state)
- {
- loading = state;
- this.Invoke(new EventHandler(delegate
- {
- if (loading)
- {
- installBtn.Text = "操作中..";
- runBtn.Text = "操作中..";
- checkStateBtn.Text = "操作中..";
- }
- else
- {
- checkStateBtn.Text = "检查状态";
- if (installed)
- {
- installBtn.ForeColor = Color.Red;
- installBtn.Text = "解除自启动";
- runBtn.Enabled = true;
- }
- else
- {
- installBtn.ForeColor = Color.Black;
- installBtn.Text = "安装自启动";
- runBtn.Enabled = false;
- }
-
- if (running)
- {
- runBtn.ForeColor = Color.Red;
- runBtn.Text = "停止运行";
- }
- else
- {
- runBtn.ForeColor = Color.Black;
- runBtn.Text = "启动";
- }
- }
- }));
- }
- private void CheckInstall()
- {
- Task.Run(() =>
- {
- string result = CommandHelper.Windows(string.Empty, new string[] { $"sc query {serviceName}" });
- installed = result.Contains($"SERVICE_NAME: {serviceName}");
- CheckLoading(loading);
- });
- }
-
- private void RunClick(object sender, EventArgs e)
- {
- if (loading) return;
-
- CheckLoading(true);
-
- Task.Run(async () =>
- {
- if (running)
- {
- Stop();
- while (running)
- {
- CheckRunning();
- await Task.Delay(1000);
- }
- }
- else
- {
- Run();
- for (int i = 0; i < 15 && running == false; i++)
- {
- CheckRunning();
- await Task.Delay(1000);
- }
- }
- CheckLoading(false);
- });
- }
- private void Run()
- {
- CommandHelper.Windows(string.Empty, new string[] {
- "schtasks /run /I /TN \"cmonitorService\"",
- $"net stop {serviceName}",
- $"net start {serviceName}",
- });
- }
- private void Stop()
- {
- CommandHelper.Windows(string.Empty, new string[] { $"net stop \"{serviceName}\"", });
- }
-
- private void CheckRunning()
- {
- Task.Run(() =>
- {
- string result = CommandHelper.Windows(string.Empty, new string[] { $"sc query {serviceName}" });
- running = result.Contains(": 4 RUNNING");
- CheckLoading(loading);
- });
- }
-
- private void checkStateBtn_Click(object sender, EventArgs e)
- {
- if (loading) return;
-
- CheckLoading(loading);
- CheckInstall();
- CheckRunning();
- }
-
- }
-}
diff --git a/cmonitor.install.win/MainForm.resx b/cmonitor.install.win/MainForm.resx
deleted file mode 100644
index 8307a3bb..00000000
--- a/cmonitor.install.win/MainForm.resx
+++ /dev/null
@@ -1,1473 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 100, 23
-
-
- 4
-
-
-
- 19
-
-
- 18
-
-
- 114, 372
-
-
- 8
-
-
- modeClient
-
-
- 截屏间隔ms
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 23
-
-
- 0
-
-
- 3
-
-
- 9
-
-
- True
-
-
- 25
-
-
- 66, 17
-
-
- 106, 303
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- System.Windows.Forms.GroupBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- serverIP
-
-
- questionIndex
-
-
- True
-
-
- True
-
-
- 7
-
-
- label10
-
-
- 225, 280
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- MainForm
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- shareKey
-
-
- machineName
-
-
- True
-
-
- 7
-
-
- 100, 23
-
-
- gbServer
-
-
- 21
-
-
- MiddleCenter
-
-
- cbBlueProtect
-
-
- 294, 102
-
-
- $this
-
-
- label14
-
-
- screenScale
-
-
- 100, 23
-
-
- 20
-
-
- True
-
-
- 键盘键下标
-
-
- 16
-
-
- gbClient
-
-
- 31
-
-
- 93, 80
-
-
- gbServer
-
-
- $this
-
-
- $this
-
-
- gbClient
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 32, 80
-
-
- 106, 49
-
-
- $this
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 24
-
-
- 22, 337
-
-
- 28
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 壁纸键下标
-
-
- 79, 104
-
-
- 294, 330
-
-
- 219, 49
-
-
- 68, 17
-
-
- 安装自启动
-
-
- 100, 23
-
-
- True
-
-
- 213, 333
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 100, 23
-
-
- 106, 102
-
-
- gbClient
-
-
- True
-
-
- 220, 154
-
-
- 44, 17
-
-
- SAS键下标
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 6
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- label7
-
-
- $this
-
-
- 5
-
-
- 106, 331
-
-
- $this
-
-
- label17
-
-
- 106, 76
-
-
- 227, 306
-
-
- True
-
-
- gbServer
-
-
- label4
-
-
- cmonitor安装工具
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 9
-
-
- 100, 23
-
-
- True
-
-
- 56, 17
-
-
- 35
-
-
- 232, 106
-
-
- $this
-
-
- 27, 280
-
-
- True
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- wallpaperIndex
-
-
- System.Windows.Forms.Form, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- $this
-
-
- 56, 17
-
-
- web端口
-
-
- gbClient
-
-
- gbServer
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 2
-
-
- gbServer
-
-
- label6
-
-
- 106, 150
-
-
- $this
-
-
- checkStateBtn
-
-
- label9
-
-
- 223, 80
-
-
- $this
-
-
- 22
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 27, 154
-
-
- $this
-
-
- 12
-
-
- $this
-
-
- 100, 23
-
-
- 201, 372
-
-
- 106, 222
-
-
- 372, 23
-
-
- $this
-
-
- shareItemLen
-
-
- 服务端
-
-
- 2
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 331, 378
-
-
- 1
-
-
- 100, 23
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 80, 17
-
-
- 3
-
-
- 106, 249
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 7, 17
-
-
- 68, 17
-
-
- 6
-
-
- $this
-
-
- 294, 150
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 25
-
-
- 17
-
-
- 1
-
-
- 20
-
-
- $this
-
-
- True
-
-
- 14
-
-
- 2
-
-
- gbClient
-
-
- 75, 23
-
-
- 34
-
-
- 37
-
-
- 33
-
-
- 81, 35
-
-
- serverPort
-
-
- 294, 249
-
-
- 100, 23
-
-
- screenDelay
-
-
- 8
-
-
- 12, 48
-
-
- 3
-
-
- 18
-
-
- shareLen
-
-
- tbViewerPortClient
-
-
- gbClient
-
-
- gbClient
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- label16
-
-
- label12
-
-
- 机器名
-
-
- 106, 177
-
-
- gbClient
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- label8
-
-
- reportDelay
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 每项数据长度
-
-
- label18
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 15, 334
-
-
- gbClient
-
-
- webPort
-
-
- 294, 76
-
-
- 29
-
-
- 23
-
-
- 管理接口端口
-
-
- $this
-
-
- 0
-
-
- gbClient
-
-
- label15
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4
-
-
- 219, 22
-
-
- 27, 307
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 5
-
-
- modeServer
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 2
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 81, 35
-
-
- keyboardIndex
-
-
- 68, 17
-
-
- 5
-
-
- 服务端端口
-
-
- label11
-
-
- 39
-
-
- 11
-
-
- 156, 21
-
-
- 19
-
-
-
- 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
-
-
-
- $this
-
-
- 63, 21
-
-
- True
-
-
- 100, 23
-
-
- 6
-
-
- label1
-
-
- 客户端
-
-
- 100, 23
-
-
- 38
-
-
- 0
-
-
- True
-
-
- 1
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 4
-
-
- sasIndex
-
-
- 13
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 1
-
-
- llockIndex
-
-
- 锁屏键下标
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- $this
-
-
- 100, 23
-
-
- 检查状态
-
-
- 0
-
-
- 8
-
-
- $this
-
-
- 27
-
-
- 1
-
-
- $this
-
-
-
- 6, 5, 6, 5
-
-
- 23, 106
-
-
- 1
-
-
- 55, 17
-
-
- 停止运行
-
-
- 2
-
-
- 26
-
-
- 36, 53
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 5
-
-
- 0
-
-
- True
-
-
- 服务端IP
-
-
- 5
-
-
- $this
-
-
- gbServer
-
-
- 3
-
-
- 38
-
-
- 4
-
-
- 6
-
-
- 27, 226
-
-
- 80, 17
-
-
- 37
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- True
-
-
- 10
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- label13
-
-
- 211, 253
-
-
- 7
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 37
-
-
- 100, 23
-
-
- 0
-
-
- 100, 23
-
-
- 100, 23
-
-
- 41, 253
-
-
- 174, 12
-
-
- True
-
-
- 294, 302
-
-
- 100, 23
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 15
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 截屏缩放比例
-
-
- gbClient
-
-
- 共享数据键
-
-
- System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 68, 17
-
-
- 63, 21
-
-
- System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 73, 17
-
-
- 报告间隔ms
-
-
- 39
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 294, 276
-
-
- answerIndex
-
-
- runBtn
-
-
- 73, 17
-
-
- System.Windows.Forms.CheckBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- gbClient
-
-
- 40
-
-
- gbServer
-
-
- 9
-
-
- 30
-
-
- 100, 23
-
-
- label3
-
-
- System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- label5
-
-
- 3
-
-
- 418, 420
-
-
- 1
-
-
- $this
-
-
- 每项255长度,0项保留不可用
-
-
- installBtn
-
-
- 36
-
-
- gbServer
-
-
- True
-
-
- 8
-
-
- 20, 181
-
-
- 80, 17
-
-
- 100, 23
-
-
- 数据数量
-
-
- 21
-
-
- gbClient
-
-
- 0
-
-
- 100, 23
-
-
- tbViewerPortServer
-
-
- gbServer
-
-
- apiPort
-
-
- 39
-
-
- 32
-
-
- label2
-
-
- 0
-
-
- 68, 17
-
-
- 106, 276
-
-
- zh-Hans
-
-
- True
-
-
\ No newline at end of file
diff --git a/cmonitor.install.win/MainForm.zh-Hans.resx b/cmonitor.install.win/MainForm.zh-Hans.resx
deleted file mode 100644
index a90c58e0..00000000
--- a/cmonitor.install.win/MainForm.zh-Hans.resx
+++ /dev/null
@@ -1,638 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- 186, 95
-
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 34, 100
-
-
- 6, 0, 6, 0
-
-
- 134, 31
-
-
- 服务端地址
-
-
- 34, 146
-
-
- 6, 0, 6, 0
-
-
- 110, 31
-
-
- 服务端口
-
-
- 158, 140
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 34, 51
-
-
- 6, 0, 6, 0
-
-
- 110, 31
-
-
- 158, 44
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 34, 98
-
-
- 6, 0, 6, 0
-
-
- 110, 31
-
-
- 管理端口
-
-
- 158, 93
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 210, 39
-
-
- 6, 5, 6, 5
-
-
- 118, 35
-
-
- 596, 39
-
-
- 6, 5, 6, 5
-
-
- 118, 35
-
-
- 38, 274
-
-
- 6, 0, 6, 0
-
-
- 110, 31
-
-
- 186, 268
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 28, 226
-
-
- 6, 0, 6, 0
-
-
- 134, 31
-
-
- 186, 219
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 52, 53
-
-
- 6, 0, 6, 0
-
-
- 86, 31
-
-
- 186, 46
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 350, 502
-
-
- 6, 5, 6, 5
-
-
- 162, 64
-
-
- 176, 502
-
-
- 6, 5, 6, 5
-
-
- 162, 64
-
-
- 610, 513
-
-
- 6, 5, 6, 5
-
-
- 150, 42
-
-
- 14, 326
-
-
- 6, 0, 6, 0
-
-
- 158, 31
-
-
- 186, 321
-
-
- 6, 5, 6, 5
-
-
- 196, 38
-
-
- 24, 88
-
-
- 6, 5, 6, 5
-
-
- 6, 5, 6, 5
-
-
- 400, 387
-
-
- 客户端参数
-
-
- 438, 90
-
-
- 6, 5, 6, 5
-
-
- 6, 5, 6, 5
-
-
- 374, 385
-
-
- 服务端参数
-
-
- 14, 31
-
-
- 836, 601
-
-
-
- AAABAAEAAAAAAAEAIABdQAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAQCRJ
- REFUeNrtnXd8XMW5sJ/ZIq16lyzZsi1Z7sYFY9xxwwUINU7hkpBCQsKFG0joBGKZllySmwspBEJyk5BQ
- EhIwfDHYuGKMK+7dlmXZkmVZVu9b5/tjJFuWzqrualfSPP6dn9Y7Z8+Zc3bnPe+88xbQaDQajUbT/xCB
- 7oDGx2RffCUu/pXN3hOAvNjatI+8+J5s/P+lVnlxn8uPr+kDaAEQzGQ3/hWEAjYkNiAMsDVuUQgSkEQD
- 4Y1bWIvXoUBI42YBrI1/QxpfAzgBB+BqfO1q/L8DsAP1QF3j1vx1FYJSJNVAQ2NbA9CAiQbM2JHAk4G+
- kRpvaAEQKLIvvjIhMWPGCsTiIRlIBlIa/yYDiUA8ENtsi0MNcAGYGo8lmm3+QDbbADyNr+uBcqCi2VYG
- lADFwHkExUiKMVGMoAInTkJwk4yHSuDhQH0R/RstAHqKZwCw4iYeSAASEAxCMgIYDmRxaVA3bTbAHOiu
- dxM3l7SDpq0MyUkEJ4DjSAqAEkyUYqIccPJUoLvdP9ACwNc8i7qrLqxIwoAkYDQwBhgFDAEGAmlAJPo7
- kEANUAicBU4DR4FDwBEkFxA0oKYm2gbhY/r7j883ZAPqSZ2KepKPAsYBVwAZQDQQgZp7a9rHBdQCVcAp
- 4ACCA0iOATnAOcCthUH30QKgKzwNgBkPscBQYCowBfWkz0LN1/W99S0SKEUJgKPADgTbgdMIKgA3Pwl0
- F3sf+kfaUX4CCEwIBgETUIN+NupJH4myqmt6Dgdq6nAQ2ARsR7APOIvEo7WDjqEFQFtkA4JwYBCSq5HM
- RzARyARiAt09zWVUAieBvcB6BDuBAiR1Whh4RwuA5mQDM4HPMeFkIB5mA/OBeUA6l9bNNcGNE8gHNgDr
- EHyKpBC1bKkNic3QAqCJxwAbSQgmI7kBuAb1pI8MdNc03aIGyAU+Af4N7AEuaCGg6L8CIPviKwtqae4G
- 4EZgGnrQ91VqgC0oQbASwRkcuAgHfhzorgWG/icAnkctLoURjeRK4GbgOpQ1PzTQ3dP0CHYgD/gQwfvA
- HuqpIhp4ItBd61n6jwDIRtnpncQjmQ/cAcxCudlq+i8XgM3Am8A6lEtzv7ET9A8BsAwwkYhkIXAnavku
- ItDd0gQVNShB8BcEa/BQyvJAd8n/9G0BkA2oJ/x1qIE/HT3wNW1TA2wFXkewijWU8G3g24Huln/omwJg
- OSAIw8Ni4PvAXPT8XtM5GoCNwKtIViOo74vTgr4lAJTKFgpchYd7EFyHcsvVaLpKKZIPMfEKgl1I7CwL
- dJd8R98QAE+hIs9TyEQ98e9ARdtpNL7iLPAGglc4xikyUZGfvZzeLwCyAYhCchOCB4BJ9P4Yek1w4gZ2
- A/+L4N9AdW/XBnqvAHgasGDCyXgk9wNL0Q48mp6hGvgnghexcRAHnt6awKT3CYDsi69igTuQ3I9gGJfS
- Ymk0PYEHOAH8CngDFYzU6/wHepeq/DRgwgSMRPn03Y9gAL1RkGl6OwK1xDwP5Up+BChjLmrtoJfQewSA
- SrVlxcMtSF4CFqFj8DWBxwqMB2agvApPMhdPbxECvUMALAMkKXh4CKVkDUM/9TXBg0CtOs1DJXI9wlxq
- e4MQCO5BlH3x1ShUXt1b0Hn1NMGNC/gnsAzBcTwQzC7FwasBPIOy8nuYBfwWuDao+6vRKEyoDNCTgWPY
- KGAuKjVJEBKcA2o5ILHiZinwEmqOFdzaikZzCQEMBmbipgg4wbzgtAsEnwDIBtR6/g9QekB6oLuk0XSR
- RGAO4EZwgHk4gk0IBJcAeBoQRCN5AngEVSlHo+nNRKJWCKyY2Mk8HME0HQgeAbAMEMQjWQ7ciypuqdH0
- BUKAKUiigB3MoyFYNIHgEADZgCAJ+CnwXXTorqbvYUUZBuOQbGcudXwS6C4FgwDIBlQF3F+gknbo1Nua
- vooZmIggFcGWYPAVCKwAUIk74oHngG+g1/g1fR8zqmZkLIItzKM+kEIgcAIgG4AolBj4LvrJr+k/mFBC
- IALYzNzArQ4ERgBkA8o6+gRwH3rOr+l/mFE1Jk2BXB3oeQGQDShV/wfAw2hrv6b/YgUmIanBxM5ABBH1
- rABoSuLh4UsoJx+9zq/p74QCE5CcwspR5iJ7UhPoOQGgIvrAzTUIXgIG9dxlajRBTSQwEcke3JxhAT0W
- O9BzWXRMgIkxwH+jwnk1Gs0lhiP5GWZGIXvupD2jAWQDMAD4HwQL0IE9Go0Rg4BUYBNzqekJe4D/BUA2
- oFwhHwG+g87dp9F4Q6ByXzhRy4NufwsB/w7Gp1HV2FUij+/5/XwaTe/HBHwPwc3sxO+1B/w7ID3AJMYC
- jwMJ/r0UjabPkIDkcaYwGpd/T+S/KcAlN9+fAQv9exkaTZ8jFUkMJjb6M3rQPwJgOWDGhIe7UZ5+2sdf
- o+ksgiygGCs7mYNf0o37Zwqg1vsnouL6bf66PxpNHycc+C+cTPTX0qDvNYBsAGJQnn5z/XRjNJr+QgIQ
- hmA987D7WgvwrQaQffHVrY2bRqPpPrchuRUHPk8x7lsBIADBSOB+VKijRqPpPpHA/YQw3NcH9t0UQFn9
- Q5A8gnr6a28/jcZ3pAANmNjkSwch32kAHkAyBbgdPfg1Gl9jAv4DyWTcvj1o93kWsBCO5B5UjTSNRuN7
- BiH5PibCfFWGvPsCIBtVDc3NIuC6wN0bjaZfcAOqMja+EAK+mgIkAt8H4gNzTzSafkMCaqz5xLXeVwLg
- BlQJJI1G43/m4iNtu3sCQFn+k4CvoT3+NJqewgZ8HUFCd/0Cui4AslEuv5JrgemBviMaTT9jBpJFuFFh
- 912ku1OAOFQ1H+30o9H0LJHA1zETh6frB+muAFgAzA70ndBo+inXIFnQnQN0TQBkAxAN3IF++vdOZLNN
- 01uJAG5HENVVW0DnPfZ+CtQDZuYh+QdqCVATbDQf3AKsZisWswWBwGwyYxZmROPX75ZuJBK3dOP2uHG6
- nXjcHvV50WzTBCMlwJdoyhaQ3bkPdz5Rhx0wYUFyG3rwBwfNn+ICYm2xDIweSIItgYHRA0mKTGJw9GBS
- IlKwmCxEhUQRbYvGJJQCWOOoweF2UOuopdpRzdmqs5yqOEVJXQll9WUU1RRRWF2Iw+W47DyaoCARlXNz
- M3Q+gVhXM/UMA5YE+sr7PRIswkJkWCRpUWmMTRrLrMGzmDRgEokRicTaYkkISyDEHNLpQ7s8LuqcdVTa
- KympK+HIhSNsL9jOoQuHOFJyhPL6cuqd9WpnLQwCzXUIfguc6OwHO/fVZV989RBqMqBTffUkTWq9gFBL
- KKOTRnPTiJu4euDVTE6bTFxYHFaT9eKT3de4PC7qnfXklOew+9xutuZvZd2pdZyuOI2UjWqIFgaBwAk8
- BvwS6NQ0oHNf1zIAUhG8DVwT6KvuV0iIDIkkMz6TGekzWDp6KZlxmQyJHeK3Ad8e9a56jpYcZdPpTXx0
- 4iP2nd9HcU0xnu6sS2m6yicIbgfONY7TDtFxAfA04AYENwD/RHv+9QxSGfCmpU/ja1d8jRtH3EhKZErA
- Br03ah217Di7gzcPvsnKEyspqi5SWoHWCHqKOuCLSFZhBn7SsQ91PCHIHEBgAh5Ae/75Hwnh1nBmDJnB
- 8nnLeWLWE8weMpuo0CiECL5RFWIOISMugwUZC5g2aBoWs4XiumJq7DWB7lp/wQpUIFiNRHY0YUjH5/Dq
- gZOOR6v+fkWCWZgZkTSCe6++l/8Y9x/EhXWvirpbqqU9p8eJx+NRy35SUu+qJ9QcisVkQQiByWTCLMwX
- 3+sKESERzBs6j6kDp7K9YDt/O/A3/nn4n1Q1VGltwP/MxcRAIL+jH+jYV5J98dU3gJdR6Yo1vkZCSmQK
- Xxv/Ne6efDdZ8VldUvWr7dUU1hSSX5nP6crT5JbnUlBVwNmqs1TaK6myV2F32XFLNyZhIiokihBzCJGh
- kcSExjAqcRRDY4cyOHowiRGJpMekkxKegtVs7XRf6px1rD65mhc+e4HPCz/H5XZpQeA/alGhwn8DOmQM
- 7NhXobyMIpC8gor80/gYq7AyL3MeP5r+I+YNndeppTuH20FRTRHHS4/z2ZnP2HZ2G2erzpJflU9FfUWX
- +iMQhFpDiQ+LJz0mnbFJY5k6cCpjksYwJmkMcba4Tk1Fjpce55+H/8lru14jrzxPV4n0H3/GxL1I6jpi
- DOy4BiAYheRjID3QV9inkBAXFsddV97Fj6b/iNTI1A5/tMZRw/aC7fz7+L9Zn7ee3LJc6l31uN3uS99s
- d5+2jUuPQgisFisR1giuTLuSO8ffyaTUSYxOHN3h6YJbutlwagMPr3mYvUV7A3G3+wN5CJYgOeY7DUAd
- 6JvA71HGBo0PEFIwMmkk2XOzuXnkzdgs7S+suDwu8iryeOPAG6zNXcuJkhOcrznfs+66EsJCwkiPTmfO
- 0Dl8ecyXmTZoGpEhkR36+P7z+/nltl/y9v63sXvsPdTpfoMTwV14+GtH4gPaXwX4H8CCGScPAhMDfXV9
- BgnXDruWX1//axYNW4TV1LZcdUs3R0uO8qsdv+KJdU+w4sgKTpefptZZq9TpnpxXCyWISmtL2XNuD6tz
- V3Oi7AQWk4WB0QPbnb6kRKYwY/AMbFYbB84fUB6F2i7gK8xANSY+YF77qwHtC4CZgIsMVLGPlEBfXV/A
- bDLzxTFf5JeLfsn4lPEXg3KMkEgKqwv59fZf89i6x1h5fCUldSVIIQMfpNN4/lpHLfuK9rEmdw05ZTkk
- RySTEJ7QptEwwhrBzMEzSYtK4+CFg5TVlWkh4EsEHwEV3RMAfwZKAZiP4NtA553KNZdodOq5a9JdPL/g
- eTLiMtrcvdZRy/pT63nw4wd5fd/rlNaW4hEe38zrQR2nRdRgd6hz1LG3aC8f5nzI2aqzjEseR4wtxuv+
- ZmFmbPJYMuMyOVp6lKLqIi0EfEMEsA04ymJgnfcd2xYAE1GRf4JvoZN+dpswaxj3T7ufZ+Y9Q1JEktf9
- pJQcLTnKY+se42ef/YyjF44q91ofDHyzycyoxFEszFrInCFzGJs8lmhbNPXOemodtd07R6NGUOOoYde5
- Xew6t4tIayRZ8VleDYVmYWZY/DBGJY7iaMlRzlad1UKg+4QCpzGzEReetrSAtgXAXEClH34UGBToq+rN
- 2Cw27p96P09d8xRRoVFe93N5XGw6vYl7P7qXVTmrfDo/TolM4dFZj7JszjLunnw3N4y4gS+M+AJfHP1F
- JqdNptJeSV5FHh7ZfV9+ieR0xWnWnlpLjbOGUYmjiA6NNtzXJExkxGUwJnkMe8/v5Vz1OS0Euo9AsgKo
- 654AUMU+fwiEBfqKeitmYeb2K27nZ9f+jKgQ74O/2lHNr7b/ikfXPMqxkmO+m+NLSItO43df+B3fmfQd
- kiOSL67hm4QJm8XG8IThXD3was5Wn+XIhSO+uXABDa4GtuZvJa8ij+HxwxkQOcCr/0BaVBrD4oaxo3AH
- pXWlWgh0jwjgfaCouxrALcDN7e6rMUbCDSNu4KcLfsqAyAFedyupK+G5Tc/xiy2/oLy+3Kc/fovZwiMz
- H+E7k77TpmdhfFg8wxOG8+mZT7lQe8FnfZBIjlw4wtazWxmTPIYhMUMMhYBJmBgcO5iEsAR2FO6guqFa
- C4GuYwb2Abu6JgCyAXX77wGuCvTV9EokLM5azK+v/zXD4od53e1s9VkeW/sYf977Z98viXlgxuAZPDv/
- Wa8qeHMGRA7A5XGx6uQq394LAedrzrOzcCcJEQkMTxhuaBcwCzOjk0YTExrDxryNONwOLQS6hhkoBv4f
- c8GbEPAuAOYBgjTgP9Hef51HwqikUby45EXGp4z3utuZyjP8cNUPeevAW7ikf/zkbxtzG18a86UO7y+E
- 4MMTH1Jt9/ETWMCFugt8fvZzYkJjGJs81qsQGJs8lip7FbvO7cItfVgOt3/RgOBDBDXeBIB3fVAtD2UB
- WYG+il6HhPCQcB6e8TDTBk3zutu56nPcs/Ie/nX4X357ytmsNkYljOrUZ5IjkhkYNdBvt+d05Wme2/wc
- 7xx+x6vB0Wax8eD0B7ku6zqdubjrDEMyrK37ZywAltN000cByYG+it6GEIJ7rrqHr477qtd9SutL+enm
- n7ImZ41fVVynx0mFvaJTn/FIj9+fuqcrTvPspmf5+OTHXvdJjUrlidlPkBWfpYVA10gBRiHBm1uwsQBQ
- eedC0K6/nUfCNUOu4b6r7yPcahw1Xeus5eef/Zw/7P4DTun0a3fcLjfHSo6puXQHKasvo7C60O+36njJ
- cR5d+yifnvnU6z5T0qbw+OzHiQmL0UKga0xEEOLt3rUVlGkDxqPpFEkRSTw661GGxg41bHd5XLy0/SVe
- 2v7Spay6fuZIyREVMNRBdpzdcSnAyJ8I2F+0nwdXP8iJMuOEtkIIlo5Zym2jbuuRe9UHGU8b6fuMBYBa
- f04Chga6972NpWOWMnfoXK/tG/I28Jvtv6HB2dAz1m0T7CzcyR/2/AGXp/208UdLjvKH3X+4lOXX3wj4
- vPBzntv0HBUNFYa7RIdGc9eku8hK0FOBLjAUQaK335rxKsBcQIUBfRWd/LNjNFr9X1j4glcDWm55Lo+s
- eYQDRQd6NCGG9EjOVJ4hKSKJ4fHDvQbpnK06y4OrH2Rj3sYeX3o7WXaSOFsc09KnGQZHDYoeRIOrgY2n
- N/rEU7EfIYFNwAmjlYC2BMCtwHXo3C0dwmK28MTsJ7hp5E2G7bXOWrI3ZvPu4XdVJF9PIqCioYJNpzfh
- 8DjIjMvELMxYzVY8eKhsqOST05/w8JqH+fjkx8gAPGYdbgdHy44yJW0Kg2MGt74EIRgUPYjN+ZsprCrU
- vgEdxwIcALYYCYDWtzEbUILhNeBbge59r0DC9PTp/P1Lfyc92thl4u1Db/OtFd+iwdUQ0H6GWEIYnjCc
- cUnjyIjLUAOv5ChbC7ZSXudbD8TOYhImlmQt4U83/4nkCOPFp7/s+wv3rLynx+wnfYT/A74LeFpmCWrt
- haF+AAlIhgS6170CqTLhfmfyd7wO/lPlp/jfrf/bc/N+bwj1pD10/hCHig5d9n7Acwuglh/X5K7hvaPv
- 8b3J3zPcZ1HmImYMmsG6k+u0btpxBiNIAC60bGh9C5UDUAKQFuhe9xbGpYxTDisGuD1u3jz4JnvO7Qn4
- ALuIQH3zTVuw9Atwupy8tus1jpceN2xPjUrl5pE3E2oNDXRXexNpSBKMZnaXC4BLWUQTAP+5gvUhQiwh
- fGPCN7wm8zxRdoK/7P0LTrd/1/vbRXZiCyQC9hfv5/e7fu91unTLqFsYlTQq8H3tPaQhiTe6X5dPAcw0
- lf8aCHQsw2N/xgNjB4xlUeYir7u8eeBNTpadDNxT1qMMlJG2SOJscUSFRpESkUJyRDLJEcnYXXYKqgso
- qyujvKGckroSapw11Nnr1FJgANRsp8vJimMruH3c7UxOm9yqfVDMIO644g72Fe0L0E3tdcRgIg038Czw
- 5KWGywWABEIROBhOUCmGQYqA2UNme430O1h8kH8c/odaturBjL1NfUuOSGZy2mRmDJrBnKFzVASesGA1
- W7Ga1ObBg9PlxCmduDwuqu3V7Cnaw6qcVewq3MXhksPYnfaLx+yp+5pXkcf7x95nUuqkViHMAsGizEW8
- EvcKuWW5+pfaPgJJFiYErsv1gNYCwIEFGB7oHvcGYmwx3DjiRsM2j/Tw7pF3OV5yvGfTdVvCmDJoCl8d
- 91UmDZjEqMRRxNpi2/xYqPnSfDopPInMuExuGnET+VX57D63m5UnVrLy+Eou1FzoMY3A7Xaz4ugKvjLu
- K4xNGtuqPSs+iwkpE8gt1QKggwxH6fiXeYMZJWqzAMM6csR+jYSMuAwmDJhg2FxQVcB7R9/rmQq5jYU7
- pg6aytcmfI2vjP0KCeEJbWYbbg+r2UpmXCaZcZksyVrCraNu5U97/8S63HW+DxM2QiivxPW56w0FQERI
- BF8Y8QU+yvkosEurvYcs1Ni+TABcLs/NgIloIDHQvQ12hEnw1XFfJTHc+Faty113Ka2XP5HKS+7Ja57k
- raVvce+Ue0kMT+zW4G9JZEgkN428iT/f/Gf+ettfWZy1GFMPqAJOt5N3j76r0oMZMHPwTFIiUrQxsGMk
- YmDXu/xb9ACSFHT+v7aRMDRmKAsyFhgOtDpnHevy1vnfWcWj3I9/f9PvWTZ3mdcAJF8RY4vh5pE38+qN
- r3LXlXepqYOfB9++on3sOrfLsG1IzBAWDVvUySP2WyIwqOvRWgB4GICu/ts2jer/qETjRBs5ZTlsyd/i
- 1y6YhZn5w+bz2o2vsWTYEsyi/ZSNHumhyl5FQVUBx0uPs/vcbvad38ep8lOU1JWoKkMdYEjMEF5Y+AL3
- T7tfeez5SwgIKG8oZ23uWsPgJJvFxuS0yZhM2iOoA4QDrZJSXm4DUA+zFLQAaBsTjEse57UW3vaC7Zwq
- P+U39d8kTHxl3Ff42bU/8+p92ITT46SsroytBVtZm7uWM5VnKKsvo8peRVlDGVaTlYSwBBLCE4i1xTI5
- bTILMhYwKmEU4dZwrxl8Y22xLJuzjCuSr+CJdU+QX5nvn+v1wNaCrRTWFBoGWU0cMJFB0YM4U3FGGwPb
- pgMCQJGKFgBtYrPYmDPEuE6K0+1kw+kNTUlV/MINI25oM+oQ1NN++9nt/P3g31mTu4aCygKqGqpUY4t+
- 5ZXnXXyKv3vkXV6KeImJAybyrYnfYvGwxV7rGIRbw7l93O3Y3XYe+vghVYrc19dsUsVE8yryDK83IzZD
- CYByLQDaIYw2BcDTqDJgcbr+X3tEWCMYnTjasK3eVe+7vPotkXBFyhVkz8luc/AfLz3Oyztf5v2j75NX
- kafebHL/9Ubj4HF5XBRWFVJYVci2gm0szFzINyd+k/kZ8w2LfppNZr405kvklOXw4tYXaXD73iJfba8m
- pyyHmekzW7UlhCcwJmkMW874d8rVBzABKVQDzwE/vvSmwgPEEQ4kdf7Y/QgJ4weM91raa9e5Xf5JpyWV
- B9wvFv2CK1Ov9LKLZPXJ1dzx7h38etuv1eDvSpBP42fK6sv4+8G/c8e7d/D8p8+rsl0GRIdG8+jMR7ll
- 9C1+sQdIKdlWsM0woYlZmJk5eCYhFl22sgMkE4Ot+UJgy2eCDYgLdC+DGqmMYN7y/e0r2ueXqjbh1nAe
- mv4Q8zPmG7Y3uBp4++Db3P3B3Xxe8LlvioiCEgR1Zfx8y895fP3jnKo4Zbhbk01gevp0vwiBwxcOU+8y
- XlVJi0zzWntQcxlxeAhr/v20FAChQExnjtgfSY9O9yoACqoKcLt8nFFXquIeX5/wdcMfusvj4g97/sB9
- K+/jTOUZ33vrCbW0+bd9f+ORNY+ocxgwMnEkd0++myhblM+FQF5FHrnluYZtKZEpWgB0jBjUGL+IkQYQ
- G+heBjUmvDr/VNur1eDw8dM/MjSSH0z9AfFh8Ybt/zryL5755BnK6sv8agiTSFYcWcHj6x6nuLa4VbtA
- cP3w61mYudDn565x1FBQVWDYFh8WT2pUqnYIap9YWqT4MxIAWgPwhlSqrjeHmxpnDedrfZxN1wNLspZ4
- TTS6p2gPyzYso7i6uEes4C7pYsXRFby882VDF9zkiGS+c+V3iAuL892AFFBlr+Jk+UnD5jBLmF8LmfQh
- YmhHAISiNYA2iQqJ8pquqspepdbDfYWE+PB47rnqHsOqwmX1ZTy1/imOlR7r0bDdOkcdv9n5G1afXG3Y
- PjN9JouzFvv0nC6PSy0zGhAdGq2csrQG0B6xeJ0CqHXrKHQW4DYJtYR6dQCqddRyoc53VXUBJqZOZMrA
- KYZtq3JWsSFvQ8/fBAGltaX8bufvDFN5R4dGc/3w6wkP8aE7iUfVUbS77a2aTMJkuESpaUU4LeIBLgkA
- AUji0ZnWvCNV6Kw3AVDvqu9UBZ6OsDBzoeH5zlSe4eWdL1PnqAvMvRCw+cxmr1rANYOvUV6KPnwqOzwO
- 3J7WBlaLyeL1O9FchoDLMwNdrgFANNqfqk1CzCFEWCMM26oaqnxXUEPCgKgBzBo8yzDgaG/RXnYW7gzo
- t1Vrr+WN/W9Q2VDZqi0lMoVp6dO6cFTv1DvrvRY38eayrLkMAUQ1/81c7ggkiOj0IfsZZpPZ65JTlaPK
- dzn1JYxIGMGIhBGtmpweJx/lfITD5Vtto9MI5fh0rPRYqyabxcb4ZN9Wlqt11HrVsGxmPXPtAAKIoFld
- lUsCwAxIItEaQJsIITCbjCPvfFpOywRXpV1laHAsry9n0+lNgb4VIOBczTl2nN1h2Dw+ZTwJEQm+mQYI
- NcXypgGEWXUEewcQQGTzSX7L+X4EWgC0iQmT19BbX6qhFpOFAZEDDNu2FmxV1XGCAOmRrM9bb7gkODR2
- qO/sAFJpFd60rx6rZdi7EbQI9DO1aNQaQDu4pdurGhodEu2zTDxmk9mr48/hC4epdFQGzTeVV5GH09M6
- 7Xl0aDTRodE+O0+ENcKrtb/GURPo29AbaDXGjTQATRs43U6vPulmk9lng9JqsjIoapBhW0VDBdIdPE+8
- sroySmpLWr1vs9iwWXw3N08ITyDM0lrVd3vcVNmrAn0beguXjXEjDUDTBm7p9lrkI8Qc4jMNwGKyGEYc
- Ot1OQzfcQOJwOyitb523L8wS5lMNINQcamh/sbvtlNSXdOGI/ZLLpvktNQBtSWmLxtp6dU7jtfe4sDgi
- QnyjRJmEyXDw2N12ah0dS93VU9jddsPEnVazyjbkE5kolaGvZY0AUPN/t8cdNFOiIOeyMd5SA2g/sVw/
- p9peTXGd8RM40hrJgIgBPjF6SSkNDWsWkyXovN6sJqvXJ73dZffZKoA3/wtvGojGEGvz/7QUpzqmsh2q
- HdVeVfDI0EgVleYDnB4n52rOtXo/xByitIzgMQFgs9hIjmy9XNngalCqeXf7KiHSFklWfJZhs8Pt8Bon
- oGmFmTamAFoAtIVQP2ojzzeAOFscGbEZPhmcbo+bC7WtqjljEibibfFBpe5aTBbDYKXyhnLK68t90tfE
- 8EQmDpho2FbjqFGJSoLongQxl43xlgJATwHaweV2cbTkqKFDitVsJSHcN3Nel3R5VWsz4jKwhQSP59uA
- yAGG6nmDs8HrikmnkBATGsPgmMGGzbnluXoVoOO0KQC0BtAB8irzDA2BAsHVA68mxhbTbS3A6XZ6TYAx
- I32GSkoSJNOAOUPmYLO2FkiV9koq7T7wVxCQlZDl1fZx6MIhnwdh9VkkFmNXYG0E7DAnSk9Q7ag2bBub
- NFYlw+guHnUeu6t1+GtmXCaTBkwK9G0AIDwknNlDZht6Rx6+cFglSPWBAJg+aLpXAbD73G5cLlcnD9pv
- 0VOAbiFUKK63/HQDowZ6NVZ19jy7z+3mQPGBVk1h1jBmpM8I/JzXowqkGKVIb3A1sCpnFfWO7k8BLCaL
- YYFQgMqGSs5UnenkEfsxAgsm70bAIFEqg5tqRzVb87catkWGRKrB2V0EFNYUGkbaCQQ3jrxRDYoAfmNW
- i5WlY5YyJHZIq7Z6Vz17ivZ0/yQSxiSNYVi8ccHqguoCztf4OA1bP6K5AJCAj9PZ9k3cbjeHLhzCIz2t
- 2oQQTE6dTExY91MrOl1OVuesNvQHGJs0lqVjlwauLp6EyamTueOKOwybDxYfNFzG7Mp5pqRNUasrBhwv
- OU5+lZ/KkvVNXDR7bJgMGjXtIdUP3Ft67KvSrmJCygTwdPK4Bmwp2HKpuk8LvjH+GwHTAkItodw54U7S
- otJatTndTt49/K5P6iNEhEawIHOBYRSgw+1g7am11NqDyzMyqJG4vBkBQQuAjiHgVMUpw/k5QGpUKgsy
- FmC2dNOkIuBU+Sn+uv+vhsuOQ2KH8PCMh0mJSOlZIeCBxVmL+eKYLxo27z63m/ePve8TB6CB0QOZPXi2
- YXNJXUlw5EXoTQhcbeUD0FOAjiCgvK6cNSfXGC4/CQQLMhcQZ+t+amyPx8NbB97iYPHBVm0mYeKr477K
- PVffg8XcQyu4HpiaPpXnFzxvmKzE6Xby6q5XfVMdWcLcIXO9lmHbfGazX6sw91Eue5JcnhJMagHQGTac
- 2uDVLXh8ynimD5re/ZM0ahuv7nrVMCOu1Wzlvqvv4+sTvo7VZO3CCTqBhMFxg3lqzlNerfKf5X/GRzkf
- +eR0kbZIrh9+PaHm0FZtHunhk9OfBF1gVC/AiwCQrRs1bSCUB9onpz8xbI4KieLOCXeqIBkfqMIrj69k
- 8+nNhs0JYQk8P/957pxwp+Fg8cnlSsGk1En85vrfcMPwGwz3qbRX8tru1yiqLur+U9kD84bOY0HmAsPm
- 3PJctuTrisCdRuLGbWQENCMRWgB0hjpnHety1xk+mQEWZCxgztA53T+RgPyqfJZ/stxwWRCUO+4vF/+S
- Fxa+oEJwfWUTkGqqsTBrIa/f+jpfGP4Fw91cHhev7HyFfx3+l09U8ojQCO6efLfXdN97ivaoe6HV/85y
- 2Ri/ZKWaiwBuACYGuoe9ieK6YmYPma1y37UgzBqGw+3g49yPDVNmdZbC6kKq7FXMGjzLsDhpqCWUiQMm
- kh6dTrm9nAs1F3C6nF0bJBIswsLg2ME8MO0Bls1ZxvCE4V7zHq48vpIn1j+hAqV88PS/YcQNPDDtAUIt
- rTWaOmcdz3/6PPuK9mkB0FkEOzHxARvVI6K5AABYCEzpynH7JULlB4gPj2f+0PmGySqSIpI4WHyQE6Un
- uv1j9UgPh4oPYTaZmTV4lmF2HIvJwviU8SzOWszg2MGU28s5V3NO+Sy01Aqa+tPifbPZzPCE4Xxtwtd4
- 8boXuXnkzW26N2/N38o9H97jm8KoEqLDosmem82EARMMd9mQt4H/2fo/Kh5DC4DOshn4iI3qPy01gLmA
- D9zY+hfna85zbea1hlbx6NBoYmwxrM1dqwxW3RUCHg+HLhwiMjSSMUljDOf8QgiiQqK4KvUqlmQtYX7G
- fDLiMvA0/rNarJhMJqSUhFhCiA6NJio0itSoVJYMX8IDUx/goZkP8eWxXyYlIsVQsDWxrWAbD615iH3n
- fPc0vm30bfxw+g+xmlsbNasd1Tz/6fNsL9iuB3/X2AisaxIAzdeOJFBDU5VATccQcLriNP849A9GJo40
- tMQvyFjA0rFLeXnnyz45X1ldGY98/Agny06ybM4yr9mDhRAMjB7IwOiBLM5aTJW9itzyXM7XnqesrozS
- +lIiQyJJjkwm0hpJWlQaQ2OHdijjkNOjvBSfWPcEB84f8Fnar6GxQ/mvqf9lOMUBJXBW5azywcn6Jc3H
- ONBcADQAYdQ1lrbRAqATuDwu3jzwJreNvs0waYXNYuN7k7/HtoJt7C7c7ZPoOLvbzu8+/x0Xai/w+KzH
- uSLlijY/YhImYm2xXJl6Zbevt8HVwOv7XufpTU9ztvKsz34tYdYwfjTjR0wdONWwvd5Vz1/2/sUnHob9
- FAlcFsd+aQowDzAxEbgefXs7h1DZb0LMISwatshQZU6JTMFmsbHu1DpV0ssHd9gjPRwtOcreor2kR6cz
- KHqQ18IZvsAjPZyqOMWL21/kmU3PUFrrw4Eo4Qsjv8CT1zzp9em/MW8jP9/yc1UQVf9Cu4IHWAHsam0D
- mA/AGOAmdIXgziNVZNrktMleA1dGJIyguK6YXed2+ayGoEd6KKgqYMOpDZyuPE2MLYbUyFSv5cu6Sl5F
- Hq/vf52HP36Yfx/7N/XOep8O/mHxw3hpyUteQ6kr7ZU8/cnT7CjYoQd/15HAO0j20+i+culXMgcQDAOW
- ogVA5xHKQFXRUMH8jPmG6cGtZitjk8eyv3g/p8p868JaZa/i88LPWXdqHWerz5IckUxUSBQWk6VLJcsk
- kgZnA2cqz/DPI//kx+t/zP/t/j+Ka4tx48MU3FKlU392/rMsyVri1eD48s6Xefnzl3FJ7arSDTwI/obk
- WGsBMBcwkQx8DZ0YpMvkVuQSY4th+qDphj/mWFssWfFZ7D63m6IaH3jMNdF4nMr6SnYU7GBlzko2nd5E
- QVUB9c56wq3hRIVGtXsYu8vOoQuH+PDEh/xmx294YcsLvH3gbU5XnFbn8PHTN9QSygPTH+Deq+81tPqD
- KoX+yNpHKK4p1k//7uFC8AqSM00C4NLtXAbAJASfAO3/UjTGNKqzf7r5T8weMtvLLpKPTnzEQx8/xJEL
- R/zzo242w0gITyArPov0mHTSo9OJD4snPiye1KhUquxVVDZUUlxbTH5VPkU1RZwqP8WZyjOX0pH5adBZ
- zVbum3Ify+YuIybUOH9CWX0Z3/7g27x/9H3/dKJ/UYl61O8lW71xyWKkvuSGxp20AOgqAk6WneS/P/tv
- shKySI1MNdhFsGjYIh6Z+QgPffyQf6zazY5XWl9KaX4p2/O3g0mtCJiFGbPJjEd68EgPbulGeuSlRWA/
- PO2bYxZmbh55M09e86TXwQ/wzuF3+OiEb4KLNFSgxvhFWnoCRgO3AskdPqSmNY0RfG7p5poh1xj6BpiE
- idFJo4kKjWLH2R2+Nap56VPT8SUSj/Tg8rhwS/elzEY9MPCbWDhsIb9Y9AsGRQ/yus+GUxt4dO2jqvCo
- Vv19wRngDaDCyBMQVN2wG4HBnTuupiUej4fDFw6TEJ7A5NTJhoY4i8nCpAGTiA2LZU/RHq+ZhvsMUl3z
- nRPv5OcLf95m8tTc8lzuX3W/9vf3LceAt4Ga1gJgHiCwAtcBIwLd016PUAa1nLIcRiaOJDMu01AImE1m
- xqeMJys+i2Mlx/p0gstQSyj3Xn0vz89/vs0SavmV+dy/6n7W5q7ts/ciQOwD/gk0GPsBmBBIrgUmdP7Y
- mlYIKK0rZX/xfsanjPda2cZisjA8YTijE0dzsOSgiqfvS/6YEmJsMfxg6g946pqniLXFet21rL6MH6//
- MW8feLvvXH/wsA0TKwBXawGwENiOkzRmAT5IZaMBQKhgoSYh4G3OaxImhsQOYWHmQirtleSU5ah0Y719
- EEjIjM/k+fnP859T/tNrfD+oMN8XPnuB3+/6vV7v9w9rcPERJmgtANYB/wGofAALA93TPoWAc1Xn2Hd+
- H9MGTSMlMsV4NyGIC4tjRvoMbFYbR0qOUGOv6Z1CQKpKxreMvoWXlrzE9cOvbzPIqN5Zz693/JoXPnvB
- N/UENS2RwApMbGlaAoSWDj9zARgGLKZFHXFNNxFQWFXIrnO7uCLlijat3xEhEcxMn8mk1EnkV+WTX5mP
- lLJ3CIJG/4Nh8cN4bPZjPHnNk2TFZ7XpjVjRUMELW17ghc9e8EnItMaQOpQBcH/T0x+MBcAA1EpAeMeO
- q+kwjUJgb9FexiWPY2D0QK8DwyRMZMZmsiBzAcPjh1NYU8iF2gvBLQgkRNuiWZK1hJ8v+jlfGvMlQ5fo
- 5hRWF/Lkhid55fNXdIIP/1KJ4HUEud4FgFoJiAS+BHS/tI2mNQLOVZ/j83OfkxSRxIiEEYaFNUFNCWJC
- Y5icNpm5Q+YSbg2nqLaIivoKFdcVLINFqiKhS7KW8JM5P+HhmQ+3+9QHFWB030f38daBt3C6u5i6TNNR
- SoHfA8VtCwD1NdwBJAa6x30WAedrz/PpmU8JtYQyKnEUNoutjd0FieGJzB48m3kZ84ixxVDrqqW8rhy3
- x4eBOZ3Fo6z712ZeyzPznuGBaQ8wOW1yhzIT7y3ayw9X/5APT3yoIiP14Pc35zDxG0zUsuHSm5ff9mxA
- OQOtRacG8z8SQiwhfGXsV3hwxoOqnFiHPibJr8hnxbEVrDu1ji35WyirL8Pj9vjPk0+qTQiBLcTG0Nih
- 3DTiJqanT2fe0Hkq/XkHqHXU8u7Rd3lx24u+SY6i6SibUcb9huZGQCMBYAX+CHw90D3uT0wbNI2nrnmK
- +Rnz29QGmiORVNmrOFZyjLW5a9l8ZjMnSk9QUF1Ag7NFQdHODLSWSUJNZqJDo8mIy+DK1Cv58pgvMyZ5
- DEnhSR1KH9ZETlkOv9z6S/66/6+9d3Wj9/IX4LuAsz0BIIAngacD3eN+hVRRe9+d/F3unXJvl5J6VNur
- yS3P5VjpMfYW7WXf+X3kV+ZzvvY8Da4GHG7HxeAfj/QogyLK4GgxWzAJEyZhItQcSnxYPENjh3JV6lWM
- Sx5HUkQSIxNHkh6d3maSUCMcbgfvH3ufn23+GXvO7QluQ2bf5cfY+Cl2ZGPkL9Dya1hOk3Hpq8Cb6K+p
- Z5EqRHZc8ji+OfGb3D7udq918drD5XFR76yn3lVPaX0pBZUFnK48Tb2rnjpnHQ2uBmqdqqxWVEgUKREp
- hFvDsVlsDIkdwpCYIYRaQomwRnQ5zZjb4+Z42XFe2/Uar+97XaUQ06lmAoEEvoLkHczATy41XD7A/wAU
- ADALWImKDtT0NI22gWszr+X+qfd7LQQSrLg9bo6XHuftQ2/zzqF3OFZyDI8vaqVrukoFkhuALSy/vOFy
- HfMDmnwBIlDJQfVKQCAQ4JZuTpSeYO2pteSW52ISJhLDEwmzhgW6d15xSzXwf7vztzy54UlWHFmhfBdE
- T9Yu1xiQi+DPCEqbLwHC5XUBmlMKnAVGBbrn/RoBRTVF/HH3H3nv6HuMSRrDtyd+m3lD5zEweqBfMwB3
- htK6UnLKc1iVs4q3D75NTmkOLo+rx3ILaNrlLGpMt6ItAXA60L3WKCSS0tpSPq35lO0F2xmdOJprM69l
- SdYSZg6eSZglMFpBg6uBNw68wTuH3mHb2W1U2atUViE98ION04RThkEN29Zm5o3AXCTq6a+ChDWBp3FQ
- uaWb8zXn2Za/jfV56xmXPI7hCcMD0qWSuhKWb1zO2pNrL1VI1gM/2HABb+NkS3PrfxNt6ZAHgWogNtBX
- oGmBACklaVFphpWIQD2ddxTuwGa2kRmXidVkxWwyYxZmTCYTAoFJmC6mB5NSXkwPVu+sp6KhgryKPMob
- yhmRMIJJAya1OkdSRBIzBs9g/an1gb4jGu/UAIe8NRoLACXFjyC1AAhaJCzKXMSAyAGGzRvzNvL9f3+f
- WmctcbY4om3RJEckExMaQ2RIJCGmECJCInC4HWpZ0N1Alb2KKnsV+ZX51DpqaXA1YHfbuXvy3UxImdBq
- /d8szCzJWsKf9/6ZgsoC/fQPTiqBo94ajQWAMtqWAqeAdDTBhYTkyGTmZ8z36pSz7tQ6TperXP4ltSXd
- Ot3qnNXcNekuxiWPa9U2Pnk8YxLHUFChBUCQkosXAyC0Pb+vB/YHuvcaY2YNmcW0QdMM23LKclhzcs3l
- WX67sR0tOcrqk6sNzxUVGsXSMUsJsXbcJVjTo+zHRIM34WwsAAQgcaKSCGqCjBBLCDeNuMmrT8CGvA0c
- LD7osyeylJI1J9dc9BxsyeKsxYxMGImPyh1qfIcE9uLC6e1Rb/z2Mpp+PEeB84G+Ck0zJGTEZjAvY55h
- s91t572j76kwYR+y69wutuRvMWwbEDmAuUPnagEQfBQhOY4AnjLewfsUQKl/J4GcQF+FphkClo5dysDo
- gYbNuwt3s/fcXp+fs7SulE/yPrlURKQZIeYQlmQtITEyUQuB4OIkgpNtaYLeBYCK/y6iDQuipoeRkBaZ
- xuLMxYZZhFweFyuOrfBt0dGmU0vJu0feJbc817B95uCZTB04NdB3SHM5R8jmPG1kZfMuALIBJQZ2Ao5A
- X4kGkDB+wHimDJxi2Hym8gwrj6+8GObrUwScKDvBp6c/NWyOCY3hxpE3djqEWeM37MAOsoGHve/UES+/
- HShnAk2AsVgs3DLqFq8JQ7YVbONYyTG/Lce53C5Wn1yt8vcZMG3QNAZGDdTTgOCgBsGO9nbqiADIR9UU
- 0wQSCVckX8GizEWGzTWOGt45/I4KwvEjWwu2suvcLsO2EfEjuGHEDdofIDg4gqSwvZ3aFgACMFOByiem
- CTALMhcwNHaoYduOszvYmr/Vvx0Qqm7fB8c+MBQ0YdYwrsu6joSwBK0FBJ7PgPL2dmpbAFgBNy5gG3oa
- EDik8rtfPGyxYaptj/SwLnddjxQWlVKy+uRqLtReMGyfMXgGIxJ0bdkAU41kG5J214LbFgBP0LQcuAc4
- Geir6s/MSJ/h1fPvXPU5Vp1c1TMdEXC89DifF35u2JwQlsCto2/V04DAkouJPZigeQJQIzoa6nsa7RUY
- MIRJcNvo27wW1tyQt4FDxYd6bNDV2Gt479h7qnipAdMGTSMlIkVPAwLHXhI4Q0b7O7YvAJYBEg+qfKiz
- 3f01HUd2YPPAmMQxTB1kvMZe76zng2MfYHfaO3Y8H22b8jZxoPiAYZ+uSruKxVmLO3Ysja9xIljDBSR3
- tr9zZ3JK7QAKgSGBvsJej1QGs+TIZBLDEtssoeXyuLhxxI0Mixtm2F7WUEZ6dDpLxy3tdLru7iCEoKKh
- wrAtzBLGzSNvJqcsB7vbjvCimtQ4aiisLqTGXqOThvqOAiQ7O6oNdmy35YAgHA8vA98I9BX2ZoQQjEka
- w2MzH2N+xvx28/pJJOGWcKJCowzb3dJNg6vBP84/7WA1WQm1GJcBc7gdVNor2+yX2+PmWOkxXt31Ku8d
- ee9SViFNd/g/TNyHpN4oA1BLOqYBKHWtDlUybCkQ0aHPaS5HQlZCFq/c8AozB8/0+mTsDGZhJsIafF9H
- iDmEpPD2axqkRqUyacAkYkJjeG33a4axBpoOUwOsxUN9Rz/QMZ0xm6bVgE2oJCGaLmAymbjv6vuYNXiW
- TwZ/XyHGFsMPp/9QJRzRdoHukIvgUwTtWv+b6PikUWkBBcAngb7K3kpkSCTXDL4m0N0ISjJjM7ky9cpA
- d6O3sxFJYWeEaGetRh5UxaC6QF9pr0PCoOhBXufy/R2r2UpaVJr2H+g6dcCHSDydGdUd3zX74qu9qAhB
- TWcQUFxbTHl9u96Z/RK3dHPkwhE9Beg624F9CC6r/dcendMArICdc8D/Q/sEdJqSuhL+fujv2tBlwN6i
- vewp2hPobvRWnMAHSIo6q0F1Lnh7PbAQEJSiagcmBPrKexUScityGRo7lFGJo3p03T6YyS3PZfkny9ly
- ZoueAnSNHGAZgvKOGv+a6HxxOaWi5QIfAYEpSdNbEVBUXcSDqx9ka8FWZgyawcjEkYbZffoD1Y5qdhbu
- 5K2Db6lIRj34u8qHdLGUX+dv+XJodNqai+AddAXhziPBJEyEhYQRZgnrt0uCbummxlGDw+XQg7/rXED5
- 5mwCOrz810TXbrs6SRTwF+DWQN+BXk1/N3rpgd9d/oXgW0B1Rzz/WtK1SWg2oOoGvgXUdukYGoWPinf0
- 2k3THWqAt5BdG/zQ3cq/grXAp906hkaj6SqfoEzzXabrAsAEuCkHXkdrARpNT1MD/JUOpP1qi64LgJ9c
- /PRaYEuXj6PRaLrCZ6ix12nDX3O6NwVQJ76A0gIaAn1HNJp+QgOCvwKl3Rn80F0BAE1BQqvQQUIaTU+x
- vnHMdZvuCwBlzS0BXgXKAntfNJo+TynwKi5KsXb/YN0XANkXX61GeSRpNBp/IVmJ5GMswI+7fzjfOKNn
- ozIGCV6B9quRaDSaLlGA4BUEDd2d+zfhu2gUAUh2Am+CzvCo0fgYCbyNiV2+dKDynQDIBgQOBH8A9vfw
- zdFo+jp7gdfw4Oiq158Rvo1HVSsCx4CX0M5BGo2vqAFeBI77+sC+jUPdCMwFVOLQTGC8f++LRtMveAv4
- X8Duq7l/E74PRN8IzMUO5AHz0UlDNJrucAx4CDjt68EPvp4CXM5e1FRAJxDVaLpGHfAitsZcf37AP6lo
- NgLzAMEJJEMRTPDTDdJo+jJvAL/A5btlv5b4LxfVRmAuDQiOAtOBVL+dS6Ppe3wO/Ag466/BD/6dAjRx
- BHgOFTSk0Wjapxg1Zo75+0T+zUa5kaZVgRwgHJhFzwgdjaa34gJ+AfwR8Pjz6Q/+FgDQJAQ8wGFUafEx
- 6GRQGo0RHuAdBM8gqPH34IeeEADQZBSsRbAfmAwM7pHzajS9i80IfgTk+9Lbry16Vh33cBx4HDjRo+fV
- aIIfNTZcvvf2a4ueq0ixEbU0CAVAETAHCL7C9hpNz3Me5ezzMSa6leKrs/RsSZqNwDwkgmOo+c4MIKRH
- +6DRBBfVwHOY+Qs9YPRrSc/XpNpIk1FwPxAKTKErJco0mt5PPfC/mPgV0NBT8/7mBKYo3UZgLg5gBxAN
- XBmwvmg0gcEOvAw8i6QmEIMfAjnoNgLzcCDYgaovOBHtI6DpH7iAPyLJBqpYHriOBPapuxGYSz1KE0gB
- xga8TxqNf3GiCno8iaA0kIMfgmGwbQTmUItaA40CJqBtApq+iR34PSZ+jKAkUGp/cwIvAEBVFJhPHYIt
- KMPgRPBF0mONJmioA36LYDlQHgyDH4JFAIDSBObTgGArEoEyDIYGulsajQ+oBn6JiecRVAXL4IdgEgAA
- G4A5OICdqJs2EYgMdLc0mm5wHngW+BWS2mAa/BBsAgCaVgecCHYBuSghoNOKaXojx4GHEPzVl7n8fUnw
- CQBQQmABHqwcwc1eYDSQho4i1PQOPMBW4L8IZTUSNz8JdJeMCU4BAGo6MBuAM6hSyKnACLSvgCa4cQHv
- Afcj2IMTgk3tb07veKJmAzAAuBf4HpAU6C5pNAZcAF5BefgVBaPK35Lg1QCasxG4lhpMbEaSAwxHCYTe
- IcA0fR0J7EXwKBZew0RVsKr8LekdAgBgPSqIyMQxlOdALJCF9hfQBJY64O/AD3GxGQ/uYFb5W9J7BAA0
- LRNKoKTxf+eRDEcQh9YGND2LB0kOgmeBF4ACTMhAu/Z2lt47aJ4GrJhwMAHJA8AX0QlGND1DLfAvBC8S
- wj6ceHqLyt+S3isAmsgGVEjxrcADqHqEeqVA4w88wD5Uxav3gKreYOhri941BTBiI021CPdjYj0SCWSg
- PQg1vuU88EdMPIZkA34o1BkIer8G0Bw1/7IhuRr4PrAYiA90tzS9mjJgFYJXUWHrAcnc4y/6lgBoYjkg
- CMfDYuBuVHkSW6C7pelVNKD0y1cxsRpJfV8a+E30TQEAzTOrJgJLgDtRNQr11EDTFjUoN97XgY8QlPbF
- gd9E3xUAzVkGmEhAshD4BqpEmRYEmiYkyrL/KYLXgTV4Ap+tpyfoHwIAmmsEccAC4D9Q0QaJge6aJqCU
- AJuANxCsx0oFDno0N38g6T8CoInngSogjGgkk4FbgOtQdQt1jYL+gQM4DXyEWs7bhco/0W8GfhP9TwA0
- 8SzwTeCPWJBkADcBXwCuRlUy1vQ96lCW/H8DHwCnUNF7/W7gN9F/BUBL/geoYgCCq1CCYBYwFO1d2Nup
- BfKAzcBKJDuJpogHA92t4EALgOZkAzFALWbcpCOZA8xHLSOmobMV9xZcwFnUMt561Bw/H3AD/fZpb4QW
- AG2RDQgigHRgKpIFKFfjTCAq0N3TXEY1cArJXgTrgB0I8pHU6gHvHS0AOsovAImJOoYgmQBMRzIbwSjU
- NEEbEHsWB0q9PwJ8CmwD9iI5A3j6wxKeL9ACoLNkX3xlQRKHIANV4PQqYCQwDLW0qAOSfIsHlXEnFzgG
- fI5gB5JTCCoAFxKt3ncSLQB8QTagAqsGoKYHw4ErUFWOMlGWhUi0DaGjuFAeeZVITiLYj2B/Y/z9SSRF
- BKCUdl9ECwBfk43yKzNjxYMNldJ8FDAOldR0MDAIGIgSDP39O5BAJVDQuOWjnvCHgKNIShHUE44LF/BE
- oLvbt+jvP76e4zkAzLiIQZKImiYMRE0bRqLSm8UDYc02G70/ZNuNCqypb7aVASeA4wiOIylAeeSVoISB
- Wz/dewYtAAJJNqC+AwtmrEhi8ZCMIBlJMqpicjJKWMSj8iA2bXEoISG4ZG8QzTZ/IJttoOblEjWoy4GK
- ZlsZakAXA+cRFCMpxkQxUIEbJwIXNBbJ1gQELQCCmWdR35Cb0MbphI1LmoENtRSZgMqIFN64hbV4HYZK
- nGpF2SCsLTZQJasdqLm3s/Gvo3GzowZ4XePW/HUVglIk1ainfNOTvgETDZixI4EnA30jNd7QAqCvkX3x
- lbj4VzZ7T6Ce2eKyfeTF92Tj/y+1yov7XH58jUaj0Wg0Gk2v5P8D5M/bzdE8cNIAAAAASUVORK5CYII=
-
-
-
- 6, 5, 6, 5
-
-
\ No newline at end of file
diff --git a/cmonitor.install.win/Program.cs b/cmonitor.install.win/Program.cs
deleted file mode 100644
index 9ad4f752..00000000
--- a/cmonitor.install.win/Program.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-namespace cmonitor.install.win
-{
- internal static class Program
- {
- ///
- /// The main entry point for the application.
- ///
- [STAThread]
- static void Main()
- {
- Mutex mutex = new Mutex(true, System.Diagnostics.Process.GetCurrentProcess().ProcessName, out bool isAppRunning);
- if (isAppRunning == false)
- {
- Environment.Exit(1);
- }
-
- AppDomain.CurrentDomain.UnhandledException += (a, b) =>
- {
- };
-
- // To customize application configuration such as set high DPI settings or default font,
- // see https://aka.ms/applicationconfiguration.
- ApplicationConfiguration.Initialize();
- Application.Run(new MainForm());
- }
- }
-}
\ No newline at end of file
diff --git a/cmonitor.install.win/Properties/PublishProfiles/FolderProfile.pubxml b/cmonitor.install.win/Properties/PublishProfiles/FolderProfile.pubxml
deleted file mode 100644
index 219cd963..00000000
--- a/cmonitor.install.win/Properties/PublishProfiles/FolderProfile.pubxml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Release
- Any CPU
- bin\Release\net7.0-windows\publish\win-x64\
- FileSystem
- <_TargetId>Folder
- net7.0-windows
- win-x64
- true
- true
- false
-
-
\ No newline at end of file
diff --git a/cmonitor.install.win/Properties/PublishProfiles/FolderProfile.pubxml.user b/cmonitor.install.win/Properties/PublishProfiles/FolderProfile.pubxml.user
deleted file mode 100644
index 815596c3..00000000
--- a/cmonitor.install.win/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- True|2024-01-15T07:11:18.1268938Z;True|2024-01-15T15:08:01.2098368+08:00;True|2024-01-15T15:06:39.4979669+08:00;True|2024-01-15T15:00:07.0902803+08:00;
-
-
-
\ No newline at end of file
diff --git a/cmonitor.install.win/app.manifest b/cmonitor.install.win/app.manifest
deleted file mode 100644
index 75867c29..00000000
--- a/cmonitor.install.win/app.manifest
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cmonitor.install.win/cmonitor.install.win.csproj b/cmonitor.install.win/cmonitor.install.win.csproj
deleted file mode 100644
index b1e53549..00000000
--- a/cmonitor.install.win/cmonitor.install.win.csproj
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- WinExe
- net7.0-windows;net8.0-windows
- disable
- true
- enable
- app.manifest
- favicon.ico
- Debug;Release
-
-
-
- embedded
- True
-
-
-
- embedded
- True
-
-
-
- embedded
-
-
-
- embedded
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/cmonitor.install.win/cmonitor.install.win.csproj.user b/cmonitor.install.win/cmonitor.install.win.csproj.user
deleted file mode 100644
index 28df7e9d..00000000
--- a/cmonitor.install.win/cmonitor.install.win.csproj.user
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- <_LastSelectedProfileId>D:\desktop\cmonitor\cmonitor.install.win\Properties\PublishProfiles\FolderProfile.pubxml
-
-
-
- Form
-
-
-
\ No newline at end of file
diff --git a/cmonitor.install.win/configs/config.json b/cmonitor.install.win/configs/config.json
new file mode 100644
index 00000000..8c58ae76
--- /dev/null
+++ b/cmonitor.install.win/configs/config.json
@@ -0,0 +1,25 @@
+{
+ "Client":{
+ "ApiPassword":"snltty",
+ "ApiPort":1803,
+ "GroupId":"snltty",
+ "Name":"DESKTOP-1111",
+ "Server":"127.0.0.1:1802",
+ "ShareMemoryCount":100,
+ "ShareMemoryKey":"cmonitor/share",
+ "ShareMemorySize":1024,
+ "WebPort":1804
+ },
+ "Common":{
+ "Modes":[
+ "client",
+ "server"
+ ]
+ },
+ "Server":{
+ "ApiPassword":"snltty",
+ "ApiPort":1801,
+ "ServicePort":1802,
+ "WebPort":1800
+ }
+}
\ No newline at end of file
diff --git a/cmonitor.install.win/default.aproj b/cmonitor.install.win/default.aproj
new file mode 100644
index 00000000..047b87ea
--- /dev/null
+++ b/cmonitor.install.win/default.aproj
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/cmonitor.install.win/dist/cmonitor.install.win.exe b/cmonitor.install.win/dist/cmonitor.install.win.exe
new file mode 100644
index 00000000..8a6b9f9b
Binary files /dev/null and b/cmonitor.install.win/dist/cmonitor.install.win.exe differ
diff --git a/cmonitor.install.win/lib/config.aardio b/cmonitor.install.win/lib/config.aardio
new file mode 100644
index 00000000..5da06a0a
--- /dev/null
+++ b/cmonitor.install.win/lib/config.aardio
@@ -0,0 +1,17 @@
+//config 配置文件
+import fsys.config;
+config = fsys.config("/config/");
+//config = fsys.config( io.appData("/软件作者/应用程序名/") );
+
+//不需要序列化的配置名字前请添加下划线
+namespace config {
+ __appName = "应用程序名";
+ __website = "http://www.aardio.com/";
+}
+
+/**intellisense(config)
+__appName = 应用程序名
+__website = 官方网站
+saveAll() = 写入所有配置到文件
+? = 获取值时指定不以下划线开始的配置表名称,\n返回一个可自动序列化到同名配置文件的表对象。\n如果此对象名以下划线开始,则可以正常读写值不会序列化为配置文件。\n否则不能对此对象直接赋值,只能对配置表对象的成员赋值。\n\n配置表可自动自文件加载,退出线程前自动序列化并存入文件。\n仅序列化以字符串、数值为键的元素,\n仅序列化值为字符串、数值、buffer 以及定义了 _serialize 元方法的成员。\n循环引用的值转换为 null,序列化时忽略成员函数\n!fsys_table.
+end intellisense**/
\ No newline at end of file
diff --git a/cmonitor.install.win/main.aardio b/cmonitor.install.win/main.aardio
new file mode 100644
index 00000000..c644b8e6
--- /dev/null
+++ b/cmonitor.install.win/main.aardio
@@ -0,0 +1,333 @@
+import win.ui;
+/*DSG{{*/
+mainForm = win.form(text="cmonitor.install.win";right=403;bottom=395;max=false)
+mainForm.add(
+btnCheck={cls="button";text="检查安装";left=324;top=351;right=393;bottom=374;z=4};
+btnHidePassword={cls="button";text="隐藏密码";left=321;top=201;right=382;bottom=224;z=34};
+btnInstall={cls="button";text="安装";left=129;top=349;right=189;bottom=379;z=6};
+btnRun={cls="button";text="运行";left=205;top=349;right=265;bottom=379;z=14};
+btnSaveConfig={cls="button";text="保存";left=210;top=202;right=248;bottom=225;z=35};
+btnShowPassword={cls="button";text="显示密码";left=255;top=202;right=316;bottom=225;z=33};
+cbClient={cls="checkbox";text="客户端";left=72;top=17;right=133;bottom=36;tabstop=1;z=19};
+cbService={cls="checkbox";text="服务端";left=262;top=17;right=327;bottom=35;tabstop=1;z=20};
+editApiClientPassword={cls="edit";left=74;top=199;right=174;bottom=221;edge=1;password=1;tabstop=1;z=25};
+editApiClientPort={cls="edit";left=74;top=168;right=174;bottom=190;edge=1;tabstop=1;z=24};
+editApiPassword={cls="edit";left=273;top=135;right=373;bottom=157;edge=1;password=1;tabstop=1;z=28};
+editApiPort={cls="edit";left=273;top=105;right=373;bottom=127;edge=1;tabstop=1;z=27};
+editMachineName={cls="edit";left=74;top=75;right=174;bottom=97;edge=1;tabstop=1;z=21};
+editServer={cls="edit";left=74;top=105;right=174;bottom=127;edge=1;tabstop=1;z=22};
+editServicePort={cls="edit";left=273;top=168;right=373;bottom=190;edge=1;tabstop=1;z=29};
+editShareKey={cls="edit";left=72;top=271;right=172;bottom=290;edge=1;tabstop=1;z=30};
+editShareLength={cls="edit";left=72;top=297;right=172;bottom=319;edge=1;tabstop=1;z=31};
+editShareSize={cls="edit";left=273;top=295;right=373;bottom=317;edge=1;tabstop=1;z=32};
+editWebClientPort={cls="edit";left=74;top=136;right=174;bottom=158;edge=1;tabstop=1;z=23};
+editWebPort={cls="edit";left=273;top=75;right=373;bottom=97;edge=1;tabstop=1;z=26};
+groupbox={cls="groupbox";text="客户端参数";left=13;top=44;right=196;bottom=236;edge=1;z=9};
+groupbox2={cls="groupbox";text="服务端参数";left=200;top=46;right=393;bottom=236;edge=1;z=8};
+groupbox3={cls="groupbox";text="共享数据";left=13;top=241;right=393;bottom=332;edge=1;z=2};
+static={cls="static";text="机器名";left=24;top=79;right=69;bottom=101;transparent=1;z=13};
+static10={cls="static";text="web端口";left=20;top=139;right=70;bottom=164;transparent=1;z=11};
+static11={cls="static";text="管理端口";left=17;top=172;right=71;bottom=194;transparent=1;z=3};
+static12={cls="static";text="管理密码";left=17;top=203;right=71;bottom=225;transparent=1;z=18};
+static13={cls="static";text="管理密码";left=210;top=139;right=264;bottom=161;transparent=1;z=17};
+static2={cls="static";text="服务器";left=23;top=108;right=69;bottom=133;transparent=1;z=15};
+static3={cls="static";text="web端口";left=213;top=79;right=267;bottom=101;transparent=1;z=7};
+static4={cls="static";text="管理端口";left=210;top=109;right=264;bottom=131;transparent=1;z=5};
+static5={cls="static";text="服务端口";left=210;top=172;right=266;bottom=194;transparent=1;z=1};
+static7={cls="static";text="键名";left=30;top=271;right=61;bottom=293;transparent=1;z=16};
+static8={cls="static";text="个数";left=28;top=301;right=58;bottom=323;transparent=1;z=10};
+static9={cls="static";text="每项长度";left=208;top=299;right=266;bottom=321;transparent=1;z=12}
+)
+/*}}*/
+
+import process.mutex;
+mainForm.mutex = process.mutex(mainForm.text)
+if( mainForm.mutex.conflict ){
+ import win.ui.atom;
+ var atom,hwndConflict = win.ui.atom.find(mainForm.text)
+ if( hwndConflict ) win.setForeground(hwndConflict);
+ return;
+}
+
+mainForm.serviceName = "cmonitor.sas.service";
+mainForm.exeName = "cmonitor.sas.service.exe";
+import dotNet;
+dotNet.import("System");
+var defaultConfig = {
+ "Client": {
+ "Server": "127.0.0.1:1802",
+ "Name":string.slice(System.Net.Dns.GetHostName(),1,12),
+ "GroupId": "snltty",
+ "ShareMemoryKey": "cmonitor/share",
+ "ShareMemoryCount": 100,
+ "ShareMemorySize": 1024,
+ "ApiPort": 1803,
+ "ApiPassword": "snltty",
+ "WebPort": 1804
+ },
+ "Common": {
+ "Modes": {"client","server"}
+ },
+ "Server": {
+ "WebPort": 1800,
+ "ApiPort": 1801,
+ "ServicePort": 1802,
+ "ApiPassword": "snltty"
+ }
+};
+
+
+import win.image;
+hIcon = win.image.loadIconFromFile("/res/favicon.ico",true);
+hIcon1 = win.image.loadIconFromFile("/res/favicon1.ico",true);
+mainForm.myTray = null;
+mainForm.wndproc = function(hwnd,message,wParam,lParam){
+ //托盘菜单
+ if(message === 0xACCF ){
+ //右键
+ if( lParam === 0x205){
+
+ var pt = ::POINT();
+ ::User32.GetCursorPos(pt);
+ win.setForeground(mainForm.hwnd)
+ mainForm.popmenu.popup(pt.x,pt.y,true );
+
+ }
+ //左键
+ if(lParam === 0x0202){
+ mainForm.show();
+ }
+ }
+ //关闭
+ if(message === 0x10){
+ mainForm.show(false);
+ return 0;
+ }
+}
+mainForm.showPopmenu = function(){
+ import win.util.tray;
+ import win.ui.menu;
+ import service;
+
+ if(mainForm.myTray != null){
+ mainForm.myTray.delete();
+ mainForm.myTray = null;
+ }
+ tray = win.util.tray(mainForm);
+ mainForm.myTray = tray;
+ if(service.isRunning(mainForm.serviceName))
+ {
+ tray.icon = hIcon;
+ }else
+ {
+ tray.icon = hIcon1;
+ }
+ tray.tip = mainForm.text;
+ tray.message = 0xACCF;
+ mainForm.popmenu=win.ui.popmenu(mainForm);
+
+ mainForm.popmenu.add(service.isRunning(mainForm.serviceName) ? '停止服务':'运行服务',function(id){mainForm.installCommand()});
+ mainForm.popmenu.add(service.isExist(mainForm.serviceName) ? '卸载服务':'安装服务',function(id){mainForm.installCommand()});
+ mainForm.popmenu.add('退出托盘',function(id){
+ win.quitMessage();
+ mainForm.close();
+ });
+}
+
+
+mainForm.loadConfig = function(){
+ import web.json;
+ var configJson = defaultConfig;
+ try{
+
+ jsonText = string.load(io.fullpath("configs/config.json"));
+ if(jsonText == null || string.len(jsonText) == 0)
+ {
+ return;
+ }
+ configJson = web.json.parse(jsonText);
+ }
+ return configJson;
+}
+mainForm.saveConfig = function(){
+ import web.json;
+ import win.ui;
+ var result = false;
+ try{
+ mainForm.readConfigFromControll();
+ if(string.len(mainForm.editMachineName.text)>12)
+ {
+ win.msgbox("机器名最多12字符");
+ return;
+ }
+ if(string.len(mainForm.editApiClientPassword.text)>16)
+ {
+ win.msgbox("管理密码最多16字符");
+ return;
+ }
+ if(string.len(mainForm.editApiPassword.text)>16)
+ {
+ win.msgbox("管理密码最多16字符");
+ return;
+ }
+
+ path = io.fullpath("./configs/config.json");
+ string.save(path,web.json.stringify(mainForm.configJson,true));
+ result = true;
+
+ }catch(e){
+ result = false;
+ }
+ return result;
+}
+mainForm.bindConfig2Controll = function(){
+ mainForm.cbClient.checked = table.indexOf( mainForm.configJson["Common"]["Modes"],"client") >= 1;
+ mainForm.cbService.checked = table.indexOf( mainForm.configJson["Common"]["Modes"],"server") >= 1;
+
+ mainForm.editMachineName.text = mainForm.configJson["Client"]["Name"] || defaultConfig["Client"]["Name"];
+ mainForm.editServer.text = mainForm.configJson["Client"]["Server"] || defaultConfig["Client"]["Server"];
+ mainForm.editWebClientPort.text = mainForm.configJson["Client"]["WebPort"] || defaultConfig["Client"]["WebPort"];
+ mainForm.editApiClientPort.text = mainForm.configJson["Client"]["ApiPort"] || defaultConfig["Client"]["ApiPort"];
+ mainForm.editApiClientPassword.text = mainForm.configJson["Client"]["ApiPassword"] || defaultConfig["Client"]["ApiPassword"];
+
+ mainForm.editShareKey.text = mainForm.configJson["Client"]["ShareMemoryKey"] || defaultConfig["Client"]["ShareMemoryKey"];
+ mainForm.editShareLength.text = mainForm.configJson["Client"]["ShareMemoryCount"] || defaultConfig["Client"]["ShareMemoryCount"];
+ mainForm.editShareSize.text = mainForm.configJson["Client"]["ShareMemorySize"] || defaultConfig["Client"]["ShareMemorySize"];
+
+ mainForm.editWebPort.text = mainForm.configJson["Server"]["WebPort"] || defaultConfig["Server"]["WebPort"];
+ mainForm.editApiPort.text = mainForm.configJson["Server"]["ApiPort"] || defaultConfig["Server"]["ApiPort"];
+ mainForm.editServicePort.text = mainForm.configJson["Server"]["ServicePort"] || defaultConfig["Server"]["ServicePort"];
+ mainForm.editApiPassword.text = mainForm.configJson["Server"]["ApiPassword"] || defaultConfig["Server"]["ApiPassword"];
+}
+mainForm.readConfigFromControll = function(){
+ modes = {};
+ if(mainForm.cbClient.checked) table.push(modes,"client");
+ if(mainForm.cbService.checked) table.push(modes,"server");
+ mainForm.configJson["Common"]["Modes"] = modes;
+
+ mainForm.configJson["Client"]["Name"] = mainForm.editMachineName.text;
+ mainForm.configJson["Client"]["Server"] = mainForm.editServer.text;
+ mainForm.configJson["Client"]["WebPort"] = tonumber(mainForm.editWebClientPort.text);
+ mainForm.configJson["Client"]["ApiPort"] = tonumber(mainForm.editApiClientPort.text);
+ mainForm.configJson["Client"]["ApiPassword"] = mainForm.editApiClientPassword.text;
+
+ mainForm.configJson["Client"]["ShareMemoryKey"] = mainForm.editShareKey.text;
+ mainForm.configJson["Client"]["ShareMemoryCount"] = tonumber(mainForm.editShareLength.text);
+ mainForm.configJson["Client"]["ShareMemorySize"] = tonumber(mainForm.editShareSize.text);
+
+ mainForm.configJson["Server"]["WebPort"] = tonumber(mainForm.editWebPort.text);
+ mainForm.configJson["Server"]["ApiPort"] = tonumber(mainForm.editApiPort.text);
+ mainForm.configJson["Server"]["ServicePort"] = tonumber(mainForm.editServicePort.text);
+ mainForm.configJson["Server"]["ApiPassword"] = mainForm.editApiPassword.text;
+
+}
+
+mainForm.showPassword = function(){
+ ::SendMessageInt(mainForm.editApiClientPassword.hwnd, 0xCC/*_EM_SETPASSWORDCHAR*/, 0, 0);
+ ::SendMessageInt(mainForm.editApiPassword.hwnd, 0xCC/*_EM_SETPASSWORDCHAR*/, 0, 0);
+ mainForm.editApiClientPassword.setFocus()
+ mainForm.editApiPassword.setFocus()
+}
+mainForm.hidePassword = function(){
+ ::SendMessageInt(mainForm.editApiClientPassword.hwnd, 0xCC/*_EM_SETPASSWORDCHAR*/, '*'#, 0);
+ ::SendMessageInt(mainForm.editApiPassword.hwnd, 0xCC/*_EM_SETPASSWORDCHAR*/, '*'#, 0);
+ mainForm.editApiClientPassword.setFocus()
+ mainForm.editApiPassword.setFocus()
+}
+mainForm.btnHidePassword.oncommand = function(){
+ mainForm.hidePassword();
+}
+mainForm.btnShowPassword.oncommand = function(){
+ mainForm.showPassword();
+}
+
+
+mainForm.checkService = function(){
+ import service;
+ mainForm.btnInstall.text = service.isExist(mainForm.serviceName) ? "卸载" : "安装";
+ mainForm.btnRun.text = service.isRunning(mainForm.serviceName) ? "停止" : "运行";
+ mainForm.showPopmenu();
+}
+mainForm.btnCheck.oncommand = function(id,event){
+ mainForm.checkService();
+ win.msgbox('已检查');
+}
+mainForm.runCommand = function(id,event){
+ import thread;
+ thread.invoke(
+ function(mainForm){
+ import service;
+ import win.ui;
+ try{
+ mainForm.saveConfig();
+ mainForm.btnRun.text = '....';
+ if(service.isRunning(mainForm.serviceName)){
+ if(service.stop(mainForm.serviceName,true)){
+
+ }else{
+ win.msgbox("停止失败");
+ }
+ }else{
+ if(service.start(mainForm.serviceName)){
+ }else{
+ win.msgbox("运行失败");
+ }
+ }
+ mainForm.checkService();
+ }catch(e){
+ }
+ },mainForm
+ );
+}
+mainForm.btnRun.oncommand = function(){
+ mainForm.runCommand();
+}
+
+
+mainForm.installCommand = function(id,event){
+ import thread;
+ thread.invoke(
+ function(mainForm){
+ import service;
+ import win.ui;
+ try{
+ mainForm.saveConfig();
+ mainForm.btnInstall.text = '....';
+ if(service.isExist(mainForm.serviceName)){
+ if(service.delete(mainForm.serviceName)){
+
+ }else{
+ win.msgbox("卸载失败");
+ }
+ }else{
+ if(service.create(io.fullpath(mainForm.exeName),mainForm.serviceName,mainForm.serviceName,mainForm.serviceName)){
+ }else{
+ win.msgbox("安装失败");
+ }
+ }
+ mainForm.checkService();
+ }catch(e){
+ }
+ },mainForm
+ );
+}
+mainForm.btnInstall.oncommand = function(){
+ mainForm.installCommand();
+}
+
+mainForm.btnSaveConfig.oncommand = function(id,event){
+ if(mainForm.saveConfig()){
+ win.msgbox('已保存');
+ }else{
+ win.msgbox("保存失败~请先停止服务后重新尝试保存");
+ }
+}
+
+mainForm.configJson = mainForm.loadConfig();
+mainForm.bindConfig2Controll();
+mainForm.checkService();
+mainForm.saveConfig();
+mainForm.showPopmenu();
+
+mainForm.show();
+return win.loopMessage();
\ No newline at end of file
diff --git a/cmonitor.install.win/favicon.ico b/cmonitor.install.win/res/favicon.ico
similarity index 100%
rename from cmonitor.install.win/favicon.ico
rename to cmonitor.install.win/res/favicon.ico
diff --git a/cmonitor.install.win/res/favicon1.ico b/cmonitor.install.win/res/favicon1.ico
new file mode 100644
index 00000000..bb1e3c14
Binary files /dev/null and b/cmonitor.install.win/res/favicon1.ico differ
diff --git a/cmonitor.libs/IShareMemory.cs b/cmonitor.libs/IShareMemory.cs
index 94a9fc5a..8112ec44 100644
--- a/cmonitor.libs/IShareMemory.cs
+++ b/cmonitor.libs/IShareMemory.cs
@@ -17,6 +17,5 @@ namespace cmonitor.libs
public void ReadArray(int position, byte[] bytes, int offset, int length);
public void WriteArray(int position, byte[] data, int offset, int length);
- public void WritSpan(int position, Span span);
}
}
diff --git a/cmonitor.libs/ShareMemory.cs b/cmonitor.libs/ShareMemory.cs
index d15e2a4f..06f0a5d7 100644
--- a/cmonitor.libs/ShareMemory.cs
+++ b/cmonitor.libs/ShareMemory.cs
@@ -347,16 +347,10 @@ namespace cmonitor.libs
return Update(index, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(value), addAttri, removeAttri);
}
}
+
public bool Update(int index, byte[] key, byte[] value,
ShareMemoryAttribute addAttri = ShareMemoryAttribute.None,
ShareMemoryAttribute removeAttri = ShareMemoryAttribute.None)
- {
- return Update(index, key, value.AsSpan(), addAttri, removeAttri);
- }
-
- public bool Update(int index, byte[] key, Span value,
- ShareMemoryAttribute addAttri = ShareMemoryAttribute.None,
- ShareMemoryAttribute removeAttri = ShareMemoryAttribute.None)
{
try
{
@@ -401,12 +395,12 @@ namespace cmonitor.libs
if (accessorLocal != null)
{
accessorLocal.WriteInt(valIndex, vallen);
- accessorLocal.WritSpan(valIndex + 4, value);
+ accessorLocal.WriteArray(valIndex + 4, value,0,value.Length);
}
if (accessorGlobal != null)
{
accessorGlobal.WriteInt(valIndex, vallen);
- accessorGlobal.WritSpan(valIndex + 4, value);
+ accessorGlobal.WriteArray(valIndex + 4, value,0,value.Length);
}
IncrementVersion(index);
if (removeAttri > 0)
diff --git a/cmonitor.libs/ShareMemoryLinux.cs b/cmonitor.libs/ShareMemoryLinux.cs
index 5f6c1301..a57fe103 100644
--- a/cmonitor.libs/ShareMemoryLinux.cs
+++ b/cmonitor.libs/ShareMemoryLinux.cs
@@ -60,13 +60,6 @@ namespace cmonitor.libs
Marshal.Copy(bytes, offset, shmPtr + position, length);
}
}
- public unsafe void WritSpan(int position, Span span)
- {
- if (shmPtr != IntPtr.Zero)
- {
- span.CopyTo(new Span((void*)(shmPtr + position), span.Length));
- }
- }
public byte ReadByte(int position)
{
diff --git a/cmonitor.libs/ShareMemoryMacOS.cs b/cmonitor.libs/ShareMemoryMacOS.cs
index 430e3856..4db3dd19 100644
--- a/cmonitor.libs/ShareMemoryMacOS.cs
+++ b/cmonitor.libs/ShareMemoryMacOS.cs
@@ -60,13 +60,6 @@ namespace cmonitor.libs
Marshal.Copy(bytes, offset, shmPtr + position, length);
}
}
- public unsafe void WritSpan(int position, Span span)
- {
- if (shmPtr != IntPtr.Zero)
- {
- span.CopyTo(new Span((void*)(shmPtr + position), span.Length));
- }
- }
public byte ReadByte(int position)
{
diff --git a/cmonitor.libs/ShareMemoryWindows.cs b/cmonitor.libs/ShareMemoryWindows.cs
index 623bce8c..93c74cff 100644
--- a/cmonitor.libs/ShareMemoryWindows.cs
+++ b/cmonitor.libs/ShareMemoryWindows.cs
@@ -57,13 +57,6 @@ namespace cmonitor.libs
accessorLocal.WriteArray(position, data, offset, length);
}
}
- public void WritSpan(int position, Span span)
- {
- if (accessorLocal != null)
- {
- accessorLocal.SafeMemoryMappedViewHandle.WriteSpan((ulong)position, span);
- }
- }
public byte ReadByte(int position)
{
diff --git a/cmonitor.share.lib/Hook.cs b/cmonitor.share.lib/Hook.cs
new file mode 100644
index 00000000..b80a46de
--- /dev/null
+++ b/cmonitor.share.lib/Hook.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace cmonitor.share.lib
+{
+ public sealed class Hook
+ {
+ private delegate int HookProc(int nCode, int wParam, IntPtr lParam);
+ private static int hHook = 0;
+ private const int WH_KEYBOARD_LL = 13;
+ HookProc KeyBoardHookProcedure;
+ [StructLayout(LayoutKind.Sequential)]
+ private class KeyBoardHookStruct
+ {
+ public int vkCode;
+ public int scanCode;
+ public int flags;
+ public int time;
+ public int dwExtraInfo;
+ }
+ [DllImport("user32.dll")]
+ private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
+ [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
+ private static extern bool UnhookWindowsHookEx(int idHook);
+ [DllImport("user32.dll")]
+ private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
+ [DllImport("kernel32.dll")]
+ private static extern IntPtr GetModuleHandle(string name);
+
+ private Func hookAction;
+ public void Start(Func hookAction = null)
+ {
+ this.hookAction = hookAction;
+ // 安装键盘钩子
+ if (hHook != 0)
+ {
+ return;
+ }
+ KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
+ hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(null), 0);
+ //如果设置钩子失败.
+ if (hHook == 0)
+ {
+ Close();
+ return;
+ }
+
+
+ }
+ public void Close()
+ {
+ if (hHook != 0)
+ {
+ UnhookWindowsHookEx(hHook);
+ hHook = 0;
+ }
+ }
+
+ public int CurrentKeys { get; set; }
+ public DateTime LastDateTime { get; private set; } = DateTime.Now;
+ private int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
+ {
+ if (nCode >= 0)
+ {
+ KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
+ CurrentKeys = kbh.vkCode;
+ LastDateTime = DateTime.Now;
+
+ if (hookAction != null && hookAction.Invoke(nCode))
+ {
+ return 1;
+ }
+
+ }
+ return CallNextHookEx(hHook, nCode, wParam, lParam);
+ }
+
+ }
+}
diff --git a/cmonitor.share.lib/IShareMemory.cs b/cmonitor.share.lib/IShareMemory.cs
new file mode 100644
index 00000000..b31bbf69
--- /dev/null
+++ b/cmonitor.share.lib/IShareMemory.cs
@@ -0,0 +1,19 @@
+namespace cmonitor.share.lib
+{
+ //1 attr + 8 version + 4 klen + key + 4 vlen + val
+ public interface IShareMemory
+ {
+ bool Init();
+
+ byte ReadByte(int position);
+ void WriteByte(int position, byte value);
+ int ReadInt(int position);
+ void WriteInt(int position, int value);
+
+ long ReadInt64(int position);
+ void WriteInt64(int position, long value);
+
+ void ReadArray(int position, byte[] bytes, int offset, int length);
+ void WriteArray(int position, byte[] data, int offset, int length);
+ }
+}
diff --git a/cmonitor.share.lib/Properties/AssemblyInfo.cs b/cmonitor.share.lib/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..439230c7
--- /dev/null
+++ b/cmonitor.share.lib/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("cmonitor.share.lib")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("cmonitor.share.lib")]
+[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("9a3d0eb7-b775-4be8-a5af-c2bac9e5cfd0")]
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/cmonitor.share.lib/ShareMemory.cs b/cmonitor.share.lib/ShareMemory.cs
new file mode 100644
index 00000000..93ddca8c
--- /dev/null
+++ b/cmonitor.share.lib/ShareMemory.cs
@@ -0,0 +1,615 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace cmonitor.share.lib
+{
+ ///
+ /// InitLocal 和 InitGlobal 都可以初始化,都初始化时,需要启动 StartLoop,将InitGlobal同步数据到Local
+ /// AddAttributeAction 设置状态变化回调,需要启动 Loop,监听数据变化
+ ///
+ public sealed class ShareMemory
+ {
+ private const int shareMemoryAttributeIndex = 0;
+ private const int shareMemoryAttributeSize = 1;
+ private const int shareMemoryVersionSize = 8;
+ private const int shareMemoryVersionIndex = 1;
+ private const int shareMemoryHeadSize = shareMemoryAttributeSize + shareMemoryVersionSize;
+
+ private string key;
+ private int length;
+ private int itemSize;
+ private byte[] bytes;
+ private object lockObj = new object();
+ private long mainVersion = 0;
+ IShareMemory accessorLocal = null;
+ IShareMemory accessorGlobal = null;
+
+ private readonly ShareMemoryAttribute[] itemAttributes = Array.Empty();
+ private readonly long[] itemVersions = Array.Empty();
+ ConcurrentDictionary>> attributeActions = new ConcurrentDictionary>>();
+ private CancellationTokenSource cancellationTokenSource;
+ private ConcurrentQueue attributeChangeds = new ConcurrentQueue();
+
+ private readonly Dictionary dic = new Dictionary();
+
+ public ShareMemory(string key, int length, int itemSize)
+ {
+ this.key = key;
+ this.length = length;
+ this.itemSize = itemSize;
+ bytes = new byte[length * itemSize];
+ itemAttributes = new ShareMemoryAttribute[length];
+ itemVersions = new long[length];
+ }
+
+ public void InitLocal()
+ {
+ try
+ {
+ if (accessorLocal == null)
+ {
+ accessorLocal = ShareMemoryFactory.Create(key, length, itemSize);
+
+ if (accessorLocal.Init() == false)
+ {
+ accessorLocal = null;
+ }
+ }
+ }
+ catch (Exception)
+ {
+ }
+ }
+
+ private byte[] gloablBytes;
+ public void InitGlobal()
+ {
+ try
+ {
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && accessorGlobal == null)
+ {
+ gloablBytes = new byte[bytes.Length];
+ accessorGlobal = ShareMemoryFactory.Create($"Global\\{key}", length, itemSize);
+ if (accessorGlobal.Init() == false)
+ {
+ accessorGlobal = null;
+ }
+ }
+ }
+ catch (Exception)
+ {
+ }
+ }
+ public void AddAttributeAction(int index, Action action)
+ {
+ if (attributeActions.TryGetValue(index, out List> actions) == false)
+ {
+ actions = new List>();
+ attributeActions.TryAdd(index, actions);
+ }
+ if (actions.Any(c => c == action) == false)
+ {
+ actions.Add(action);
+ }
+ }
+ public void RemoveAttributeAction(int index, Action action)
+ {
+ if (attributeActions.TryGetValue(index, out List> actions) == false)
+ {
+ return;
+ }
+ actions.Remove(action);
+ }
+
+
+ public void StartLoop()
+ {
+ cancellationTokenSource?.Cancel();
+ cancellationTokenSource = new CancellationTokenSource();
+ Task.Factory.StartNew(async () =>
+ {
+ while (cancellationTokenSource.IsCancellationRequested == false)
+ {
+ try
+ {
+ SyncMemory();
+ AttributeCallback();
+ ReadItems();
+ }
+ catch (Exception)
+ {
+ }
+
+ await Task.Delay(10);
+ }
+
+ }, TaskCreationOptions.LongRunning);
+
+ Task.Factory.StartNew(async () =>
+ {
+ while (cancellationTokenSource.IsCancellationRequested == false)
+ {
+ try
+ {
+ while (attributeChangeds.TryDequeue(out ShareItemAttributeChanged result))
+ {
+ result.Action(result.Attribute);
+ }
+ }
+ catch (Exception)
+ {
+ }
+
+ await Task.Delay(30);
+ }
+
+ }, TaskCreationOptions.LongRunning);
+ }
+
+ private void AttributeCallback()
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return;
+
+ bool allUpdated = false;
+ for (int index = 0; index < length; index++)
+ {
+ ShareMemoryAttribute attribute = ReadAttribute(accessorLocal, index);
+ bool updated = ReadVersionUpdated(accessorLocal, index);
+ allUpdated |= updated;
+ if (updated)
+ {
+ itemAttributes[index] &= (~ShareMemoryAttribute.Updated);
+ attribute |= ShareMemoryAttribute.Updated;
+ }
+ if (attribute != itemAttributes[index])
+ {
+ itemAttributes[index] = attribute;
+ if (attributeActions.TryGetValue(index, out List> actions) && actions.Count > 0)
+ {
+ foreach (var action in actions)
+ {
+ attributeChangeds.Enqueue(new ShareItemAttributeChanged { Action = action, Attribute = attribute });
+ }
+ }
+ }
+
+ }
+ if (allUpdated)
+ {
+ mainVersion++;
+ }
+ }
+ private void SyncMemory()
+ {
+ if (accessorGlobal != null && accessorLocal != null)
+ {
+ lock (lockObj)
+ {
+ accessorGlobal.ReadArray(0, gloablBytes, 0, gloablBytes.Length);
+ accessorLocal.WriteArray(0, gloablBytes, 0, itemSize);
+ for (int index = 0; index < length; index++)
+ {
+ //检查更新状态
+ if (ReadVersionUpdated(accessorGlobal, index) == false)
+ {
+ continue;
+ }
+
+ int _index = index * itemSize;
+ int keyLen = BitConverter.ToInt32(gloablBytes, _index + shareMemoryHeadSize);
+ if (keyLen > 0)
+ {
+ accessorLocal.WriteArray(_index, gloablBytes, _index, itemSize);
+ }
+ }
+
+ }
+ }
+
+ }
+ private void ReadItems()
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return;
+ try
+ {
+ lock (lockObj)
+ {
+ accessor.ReadArray(0, bytes, 0, bytes.Length);
+
+ for (int index = 0; index < length; index++)
+ {
+ ShareMemoryAttribute attribute = ReadAttribute(accessor, index);
+ long itemVersion = ReadVersion(accessor, index);
+ bool skip = (itemVersion <= itemVersions[index] || (attribute & ShareMemoryAttribute.HiddenForList) == ShareMemoryAttribute.HiddenForList);
+ itemVersions[index] = itemVersion;
+ if (skip)
+ {
+ continue;
+ }
+
+ //key length
+ int _index = index * itemSize + shareMemoryHeadSize;
+ int keyLen = BitConverter.ToInt32(bytes, _index);
+ _index += 4;
+ if (keyLen > 0 && keyLen + 8 + shareMemoryHeadSize < itemSize)
+ {
+ //key
+ string key = Encoding.UTF8.GetString(bytes, _index, keyLen);
+ _index += keyLen;
+
+ //val length
+ string val = string.Empty;
+ int valLen = BitConverter.ToInt32(bytes, _index);
+ _index += 4;
+ //value
+ if (keyLen + 8 + shareMemoryHeadSize + valLen <= itemSize)
+ {
+ val = Encoding.UTF8.GetString(bytes, _index, valLen);
+ }
+
+ dic[key] = new ShareItemInfo
+ {
+ Index = index,
+ Value = val
+ };
+ }
+ }
+ }
+
+ }
+ catch (Exception)
+ {
+ }
+ }
+
+ public Dictionary ReadItems(out long version)
+ {
+ version = mainVersion;
+ return dic;
+ }
+ public string ReadValueString(int index)
+ {
+ byte[] bytes = ReadValueArray(index);
+ if (bytes.Length == 0) return string.Empty;
+
+ return Encoding.UTF8.GetString(bytes);
+ }
+ public long ReadValueInt64(int index)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null || index >= length) return 0;
+ index = index * itemSize + shareMemoryHeadSize;
+
+ int keylen = accessor.ReadInt(index);
+ index += 4 + keylen;
+ if (keylen == 0) return 0;
+
+ int vallen = accessor.ReadInt(index);
+ index += 4;
+ if (vallen == 0 || keylen + 8 + shareMemoryHeadSize + vallen > itemSize) return 0;
+
+ return accessor.ReadInt64(index);
+ }
+ public byte[] ReadValueArray(int index)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null || index >= length) return Array.Empty();
+ index = index * itemSize + shareMemoryHeadSize;
+
+ int keylen = accessor.ReadInt(index);
+ index += 4 + keylen;
+
+ int vallen = accessor.ReadInt(index);
+ index += 4;
+ if (vallen == 0 || keylen + 8 + shareMemoryHeadSize + vallen > itemSize) return Array.Empty();
+
+ byte[] bytes = new byte[vallen];
+ accessor.ReadArray(index, bytes, 0, bytes.Length);
+
+ return bytes;
+ }
+ public int ReadValueArray(int index, byte[] bytes)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null || index >= length) return 0;
+ index = index * itemSize + shareMemoryHeadSize;
+
+ int keylen = accessor.ReadInt(index);
+ index += 4 + keylen;
+
+ int vallen = accessor.ReadInt(index);
+ index += 4;
+ if (vallen == 0 || keylen + 8 + shareMemoryHeadSize + vallen > itemSize) return 0;
+
+ accessor.ReadArray(index, bytes, 0, bytes.Length);
+
+ return vallen;
+ }
+
+ public bool Update(int index, string key, string value,
+ ShareMemoryAttribute addAttri = ShareMemoryAttribute.None,
+ ShareMemoryAttribute removeAttri = ShareMemoryAttribute.None)
+ {
+ if (string.IsNullOrWhiteSpace(key))
+ {
+ return Update(index, Array.Empty(), Encoding.UTF8.GetBytes(value), addAttri, removeAttri);
+ }
+ else
+ {
+ return Update(index, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(value), addAttri, removeAttri);
+ }
+ }
+
+ public bool Update(int index, byte[] key, byte[] value,
+ ShareMemoryAttribute addAttri = ShareMemoryAttribute.None,
+ ShareMemoryAttribute removeAttri = ShareMemoryAttribute.None)
+ {
+ try
+ {
+ if (accessorLocal == null && accessorGlobal == null) return false;
+ if (index > length) return false;
+ if (key.Length + 8 + shareMemoryHeadSize + value.Length > itemSize) return false;
+
+ lock (lockObj)
+ {
+ int valIndex = index * itemSize + shareMemoryHeadSize;
+ int startIndex = valIndex;
+ int keylen = key.Length;
+ int vallen = value.Length;
+ if (key.Length > 0)
+ {
+ if (accessorLocal != null)
+ {
+ accessorLocal.WriteInt(valIndex, keylen);
+ accessorLocal.WriteArray(valIndex + 4, key, 0, key.Length);
+ }
+ if (accessorGlobal != null)
+ {
+ accessorGlobal.WriteInt(valIndex, keylen);
+ accessorGlobal.WriteArray(valIndex + 4, key, 0, key.Length);
+ }
+ valIndex += 4 + key.Length;
+ }
+ else
+ {
+ int keyLen = 0;
+ if (accessorLocal != null)
+ {
+ keyLen = accessorLocal.ReadInt(valIndex);
+ }
+ if (keyLen == 0 && accessorGlobal != null)
+ {
+ keyLen = accessorGlobal.ReadInt(valIndex);
+ }
+ valIndex += 4 + keyLen;
+ }
+
+ if (accessorLocal != null)
+ {
+ accessorLocal.WriteInt(valIndex, vallen);
+ accessorLocal.WriteArray(valIndex + 4, value, 0, value.Length);
+ }
+ if (accessorGlobal != null)
+ {
+ accessorGlobal.WriteInt(valIndex, vallen);
+ accessorGlobal.WriteArray(valIndex + 4, value, 0, value.Length);
+ }
+ IncrementVersion(index);
+ if (removeAttri > 0)
+ {
+ RemoveAttribute(index, removeAttri);
+ }
+ if (addAttri > 0)
+ {
+ AddAttribute(index, addAttri);
+ }
+ }
+
+ return true;
+ }
+ catch (Exception)
+ {
+ }
+ return false;
+ }
+
+ private ShareMemoryAttribute ReadAttribute(IShareMemory accessor, int index)
+ {
+ if (accessor == null || index >= length) return ShareMemoryAttribute.None;
+
+ ShareMemoryAttribute stateByte = (ShareMemoryAttribute)accessor.ReadByte(index * itemSize + shareMemoryAttributeIndex);
+ return stateByte;
+ }
+ private bool ReadAttributeEqual(IShareMemory accessor, int index, ShareMemoryAttribute attribute)
+ {
+ if (accessor == null || index >= length) return false;
+
+ ShareMemoryAttribute attributeByte = (ShareMemoryAttribute)accessor.ReadByte(index * itemSize + shareMemoryAttributeIndex);
+ return (attributeByte & attribute) == attribute;
+ }
+
+ private void AddAttribute(IShareMemory accessor, int index, ShareMemoryAttribute attribute)
+ {
+ if (accessor == null || index >= length) return;
+ byte attributeValue = accessor.ReadByte(index * itemSize + shareMemoryAttributeIndex);
+ byte attributeByte = (byte)attribute;
+ attributeValue |= attributeByte;
+ accessor.WriteByte(index * itemSize + shareMemoryAttributeIndex, attributeValue);
+
+ IncrementVersion(accessor, index);
+ }
+ private void RemoveAttribute(IShareMemory accessor, int index, ShareMemoryAttribute attribute)
+ {
+ if (accessor == null || index >= length) return;
+ byte attributeValue = accessor.ReadByte(index * itemSize + shareMemoryAttributeIndex);
+ byte attributeByte = (byte)attribute;
+ attributeValue &= (byte)(~attributeByte);
+ accessor.WriteByte(index * itemSize + shareMemoryAttributeIndex, attributeValue);
+
+ IncrementVersion(accessor, index);
+ }
+
+ private DateTime startTime = new DateTime(1970, 1, 1);
+ private void IncrementVersion(IShareMemory accessor, int index)
+ {
+ if (accessor == null || index >= length) return;
+
+ long version = (long)(DateTime.UtcNow.Subtract(startTime)).TotalMilliseconds;
+ accessor.WriteInt64(index * itemSize + shareMemoryVersionIndex, version);
+ }
+ private long ReadVersion(IShareMemory accessor, int index)
+ {
+ if (accessor == null || index >= length) return 0;
+ long version = accessor.ReadInt64(index * itemSize + shareMemoryVersionIndex);
+ return version;
+ }
+ private bool ReadVersionUpdated(IShareMemory accessor, int index)
+ {
+ long version = ReadVersion(accessor, index);
+ return version > itemVersions[index];
+ }
+ private bool ReadVersionUpdated(IShareMemory accessor, int index, ref long version)
+ {
+ long _version = ReadVersion(accessor, index);
+ bool res = _version > version;
+ version = _version;
+ return res;
+ }
+
+ public ShareMemoryAttribute ReadAttribute(int index)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return ShareMemoryAttribute.None;
+
+ return ReadAttribute(accessor, index);
+ }
+ public bool ReadAttributeEqual(int index, ShareMemoryAttribute attribute)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return false;
+
+ return ReadAttributeEqual(accessor, index, attribute);
+ }
+
+ public void AddAttribute(int index, ShareMemoryAttribute attribute)
+ {
+ AddAttribute(accessorLocal, index, attribute);
+ AddAttribute(accessorGlobal, index, attribute);
+ }
+ public void RemoveAttribute(int index, ShareMemoryAttribute attribute)
+ {
+ RemoveAttribute(accessorLocal, index, attribute);
+ RemoveAttribute(accessorGlobal, index, attribute);
+ }
+
+ public void IncrementVersion(int index)
+ {
+ IncrementVersion(accessorLocal, index);
+ IncrementVersion(accessorGlobal, index);
+ }
+ public long ReadVersion(int index)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return 0;
+
+ return ReadVersion(accessor, index);
+ }
+ public bool ReadVersionUpdated(int index)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return false;
+
+ return ReadVersionUpdated(accessor, index);
+ }
+ public bool ReadVersionUpdated(int index, ref long version)
+ {
+ IShareMemory accessor = accessorLocal ?? accessorGlobal;
+ if (accessor == null) return false;
+
+ return ReadVersionUpdated(accessor, index, ref version);
+ }
+
+ public void ListenClose(int shareIndex)
+ {
+ Task.Run(async () =>
+ {
+ while (true)
+ {
+ if (ReadAttributeEqual(shareIndex, ShareMemoryAttribute.Closed))
+ {
+ RemoveAttribute(shareIndex, ShareMemoryAttribute.Running);
+ RemoveAttribute(shareIndex, ShareMemoryAttribute.Running);
+ Environment.Exit(0);
+ Process.GetCurrentProcess().Kill();
+ }
+ await Task.Delay(30);
+ }
+ });
+ }
+ }
+
+ public enum ShareMemoryAttribute : byte
+ {
+ None = 0,
+ Updated = 0b0000_0001,
+ Closed = 0b0000_0010,
+ Running = 0b0000_0100,
+ HiddenForList = 0b0000_1000,
+ Error = 0b0001_0000,
+ All = 0b1111_1111
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ public struct ShareItem
+ {
+ public byte Attr;
+
+ public ulong Version;
+
+ public ulong Time;
+
+ public byte KeyLength;
+
+ ///
+ /// 255长度
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
+ public byte[] Key;
+
+ public byte ValLength;
+
+ ///
+ /// 9966长度
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9966)]
+ public byte[] Value;
+ }
+
+ public sealed class ShareItemAttributeChanged
+ {
+ public Action Action { get; set; }
+ public ShareMemoryAttribute Attribute { get; set; }
+ }
+
+ public sealed partial class ShareItemInfo
+ {
+ ///
+ /// 内存下标
+ ///
+ public int Index { get; set; }
+ ///
+ /// 内存值
+ ///
+ public string Value { get; set; }
+
+ }
+}
diff --git a/cmonitor.share.lib/ShareMemoryFactory.cs b/cmonitor.share.lib/ShareMemoryFactory.cs
new file mode 100644
index 00000000..ca72edfc
--- /dev/null
+++ b/cmonitor.share.lib/ShareMemoryFactory.cs
@@ -0,0 +1,17 @@
+using System.Runtime.InteropServices;
+
+namespace cmonitor.share.lib
+{
+ public static class ShareMemoryFactory
+ {
+ public static IShareMemory Create(string key, int length, int itemSize)
+ {
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return new ShareMemoryWindows(key, length, itemSize);
+ }
+
+ return new ShareMemoryWindows(key, length, itemSize);
+ }
+ }
+}
diff --git a/cmonitor.share.lib/ShareMemoryWindows.cs b/cmonitor.share.lib/ShareMemoryWindows.cs
new file mode 100644
index 00000000..6ffa88dd
--- /dev/null
+++ b/cmonitor.share.lib/ShareMemoryWindows.cs
@@ -0,0 +1,113 @@
+using System;
+using System.IO;
+using System.IO.MemoryMappedFiles;
+using System.Runtime.InteropServices;
+
+namespace cmonitor.share.lib
+{
+ public sealed class ShareMemoryWindows : IShareMemory
+ {
+ private string key;
+ private int length;
+ private int itemSize;
+ MemoryMappedFile mmfLocal = null;
+ MemoryMappedViewAccessor accessorLocal = null;
+
+ public ShareMemoryWindows(string key, int length, int itemSize)
+ {
+ this.key = key;
+ this.length = length;
+ this.itemSize = itemSize;
+ }
+
+ public bool Init()
+ {
+ try
+ {
+ if (accessorLocal == null && RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ mmfLocal = MemoryMappedFile.CreateOrOpen($"{key}", length * itemSize, MemoryMappedFileAccess.ReadWriteExecute, MemoryMappedFileOptions.None, HandleInheritability.None);
+
+ SetSecurityInfoByHandle(mmfLocal.SafeMemoryMappedFileHandle, 1, 4, null, null, null, null);
+
+ accessorLocal = mmfLocal.CreateViewAccessor();
+ return true;
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ return false;
+ }
+
+ [DllImport("advapi32.dll", EntryPoint = "SetSecurityInfo", CallingConvention = CallingConvention.Winapi, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Unicode)]
+ static extern uint SetSecurityInfoByHandle(SafeHandle handle, uint objectType, uint securityInformation, byte[] owner, byte[] group, byte[] dacl, byte[] sacl);
+
+ public void ReadArray(int position, byte[] bytes, int offset, int length)
+ {
+ if (accessorLocal != null)
+ {
+ accessorLocal.ReadArray(position, bytes, offset, bytes.Length);
+ }
+ }
+ public void WriteArray(int position, byte[] data, int offset, int length)
+ {
+ if (accessorLocal != null)
+ {
+ accessorLocal.WriteArray(position, data, offset, length);
+ }
+ }
+
+ public byte ReadByte(int position)
+ {
+ if (accessorLocal != null)
+ {
+ return accessorLocal.ReadByte(position);
+ }
+ return 0;
+ }
+ public void WriteByte(int position, byte value)
+ {
+ if (accessorLocal != null)
+ {
+ accessorLocal.Write(position, value);
+ }
+ }
+
+ public int ReadInt(int position)
+ {
+ if (accessorLocal != null)
+ {
+ return accessorLocal.ReadInt32(position);
+ }
+ return 0;
+ }
+ public void WriteInt(int position, int value)
+ {
+ if (accessorLocal != null)
+ {
+ accessorLocal.Write(position, value);
+ }
+ }
+
+ public long ReadInt64(int position)
+ {
+ if (accessorLocal != null)
+ {
+ return accessorLocal.ReadInt64(position);
+ }
+ return 0;
+ }
+ public void WriteInt64(int position, long value)
+ {
+ if (accessorLocal != null)
+ {
+ accessorLocal.Write(position, value);
+ }
+ }
+
+
+ }
+
+}
diff --git a/cmonitor.share.lib/cmonitor.share.lib.csproj b/cmonitor.share.lib/cmonitor.share.lib.csproj
new file mode 100644
index 00000000..bd3761cd
--- /dev/null
+++ b/cmonitor.share.lib/cmonitor.share.lib.csproj
@@ -0,0 +1,52 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}
+ Library
+ Properties
+ cmonitor.share.lib
+ cmonitor.share.lib
+ v4.8
+ 512
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cmonitor.sln b/cmonitor.sln
index 2df8197d..24f9ad5f 100644
--- a/cmonitor.sln
+++ b/cmonitor.sln
@@ -11,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.sas.service", "cmo
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.libs", "cmonitor.libs\cmonitor.libs.csproj", "{9080618D-367F-474E-AACA-A3C2F294448F}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.install.win", "cmonitor.install.win\cmonitor.install.win.csproj", "{4EB9FFB0-B05C-4C4E-BD44-796715E47585}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.install.win1", "cmonitor.install.win1\cmonitor.install.win1.csproj", "{4EB9FFB0-B05C-4C4E-BD44-796715E47585}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.llock.win", "cmonitor.llock.win\cmonitor.llock.win.csproj", "{6F2602B3-221D-475D-B643-D54987605644}"
EndProject
@@ -29,6 +29,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cmonitor.killer", "cmonitor
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cmonitor.tests", "cmonitor.tests\cmonitor.tests.csproj", "{04AA3054-5350-4D8B-97F6-31495AE0609D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cmonitor.share.lib", "cmonitor.share.lib\cmonitor.share.lib.csproj", "{9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -195,6 +197,18 @@ Global
{04AA3054-5350-4D8B-97F6-31495AE0609D}.Release|x64.Build.0 = Release|Any CPU
{04AA3054-5350-4D8B-97F6-31495AE0609D}.Release|x86.ActiveCfg = Release|Any CPU
{04AA3054-5350-4D8B-97F6-31495AE0609D}.Release|x86.Build.0 = Release|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Debug|x64.Build.0 = Debug|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Debug|x86.Build.0 = Debug|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Release|x64.ActiveCfg = Release|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Release|x64.Build.0 = Release|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Release|x86.ActiveCfg = Release|Any CPU
+ {9A3D0EB7-B775-4BE8-A5AF-C2BAC9E5CFD0}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/cmonitor.viewer.client.win/default.aproj b/cmonitor.viewer.client.win/default.aproj
index e9e64aa6..4b801ec0 100644
--- a/cmonitor.viewer.client.win/default.aproj
+++ b/cmonitor.viewer.client.win/default.aproj
@@ -1,6 +1,6 @@
-
+
-
+
diff --git a/cmonitor.viewer.client.win/dist/cmonitor.viewer.client.win.exe b/cmonitor.viewer.client.win/dist/cmonitor.viewer.client.win.exe
index 7d6b7376..433b8d2c 100644
Binary files a/cmonitor.viewer.client.win/dist/cmonitor.viewer.client.win.exe and b/cmonitor.viewer.client.win/dist/cmonitor.viewer.client.win.exe differ
diff --git a/cmonitor.viewer.server.win/MainForm.cs b/cmonitor.viewer.server.win/MainForm.cs
index e7f672b9..79092888 100644
--- a/cmonitor.viewer.server.win/MainForm.cs
+++ b/cmonitor.viewer.server.win/MainForm.cs
@@ -46,7 +46,7 @@ namespace cmonitor.viewer.server.win
this.ShowInTaskbar = false;
this.WindowState = FormWindowState.Minimized;
this.Visible = false;
- FireWallHelper.Write(Path.GetFileNameWithoutExtension(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName));
+ FireWallHelper.Write(Path.GetFileNameWithoutExtension(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName),"./plugins/viewer/");
#endif
CheckRunning();
diff --git a/cmonitor.web.client/src/components/Head.vue b/cmonitor.web.client/src/components/Head.vue
index a555dd19..10248e64 100644
--- a/cmonitor.web.client/src/components/Head.vue
+++ b/cmonitor.web.client/src/components/Head.vue
@@ -36,7 +36,7 @@