From 3a2ee532c7bed6b8ad3ac253b351106379137ef8 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 17 May 2020 16:48:04 +0100 Subject: [PATCH] Changed: correct blank product names from shortcut --- MainForm.Designer.cs | 86 ++++++- MainForm.cs | 335 ++++++++++++++++++++----- MainForm.resx | 3 + Resources/app_icon_24.png | Bin 512 -> 1344 bytes Resources/raw/app_icon_24.png | Bin 0 -> 512 bytes Windows/Forms/AForm.cs | 5 +- Windows/Forms/Tile/AddListTileForm.cs | 6 + Windows/Forms/Tile/EditListTileForm.cs | 5 + Windows/Forms/Tile/TTilePanelLayout.cs | 5 + 9 files changed, 369 insertions(+), 76 deletions(-) create mode 100644 Resources/raw/app_icon_24.png diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index a55f6b7..ca2e933 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -32,6 +32,12 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); @@ -39,6 +45,7 @@ this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.imageBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).BeginInit(); @@ -49,19 +56,19 @@ // this.imageBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.imageBox3.Image = ((System.Drawing.Image)(resources.GetObject("imageBox3.Image"))); - this.imageBox3.Location = new System.Drawing.Point(384, 18); + this.imageBox3.Location = new System.Drawing.Point(-71, 18); // // imageBox2 // this.imageBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.imageBox2.Image = ((System.Drawing.Image)(resources.GetObject("imageBox2.Image"))); - this.imageBox2.Location = new System.Drawing.Point(356, 18); + this.imageBox2.Location = new System.Drawing.Point(-99, 18); // // imageBox1 // this.imageBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.imageBox1.Image = ((System.Drawing.Image)(resources.GetObject("imageBox1.Image"))); - this.imageBox1.Location = new System.Drawing.Point(328, 18); + this.imageBox1.Location = new System.Drawing.Point(-127, 18); // // contextMenuStrip1 // @@ -71,22 +78,66 @@ this.toolStripSeparator1, this.exitToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(181, 98); + this.contextMenuStrip1.Size = new System.Drawing.Size(100, 76); this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); // // toolStripMenuItem4 // this.toolStripMenuItem4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem5, + this.toolStripMenuItem7, + this.toolStripSeparator2, + this.toolStripMenuItem8, + this.toolStripSeparator3, + this.toolStripMenuItem6, this.toolStripMenuItem2}); this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem4.Size = new System.Drawing.Size(99, 22); this.toolStripMenuItem4.Text = "&File"; // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(123, 22); + this.toolStripMenuItem5.Text = "&New"; + this.toolStripMenuItem5.Click += new System.EventHandler(this.toolStripMenuItem5_Click); + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(123, 22); + this.toolStripMenuItem7.Text = "&Open"; + this.toolStripMenuItem7.Click += new System.EventHandler(this.toolStripMenuItem7_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(120, 6); + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + this.toolStripMenuItem8.Size = new System.Drawing.Size(123, 22); + this.toolStripMenuItem8.Text = "&Close"; + this.toolStripMenuItem8.Click += new System.EventHandler(this.toolStripMenuItem8_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(120, 6); + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(123, 22); + this.toolStripMenuItem6.Text = "&Save"; + this.toolStripMenuItem6.Click += new System.EventHandler(this.toolStripMenuItem6_Click); + // // toolStripMenuItem2 // this.toolStripMenuItem2.Name = "toolStripMenuItem2"; this.toolStripMenuItem2.Size = new System.Drawing.Size(123, 22); - this.toolStripMenuItem2.Text = "&Save As..."; + this.toolStripMenuItem2.Text = "Save &As..."; this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click); // // toolStripMenuItem3 @@ -94,7 +145,7 @@ this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem1}); this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem3.Size = new System.Drawing.Size(99, 22); this.toolStripMenuItem3.Text = "&View"; // // toolStripMenuItem1 @@ -107,12 +158,12 @@ // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(96, 6); // // exitToolStripMenuItem // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; - this.exitToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.exitToolStripMenuItem.Size = new System.Drawing.Size(99, 22); this.exitToolStripMenuItem.Text = "E&xit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // @@ -127,7 +178,7 @@ this.flowLayoutPanel1.Location = new System.Drawing.Point(12, 58); this.flowLayoutPanel1.Name = "flowLayoutPanel1"; this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(0, 0, 10, 0); - this.flowLayoutPanel1.Size = new System.Drawing.Size(1075, 341); + this.flowLayoutPanel1.Size = new System.Drawing.Size(620, 341); this.flowLayoutPanel1.TabIndex = 27; this.flowLayoutPanel1.WrapContents = false; // @@ -136,13 +187,19 @@ this.saveFileDialog1.Filter = "Session files|*.jsonfig"; this.saveFileDialog1.Title = "Choose file to save the session"; // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + this.openFileDialog1.Filter = "Session files|*.jsonfig"; + this.openFileDialog1.Title = "Choose session file"; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(254)))), ((int)(((byte)(254)))), ((int)(((byte)(254))))); this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; - this.ClientSize = new System.Drawing.Size(1088, 400); + this.ClientSize = new System.Drawing.Size(633, 400); this.Controls.Add(this.flowLayoutPanel1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "MainForm"; @@ -170,6 +227,13 @@ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; } } diff --git a/MainForm.cs b/MainForm.cs index 16bab41..55745c2 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -15,7 +15,8 @@ namespace AppLauncher { protected int collapsedWidth = 40; protected int expandedWidth = 800; - protected bool isBusy = false; + + protected string sessionFilename = null; public MainForm() : base() { @@ -24,13 +25,6 @@ namespace AppLauncher //this.Visible = false; } - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - //this.Visible = false; - } - protected override void OnShown(EventArgs e) { this.Visible = false; @@ -40,7 +34,7 @@ namespace AppLauncher string jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig"); if (File.Exists(jsonfigFilename)) { - loadSession(jsonfigFilename); + loadFile(jsonfigFilename); } this.Location = this.DefaultLocation; @@ -63,61 +57,159 @@ namespace AppLauncher } } + /// + /// New + /// + /// + /// + private void toolStripMenuItem5_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(sessionFilename)) + { + newSession(); + } + else + { + DialogResult dr = MessageBox.Show("Save existing session?", "New session", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (dr == DialogResult.Yes) + { + bool rv = saveFile(sessionFilename, false); + if (rv) + { + newSession(); + + sessionFilename = null; + } + } + else if (dr == DialogResult.No) + { + newSession(); + + sessionFilename = null; + } + else if (dr == DialogResult.Cancel) + { + return; + } + } + } + + /// + /// Open + /// + /// + /// + private void toolStripMenuItem7_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(sessionFilename)) + { + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + loadFile(openFileDialog1.FileName); + } + } + else + { + DialogResult dr = MessageBox.Show("Save existing session?", "Open session", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (dr == DialogResult.Yes) + { + bool rv = saveFile(sessionFilename, false); + if (rv) + { + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + loadFile(openFileDialog1.FileName); + } + } + } + else if (dr == DialogResult.No) + { + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + loadFile(openFileDialog1.FileName); + } + } + else if (dr == DialogResult.Cancel) + { + return; + } + } + } + + /// + /// Close + /// + /// + /// + private void toolStripMenuItem8_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(sessionFilename)) + { + flowLayoutPanel1.Controls.Clear(); + } + else + { + DialogResult dr = MessageBox.Show("Save existing session?", "Close session", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (dr == DialogResult.Yes) + { + bool rv = saveFile(sessionFilename, false); + if (rv) + { + flowLayoutPanel1.Controls.Clear(); + + sessionFilename = null; + } + } + else if (dr == DialogResult.No) + { + flowLayoutPanel1.Controls.Clear(); + + sessionFilename = null; + } + else if (dr == DialogResult.Cancel) + { + return; + } + } + } + + /// + /// Save + /// + /// + /// + private void toolStripMenuItem6_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(sessionFilename)) + { + saveAsFile(); + } + else + { + saveFile(sessionFilename, true); + } + } + /// /// Save As /// /// /// - private void toolStripMenuItem2_Click(object sender, EventArgs e) - { - if (isBusy) - { - return; - } - - if (flowLayoutPanel1.Controls.Count <= 0) - { - return; - } - - if (saveFileDialog1.ShowDialog() != DialogResult.OK) - { - return; - } - - isBusy = true; - - List rs = new List(); - for (int i = 0; i < flowLayoutPanel1.Controls.Count; i++) - { - if (flowLayoutPanel1.Controls[i].GetType() != typeof(TTilePanelLayout)) - { - continue; - } - - TTilePanelLayout container = flowLayoutPanel1.Controls[i] as TTilePanelLayout; - rs.Add(container.Model); - } - - try - { - File.WriteAllText(saveFileDialog1.FileName, JsonConvert.SerializeObject(rs)); - MessageBox.Show("Session saved!", "Save session", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - catch (Exception exc) - { - MessageBox.Show(exc.Message, "Save session"); - } - - isBusy = false; - } + private void toolStripMenuItem2_Click(object sender, EventArgs e) => saveAsFile(); + /// + /// Always On Top + /// + /// + /// private void toolStripMenuItem1_Click(object sender, EventArgs e) => this.TopMost = !this.TopMost; - private void exitToolStripMenuItem_Click(object sender, EventArgs e) - { - this.Close(); - } + /// + /// Exit + /// + /// + /// + private void exitToolStripMenuItem_Click(object sender, EventArgs e) => this.Close(); protected async Task collapseWindow(int width, int increment = 6) { @@ -149,9 +241,37 @@ namespace AppLauncher }); } - protected void loadSession(string filename) + protected void loadFile(string filename) { - string sourceCode = File.ReadAllText(filename); + if (isBusy) + { + return; + } + + if (string.IsNullOrWhiteSpace(filename)) + { + return; + } + + if (!File.Exists(filename)) + { + return; + } + + string sourceCode = null; + + try + { + sessionFilename = filename; + + sourceCode = File.ReadAllText(sessionFilename); + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, "Load session"); + return; + } + if (string.IsNullOrWhiteSpace(sourceCode)) { return; @@ -174,18 +294,105 @@ namespace AppLauncher flowLayoutPanel1.Controls.Add(panel); } - //flowLayoutPanel1.Width = maxWidth + SystemInformation.VerticalScrollBarWidth + 20; - //flowLayoutPanel1.Width = maxWidth + SystemInformation.VerticalScrollBarWidth + 20; - - //this.Width = flowLayoutPanel1.Width + (flowLayoutPanel1.Left * 2); - //this.Width = flowLayoutPanel1.Width + flowLayoutPanel1.Left; this.Width = maxWidth + SystemInformation.VerticalScrollBarWidth + 20 + flowLayoutPanel1.Left; } + protected void newSession() + { + int maxWidth = 0; + flowLayoutPanel1.Controls.Clear(); + + TTilePanelLayout panel = new TTilePanelLayout(new TileGroupModel() + { + Title = "New Group", + IsExpanded = true, + GridSize = new Size(8, 1) + }); + + maxWidth = Math.Max(maxWidth, panel.Width); + + flowLayoutPanel1.Controls.Add(panel); + + this.Width = maxWidth + SystemInformation.VerticalScrollBarWidth + 20 + flowLayoutPanel1.Left; + } + + protected bool saveFile(string filename, bool showNotices = true) + { + if (isBusy) + { + return false; + } + + if (string.IsNullOrWhiteSpace(filename)) + { + return false; + } + + if (flowLayoutPanel1.Controls.Count <= 0) + { + return true; + } + + isBusy = true; + + List rs = new List(); + for (int i = 0; i < flowLayoutPanel1.Controls.Count; i++) + { + if (flowLayoutPanel1.Controls[i].GetType() != typeof(TTilePanelLayout)) + { + continue; + } + + TTilePanelLayout container = flowLayoutPanel1.Controls[i] as TTilePanelLayout; + rs.Add(container.Model); + } + + try + { + File.WriteAllText(filename, JsonConvert.SerializeObject(rs)); + + if (showNotices) + { + MessageBox.Show("Session saved!", "Save session", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception exc) + { + MessageBox.Show(exc.Message, "Save session"); + + return false; + } + + isBusy = false; + + return true; + } + + protected bool saveAsFile() + { + if (isBusy) + { + return false; + } + + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + bool rv = saveFile(saveFileDialog1.FileName); + if (rv) + { + sessionFilename = saveFileDialog1.FileName; + } + + return rv; + } + + return false; + } + private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) { toolStripMenuItem1.Checked = this.TopMost; - + toolStripMenuItem6.Enabled = !string.IsNullOrWhiteSpace(sessionFilename); } } diff --git a/MainForm.resx b/MainForm.resx index 4b6ba9e..98f90b3 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -153,6 +153,9 @@ 172, 17 + + 308, 17 + AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA diff --git a/Resources/app_icon_24.png b/Resources/app_icon_24.png index 2d9b51f9f10071df16f16bb1e6c047a8f7ccd4df..ad67f186232163c4a2d7e16a43bde59383176977 100644 GIT binary patch delta 1267 zcmVhnvgVVDmKB2TC1jMqErj%9}yv-#7bLJnGznS1+V<*|VR^(6CS=A7^Q?)m1-y+imP@$UAI=15$Z2!DpR0j%Ic9K4*Lojnk!EBoa}Q;35tH1(^a=f1{uLp!P8!aO~2>?9Tv*X$e@ZRta)of{P5K~Cpzj*Tc0tu%+t$F2{yB0e^H+T;MR zX4R`WxIc{)MUK^!8Gl;0?=gFHux8C6*%aJm-?;uYLx1YlBnX#^me=1KM`S#bju~^S zpx)l)nb7$`m)wcRjm%ZbqoNABLM&+ z!b3d-EON3N0&te!>TwieH3H}czn1z ze}IinU6ZW^gM&j7fo{p1yH*egmWa_8%mt7aw$P((0+3`dK<$!I-;(H&o9V3}CS>&f zVO;|NK+^av8JsOQ7<5|jygAZvfhq)c-ET&uw;l%OZoQ^|2t>f*1}9328WA+d3jpA9 za(}e74&dvv%OOeb+J}!CAW5vHF#ohomSncl60wjGjoFDed|Mc{Z6L^{E>9wPyqgy7hvSEQu zt!*6x2Qp8oEv@Yy#Si)hQDJwW!tTI;#(zhiJDnPAPx@ec(ucNIhXFOq1DPiSGxqI~%;r$|DH68cZSnvI=p=Z1D`;l~;cGRgSoE^Y*k!olY0ZE35JCcLk_#w1IP8Hk=zbI;p99XAX+NA^;n< zZBE2HiR&gLwcGnpUR8~X%4*!XSHqny7h{asIoGa|#6K-Qf9~mo0)YG26uO|ZfcWsO zH&)~Q9myafv_I=aMb%#@ue`_a*K9l@&IK`v*)-0tK@&eP)%0_5@ge6}uE`F4O5T=s z1cZ#pMP_t$_iF9WIwSysNvx7{UP6LOi}TM^PiEhge-)cj($W~wQ2=G&_+Deq(vk}~ dtyAHK<6k8j*7(+d%vJyZ002ovPDHLkV1fdjT=W0{ delta 429 zcmV;e0aE_J3V;NVU4H?MNkl4 zsnj`BEw!DU3<*}1SBM|NFN1tK5Mu(^Sn8CjXW{;rbI*VIxjMh*i{c)ba~d_~YjwN) z1~AWx&xkKTI8j#xKr%t%N$8@pzBof1APE6Au~%}i8BpYfVSk3CLrwxCc*MHtmsq

F}t_WQ3sdA=xK1GBOA4BKj?Ce2DL=K#UvNB$-LZ!n4WCtJHb$%{9Af=#S` za{mryNnZRM*6gDFaE3tLJQd5t$9r+zj|CAX8gko~>QLy)@b0*9BWQ8muEe#>$L^Sq zLGb&u?n{8uMSuC}+#_1AmUjS2Uc5i|h(hBl&M>Y30OUp6*3s&*+H|UyOoMz<+ z#nG{06hvuOUJfdnE3@6e4OjX8nj3}fXR#VLMIO0MTPCw}0IZLS9#8`ho%O?0ZVKx^ Xx3G%oW@UAp00000NkvXXu0mjf8-34a diff --git a/Resources/raw/app_icon_24.png b/Resources/raw/app_icon_24.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9b51f9f10071df16f16bb1e6c047a8f7ccd4df GIT binary patch literal 512 zcmV+b0{{JqP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10gXvS zK~zYI?Uk`^n_v`$zk_%grb_M53BN*AVLD*us1i(FTdAqkIa4jQot+E`R+U$XAHpw# zd^!+g0@zsUl&WXp{+DylfBCsOzvheL9+-0)HRfw|yZi<)&x+58FF-g^R|P;aLE=g1 zqO-m@LmVIp0X4B#auBY4ER>6ci$7?cAF4?4l-{`UK?K6$<b` z#K(Ja-H!zkCK__vmg-RG%JA;Ea3g4O-LAy7%*XDSk3sPJwC+oQ(na~{+#_1AmUjS2 zUc5i|h(hBl&M>Y30OUp6*3s&*+H|UyOoMz<+#nG{06hvuOUJfdnE3@6e4OjX8 znj3}fXR#VLMIO0MTeEWjtdEKwPy-L0^}|zc3hO_&u!`wsWp$hY0000