From 2271aa19b62df69fc6d58934665c634a284dd872 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:01:47 +0400 Subject: [PATCH 01/23] [ci] Add build by Ubuntu using Mono Signed-off-by: Ilya Stolyarov --- .github/workflows/test-builds.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index ec489abbb..7c6603c92 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -8,11 +8,24 @@ on: jobs: build: - runs-on: windows-latest + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Setup MSBuild uses: microsoft/setup-msbuild@v2 + if: matrix.os == 'windows-latest' + - name: Setup Mono repository + if: matrix.os == 'ubuntu-latest' + run: > + gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/mono-official-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF + && echo "deb [signed-by=/usr/share/keyrings/mono-official-archive-keyring.gpg] https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list + && sudo apt-get update + - name: Setup Mono + run: sudo apt-get install -y mono-devel + if: matrix.os == 'ubuntu-latest' - name: Restore Packages run: msbuild XenAdmin.sln -t:restore - name: Build Release solution @@ -22,10 +35,10 @@ jobs: - name: Upload Release Artifacts uses: actions/upload-artifact@v4 with: - name: drop-release - path: XenAdmin/bin/Release/net481 + name: drop-release-${{ matrix.os }} + path: XenAdmin/bin/Release/net48 - name: Upload Debug Artifacts uses: actions/upload-artifact@v4 with: - name: drop-debug - path: XenAdmin/bin/Debug/net481 \ No newline at end of file + name: drop-debug-${{ matrix.os }} + path: XenAdmin/bin/Debug/net48 From f32558a9b8b8c88bd665b13b78e00150cbad7189 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:08:31 +0400 Subject: [PATCH 02/23] [project] Change TargetFramework from 'net481' to 'net48' Downgrading TargetFramework version allows building the project using Mono on Linux hosts. Expected that the change will not significantly impact Windows builds. Probably, the downgraded version currently is the latest supported by Mono. Signed-off-by: Ilya Stolyarov --- CommandLib/CommandLib.csproj | 2 +- XenAdmin/XenAdmin.csproj | 2 +- XenCenterLib/XenCenterLib.csproj | 2 +- XenModel/XenModel.csproj | 2 +- XenOvfApi/XenOvfApi.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CommandLib/CommandLib.csproj b/CommandLib/CommandLib.csproj index 1ebb88f14..42bdac5e3 100644 --- a/CommandLib/CommandLib.csproj +++ b/CommandLib/CommandLib.csproj @@ -1,6 +1,6 @@  - net481 + net48 CommandLib XCP-ng Center library diff --git a/XenAdmin/XenAdmin.csproj b/XenAdmin/XenAdmin.csproj index b30eb87ce..a4d620377 100755 --- a/XenAdmin/XenAdmin.csproj +++ b/XenAdmin/XenAdmin.csproj @@ -1,6 +1,6 @@  - net481 + net48 true true WinExe diff --git a/XenCenterLib/XenCenterLib.csproj b/XenCenterLib/XenCenterLib.csproj index 13f16c21b..d9d0ff0b7 100644 --- a/XenCenterLib/XenCenterLib.csproj +++ b/XenCenterLib/XenCenterLib.csproj @@ -1,6 +1,6 @@  - net481 + net48 XenCenterLib XCP-ng Center library diff --git a/XenModel/XenModel.csproj b/XenModel/XenModel.csproj index b28f3965a..eaff4ad3a 100755 --- a/XenModel/XenModel.csproj +++ b/XenModel/XenModel.csproj @@ -1,6 +1,6 @@  - net481 + net48 XenModel XCP-ng Center library XenAdmin diff --git a/XenOvfApi/XenOvfApi.csproj b/XenOvfApi/XenOvfApi.csproj index 1c605eb2e..6a0627b69 100644 --- a/XenOvfApi/XenOvfApi.csproj +++ b/XenOvfApi/XenOvfApi.csproj @@ -1,6 +1,6 @@  - net481 + net48 XenCenterOVF XCP-ng Center library XenOvf From c6fff230c98e55b0c8615c4abef681db3f5fa378 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:15:53 +0400 Subject: [PATCH 03/23] [project] XenAdmin: Add 'System.Windows.Forms' reference Signed-off-by: Ilya Stolyarov --- XenAdmin/XenAdmin.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/XenAdmin/XenAdmin.csproj b/XenAdmin/XenAdmin.csproj index a4d620377..fe04e3ca4 100755 --- a/XenAdmin/XenAdmin.csproj +++ b/XenAdmin/XenAdmin.csproj @@ -23,6 +23,7 @@ + From e8b08825b40f0a07f745ba185c5e7aabc13473da Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:25:44 +0400 Subject: [PATCH 04/23] [project] Change letter cases of files to match string values in resources or vice-versa The builds on Linux are usually stored on case-sensitive file systems. While on Windows is no matter how to write letter cases, the Linux build fails because of it. These changes should allow building the same code on both host platforms. Signed-off-by: Ilya Stolyarov --- XenAdmin/Commands/{ImPortCommand.cs => ImportCommand.cs} | 0 ...{DataEventList.designer.cs => DataEventList.Designer.cs} | 0 .../{DataPlot.designer.cs => DataPlot.Designer.cs} | 0 .../{DataPlotNav.designer.cs => DataPlotNav.Designer.cs} | 0 ...hotTreeView.designer.cs => SnapshotTreeView.Designer.cs} | 0 ...log.designer.cs => ConnectingToServerDialog.Designer.cs} | 0 ...gDialog.designer.cs => LVMoHBAWarningDialog.Designer.cs} | 0 ....designer.cs => WlbReportSubscriptionDialog.Designer.cs} | 0 XenAdmin/Properties/Resources.resx | 6 +++--- ...Page.designer.cs => CustomFieldsDisplayPage.Designer.cs} | 0 ...{SnapshotsPage.designer.cs => SnapshotsPage.Designer.cs} | 0 ...nPriorities.designer.cs => AssignPriorities.Designer.cs} | 0 .../Frontends/{LVMoHBA.designer.cs => LVMoHBA.Designer.cs} | 0 ...{XenWizardBase.designer.cs => XenWizardBase.Designer.cs} | 0 14 files changed, 3 insertions(+), 3 deletions(-) rename XenAdmin/Commands/{ImPortCommand.cs => ImportCommand.cs} (100%) rename XenAdmin/Controls/CustomDataGraph/{DataEventList.designer.cs => DataEventList.Designer.cs} (100%) rename XenAdmin/Controls/CustomDataGraph/{DataPlot.designer.cs => DataPlot.Designer.cs} (100%) rename XenAdmin/Controls/CustomDataGraph/{DataPlotNav.designer.cs => DataPlotNav.Designer.cs} (100%) rename XenAdmin/Controls/{SnapshotTreeView.designer.cs => SnapshotTreeView.Designer.cs} (100%) rename XenAdmin/Dialogs/{ConnectingToServerDialog.designer.cs => ConnectingToServerDialog.Designer.cs} (100%) rename XenAdmin/Dialogs/WarningDialogs/{LVMoHBAWarningDialog.designer.cs => LVMoHBAWarningDialog.Designer.cs} (100%) rename XenAdmin/Dialogs/Wlb/{WlbReportSubscriptionDialog.designer.cs => WlbReportSubscriptionDialog.Designer.cs} (100%) rename XenAdmin/SettingsPanels/{CustomFieldsDisplayPage.designer.cs => CustomFieldsDisplayPage.Designer.cs} (100%) rename XenAdmin/TabPages/{SnapshotsPage.designer.cs => SnapshotsPage.Designer.cs} (100%) rename XenAdmin/Wizards/HAWizard_Pages/{AssignPriorities.designer.cs => AssignPriorities.Designer.cs} (100%) rename XenAdmin/Wizards/NewSRWizard_Pages/Frontends/{LVMoHBA.designer.cs => LVMoHBA.Designer.cs} (100%) rename XenAdmin/Wizards/{XenWizardBase.designer.cs => XenWizardBase.Designer.cs} (100%) diff --git a/XenAdmin/Commands/ImPortCommand.cs b/XenAdmin/Commands/ImportCommand.cs similarity index 100% rename from XenAdmin/Commands/ImPortCommand.cs rename to XenAdmin/Commands/ImportCommand.cs diff --git a/XenAdmin/Controls/CustomDataGraph/DataEventList.designer.cs b/XenAdmin/Controls/CustomDataGraph/DataEventList.Designer.cs similarity index 100% rename from XenAdmin/Controls/CustomDataGraph/DataEventList.designer.cs rename to XenAdmin/Controls/CustomDataGraph/DataEventList.Designer.cs diff --git a/XenAdmin/Controls/CustomDataGraph/DataPlot.designer.cs b/XenAdmin/Controls/CustomDataGraph/DataPlot.Designer.cs similarity index 100% rename from XenAdmin/Controls/CustomDataGraph/DataPlot.designer.cs rename to XenAdmin/Controls/CustomDataGraph/DataPlot.Designer.cs diff --git a/XenAdmin/Controls/CustomDataGraph/DataPlotNav.designer.cs b/XenAdmin/Controls/CustomDataGraph/DataPlotNav.Designer.cs similarity index 100% rename from XenAdmin/Controls/CustomDataGraph/DataPlotNav.designer.cs rename to XenAdmin/Controls/CustomDataGraph/DataPlotNav.Designer.cs diff --git a/XenAdmin/Controls/SnapshotTreeView.designer.cs b/XenAdmin/Controls/SnapshotTreeView.Designer.cs similarity index 100% rename from XenAdmin/Controls/SnapshotTreeView.designer.cs rename to XenAdmin/Controls/SnapshotTreeView.Designer.cs diff --git a/XenAdmin/Dialogs/ConnectingToServerDialog.designer.cs b/XenAdmin/Dialogs/ConnectingToServerDialog.Designer.cs similarity index 100% rename from XenAdmin/Dialogs/ConnectingToServerDialog.designer.cs rename to XenAdmin/Dialogs/ConnectingToServerDialog.Designer.cs diff --git a/XenAdmin/Dialogs/WarningDialogs/LVMoHBAWarningDialog.designer.cs b/XenAdmin/Dialogs/WarningDialogs/LVMoHBAWarningDialog.Designer.cs similarity index 100% rename from XenAdmin/Dialogs/WarningDialogs/LVMoHBAWarningDialog.designer.cs rename to XenAdmin/Dialogs/WarningDialogs/LVMoHBAWarningDialog.Designer.cs diff --git a/XenAdmin/Dialogs/Wlb/WlbReportSubscriptionDialog.designer.cs b/XenAdmin/Dialogs/Wlb/WlbReportSubscriptionDialog.Designer.cs similarity index 100% rename from XenAdmin/Dialogs/Wlb/WlbReportSubscriptionDialog.designer.cs rename to XenAdmin/Dialogs/Wlb/WlbReportSubscriptionDialog.Designer.cs diff --git a/XenAdmin/Properties/Resources.resx b/XenAdmin/Properties/Resources.resx index 35b07da37..ea1299c07 100755 --- a/XenAdmin/Properties/Resources.resx +++ b/XenAdmin/Properties/Resources.resx @@ -1118,13 +1118,13 @@ ..\Images\000_VMPausedDisabled_h32bit_16_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\images\000_userandgroup_h32bit_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Images\000_UserAndGroup_h32bit_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\images\000_user_h32bit_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Images\000_User_h32bit_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\images\queued.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Images\queued.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Images\gooroom_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/XenAdmin/SettingsPanels/CustomFieldsDisplayPage.designer.cs b/XenAdmin/SettingsPanels/CustomFieldsDisplayPage.Designer.cs similarity index 100% rename from XenAdmin/SettingsPanels/CustomFieldsDisplayPage.designer.cs rename to XenAdmin/SettingsPanels/CustomFieldsDisplayPage.Designer.cs diff --git a/XenAdmin/TabPages/SnapshotsPage.designer.cs b/XenAdmin/TabPages/SnapshotsPage.Designer.cs similarity index 100% rename from XenAdmin/TabPages/SnapshotsPage.designer.cs rename to XenAdmin/TabPages/SnapshotsPage.Designer.cs diff --git a/XenAdmin/Wizards/HAWizard_Pages/AssignPriorities.designer.cs b/XenAdmin/Wizards/HAWizard_Pages/AssignPriorities.Designer.cs similarity index 100% rename from XenAdmin/Wizards/HAWizard_Pages/AssignPriorities.designer.cs rename to XenAdmin/Wizards/HAWizard_Pages/AssignPriorities.Designer.cs diff --git a/XenAdmin/Wizards/NewSRWizard_Pages/Frontends/LVMoHBA.designer.cs b/XenAdmin/Wizards/NewSRWizard_Pages/Frontends/LVMoHBA.Designer.cs similarity index 100% rename from XenAdmin/Wizards/NewSRWizard_Pages/Frontends/LVMoHBA.designer.cs rename to XenAdmin/Wizards/NewSRWizard_Pages/Frontends/LVMoHBA.Designer.cs diff --git a/XenAdmin/Wizards/XenWizardBase.designer.cs b/XenAdmin/Wizards/XenWizardBase.Designer.cs similarity index 100% rename from XenAdmin/Wizards/XenWizardBase.designer.cs rename to XenAdmin/Wizards/XenWizardBase.Designer.cs From c4d6750cd4e71ed283f2d3af1d13f8a3b24aa2d5 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:29:31 +0400 Subject: [PATCH 05/23] XenAdmin: Drawing: Change QuickDraw function implementation to crossplatform variant This taken from the page https://github.com/xcp-ng/xenadmin/wiki/Cross-Platform-Vision Signed-off-by: Ilya Stolyarov --- XenAdmin/Core/Drawing.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XenAdmin/Core/Drawing.cs b/XenAdmin/Core/Drawing.cs index 6acf0b860..15d939f14 100644 --- a/XenAdmin/Core/Drawing.cs +++ b/XenAdmin/Core/Drawing.cs @@ -70,7 +70,7 @@ static Drawing() /// public static void QuickDraw(Graphics gTarget, Bitmap buffer) { - QuickDraw(gTarget, buffer, new Point(0, 0), new Rectangle(0, 0, buffer.Width, buffer.Height)); + gTarget.DrawImage(buffer, new Rectangle(0, 0, buffer.Width, buffer.Height)); } /// From 963652772b0876306acf28ef0988b9fc3d2bd5de Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:34:22 +0400 Subject: [PATCH 06/23] [mono] XenAdmin: AddServerDialog: Disable setting focus on a field if password is wrong The focus setting doesn't work on Mono, so just skip that behaviour if the runtime is Mono. In the result, the focus remains on the username field. The change doesn't impact user experience a lot. Signed-off-by: Ilya Stolyarov --- XenAdmin/Dialogs/AddServerDialog.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/XenAdmin/Dialogs/AddServerDialog.cs b/XenAdmin/Dialogs/AddServerDialog.cs index d1bf28e6a..285f8899c 100644 --- a/XenAdmin/Dialogs/AddServerDialog.cs +++ b/XenAdmin/Dialogs/AddServerDialog.cs @@ -89,7 +89,21 @@ private void AddServerDialog_Shown(object sender, EventArgs e) if (!ServerNameComboBox.Enabled && connection != null && !string.IsNullOrEmpty(connection.Username)) { - Win32.SetFocus(PasswordTextBox.Handle); + if (Type.GetType("Mono.Runtime") == null) + { + Win32.SetFocus(PasswordTextBox.Handle); + } + else + { + // + // TODO: The app crashes under Mono if password is wrong + // + + // System.DllNotFoundException: user32.dll assembly: type: member:(null) + // at (wrapper managed-to-native) XenCenterLib.Win32.SetFocus(intptr) + + // So just skip setting focus + } } } From ae2d84d729c6f4446c557c96b1c3290203e7dcb5 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:43:44 +0400 Subject: [PATCH 07/23] [mono] XenAdmin: Snapshots: Disable code that produce exceptions These changes are hotfixes to successfully pass building on Mono. Expected negative impacts: - Losing the cursor change behaviour by moving across snapshot items - Losing some elements positioning The TODOs left in the code should notice about the issue. Probably better to revert this commit in the future and reimplement lost behaviour in cross-platform way. Signed-off-by: Ilya Stolyarov --- XenAdmin/Controls/SnapshotTreeView.cs | 14 +++++++++++++- XenAdmin/TabPages/SnapshotsPage.cs | 24 +++++++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/XenAdmin/Controls/SnapshotTreeView.cs b/XenAdmin/Controls/SnapshotTreeView.cs index 52cfe9ef6..a3a72ae29 100644 --- a/XenAdmin/Controls/SnapshotTreeView.cs +++ b/XenAdmin/Controls/SnapshotTreeView.cs @@ -288,7 +288,19 @@ protected override void OnLayout(LayoutEventArgs levent) { //This is needed to maximize and minimize properly, there is some issue in the ListView Control Win32.POINT pt = new Win32.POINT(); - IntPtr hResult = SendMessage(Handle, LVM_GETORIGIN, IntPtr.Zero, ref pt); + + if (Type.GetType("Mono.Runtime") == null) + { + IntPtr hResult = SendMessage(Handle, LVM_GETORIGIN, IntPtr.Zero, ref pt); + } + else + { + // TODO: There is an exception under Mono + + // System.DllNotFoundException: user32.dll assembly: type: member:(null) + // at (wrapper managed-to-native) XenAdmin.Controls.SnapshotTreeView.SendMessage(intptr,int,intptr,XenCenterLib.Win32/POINT&) + // at XenAdmin.Controls.SnapshotTreeView.OnLayout (System.Windows.Forms.LayoutEventArgs levent) + } origin = pt; root.InvalidateAll(); diff --git a/XenAdmin/TabPages/SnapshotsPage.cs b/XenAdmin/TabPages/SnapshotsPage.cs index bbbcfd28e..ff1edd526 100644 --- a/XenAdmin/TabPages/SnapshotsPage.cs +++ b/XenAdmin/TabPages/SnapshotsPage.cs @@ -1478,15 +1478,29 @@ private void snapshotTreeView_DragDrop(object sender, DragEventArgs e) private void snapshotTreeView_MouseMove(object sender, MouseEventArgs e) { - - SnapshotIcon icon = snapshotTreeView.HitTest(e.X, e.Y).Item as SnapshotIcon; - if (icon != null && icon.ImageIndex == SnapshotIcon.VMImageIndex) + if (Type.GetType("Mono.Runtime") == null) { - this.Cursor = Cursors.Hand; + SnapshotIcon icon = snapshotTreeView.HitTest(e.X, e.Y).Item as SnapshotIcon; + if (icon != null && icon.ImageIndex == SnapshotIcon.VMImageIndex) + { + this.Cursor = Cursors.Hand; + } + else + { + this.Cursor = Cursors.Default; + } } else { - this.Cursor = Cursors.Default; + // + // TODO: Under Mono there is an exception + // + + // System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. + // Parameter name: index + // at System.Windows.Forms.ListView+ListViewItemCollection.get_Item (System.Int32 index) + // at System.Windows.Forms.ListView+ItemControl.ItemsMouseMove (System.Object sender, System.Windows.Forms.MouseEventArgs me) + // at System.Windows.Forms.Control.OnMouseMove (System.Windows.Forms.MouseEventArgs e) } } From 09f1c13548f77d21d9e24f5e3d135dced94962a6 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:47:45 +0400 Subject: [PATCH 08/23] [resource] XenAdmin: AddServerDialog: Fix cutting a part of credential fields group The cutting effect noticed by running on Mono. To fix that, the AutoSize feature on the group box is disabled. Signed-off-by: Ilya Stolyarov --- XenAdmin/Dialogs/AddServerDialog.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XenAdmin/Dialogs/AddServerDialog.resx b/XenAdmin/Dialogs/AddServerDialog.resx index 4607dd0cc..06f31fca0 100644 --- a/XenAdmin/Dialogs/AddServerDialog.resx +++ b/XenAdmin/Dialogs/AddServerDialog.resx @@ -358,7 +358,7 @@ 3 - True + False GrowAndShrink From f02b5a9cfcecadf81db6761e851ecca0707ec58c Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:52:31 +0400 Subject: [PATCH 09/23] [mono] XenAdmin: DataGridViewEx: Add explicit font settings on cell styles The change fixes a group of exceptions that were throwing by catching null values on the font argument on some internal functions. This behaviour noticed by running on Mono. Signed-off-by: Ilya Stolyarov --- .../Controls/DataGridViewEx/DataGridViewEx.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/XenAdmin/Controls/DataGridViewEx/DataGridViewEx.cs b/XenAdmin/Controls/DataGridViewEx/DataGridViewEx.cs index 7f8017e76..7a66ef671 100644 --- a/XenAdmin/Controls/DataGridViewEx/DataGridViewEx.cs +++ b/XenAdmin/Controls/DataGridViewEx/DataGridViewEx.cs @@ -77,6 +77,22 @@ private void SetUpDataGridViewExCellStyles() DisabledHiddenStyle = new DataGridViewCellStyle(); DisabledRowStyle = new DataGridViewCellStyle(); + if (Type.GetType("Mono.Runtime") != null) + { + // These fonts are null by default + // Under Mono some functions produce exceptions due to that + // So set them to some value + + var CellFont = new Font(Program.DefaultFont.FontFamily, Program.DefaultFont.Size - 1f); + + EnabledStyle.Font = CellFont; + EnabledHiddenStyle.Font = CellFont; + DisabledStyle.Font = CellFont; + DisabledHiddenStyle.Font = CellFont; + DisabledRowStyle.Font = CellFont; + EnabledUnfocusedStyle.Font = CellFont; + } + EnabledStyle.BackColor = ThemeBackgroundColor; EnabledStyle.ForeColor = SystemColors.ControlText; EnabledStyle.SelectionBackColor = SystemColors.Highlight; From 27274a7ed9c7b0cb75efad69d8cb9c4a2e9a2668 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 17:57:07 +0400 Subject: [PATCH 10/23] [mono] XenAdmin: VNCGraphicsClient: Disable cursor image change Doesn't work on Mono. The expected negative effect is losing indication to a user that the input is sending to a VM. Signed-off-by: Ilya Stolyarov --- XenAdmin/ConsoleView/VNCGraphicsClient.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/XenAdmin/ConsoleView/VNCGraphicsClient.cs b/XenAdmin/ConsoleView/VNCGraphicsClient.cs index 01fa9d454..75c6ad55d 100644 --- a/XenAdmin/ConsoleView/VNCGraphicsClient.cs +++ b/XenAdmin/ConsoleView/VNCGraphicsClient.cs @@ -1,4 +1,4 @@ -/* Copyright (c) Cloud Software Group, Inc. +/* Copyright (c) Cloud Software Group, Inc. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -438,8 +438,14 @@ internal CustomCursor(Bitmap bitmap, int x, int y) hbmColor = bitmap.GetHbitmap() }; - _handle = CreateIconIndirect(ref iconInfo); - Cursor = new Cursor(_handle); + if (Type.GetType("Mono.Runtime") == null){ + _handle = CreateIconIndirect(ref iconInfo); + Cursor = new Cursor(_handle); + } + else + { + // Doesn't work under Mono + } } ~CustomCursor() From 7e2a0e6a8672b6669c8a455922e1b48a40615479 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 20:29:49 +0400 Subject: [PATCH 11/23] [mono] XenAdmin: VNCGraphicsClient: Disable ScanCodes handling The code in `XenAdmin/VNC/KeyMap.cs` is not crossplatform. It must be reimplemented. After that, this commit can be reverted. Signed-off-by: Ilya Stolyarov --- XenAdmin/ConsoleView/VNCGraphicsClient.cs | 42 ++++++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/XenAdmin/ConsoleView/VNCGraphicsClient.cs b/XenAdmin/ConsoleView/VNCGraphicsClient.cs index 75c6ad55d..14a3ee55a 100644 --- a/XenAdmin/ConsoleView/VNCGraphicsClient.cs +++ b/XenAdmin/ConsoleView/VNCGraphicsClient.cs @@ -1,4 +1,4 @@ -/* Copyright (c) Cloud Software Group, Inc. +/* Copyright (c) Cloud Software Group, Inc. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -872,7 +872,15 @@ protected override void OnGotFocus(EventArgs e) if (_sendScanCodes) { - InterceptKeys.grabKeys(KeyScan, false); + if (Type.GetType("Mono.Runtime") == null) + { + InterceptKeys.grabKeys(KeyScan, false); + } + else + { + // TODO: The code in `XenAdmin/VNC/KeyMap.cs` + // must be crossplatform to enable this feature + } } if (_updateClipboardOnFocus) @@ -886,7 +894,15 @@ protected override void OnLostFocus(EventArgs e) EnableMenuShortcuts(); - InterceptKeys.releaseKeys(); + if (Type.GetType("Mono.Runtime") == null) + { + InterceptKeys.releaseKeys(); + } + else + { + // TODO: The code in `XenAdmin/VNC/KeyMap.cs` + // must be crossplatform to enable this feature + } _cursorOver = false; @@ -1265,11 +1281,27 @@ public bool SendScanCodes if (!value) { - InterceptKeys.releaseKeys(); + if (Type.GetType("Mono.Runtime") == null) + { + InterceptKeys.releaseKeys(); + } + else + { + // TODO: The code in `XenAdmin/VNC/KeyMap.cs` + // must be crossplatform to enable this feature + } } else if (Focused) { - InterceptKeys.grabKeys(KeyScan, false); + if (Type.GetType("Mono.Runtime") == null) + { + InterceptKeys.grabKeys(KeyScan, false); + } + else + { + // TODO: The code in `XenAdmin/VNC/KeyMap.cs` + // must be crossplatform to enable this feature + } } _sendScanCodes = value; From 4db9c2f7e2efa3a339ea934d816fb18af64f6e63 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 20:37:57 +0400 Subject: [PATCH 12/23] [mono] XenAdmin: XSVNCScreen: Fix call loop It is the hotfix to avoid a program stuck on Mono because of a call loop. Expected negative impact is impossibility to send keyboard and mouse input to a VM. The issue need more investigation and after resolving it this hotfix commit can be reverted. Signed-off-by: Ilya Stolyarov --- XenAdmin/ConsoleView/XSVNCScreen.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/XenAdmin/ConsoleView/XSVNCScreen.cs b/XenAdmin/ConsoleView/XSVNCScreen.cs index aee968e87..09921ff79 100644 --- a/XenAdmin/ConsoleView/XSVNCScreen.cs +++ b/XenAdmin/ConsoleView/XSVNCScreen.cs @@ -1258,7 +1258,14 @@ protected override void OnEnter(EventArgs e) Program.AssertOnEventThread(); base.OnEnter(e); - CaptureKeyboardAndMouse(); + if (Type.GetType("Mono.Runtime") == null) + { + CaptureKeyboardAndMouse(); + } + else + { + // TODO: It is a cause of a call loop under Mono + } RefreshScreen(); } From 7fab81741488c6c8e8d9053b9ce206f898d92b53 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 20:41:41 +0400 Subject: [PATCH 13/23] [mono] XenAdmin: FlickerFreeListBox: Fix exception on call GetScrollInfo This is the hotfix to avoid the exception throwing by disabling some functionality if the runtime platform is Mono. The impact is unknown. Need more investigation to revert this hotfix. Signed-off-by: Ilya Stolyarov --- XenAdmin/Controls/FlickerFreeListBox.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/XenAdmin/Controls/FlickerFreeListBox.cs b/XenAdmin/Controls/FlickerFreeListBox.cs index 485051fbe..286138452 100644 --- a/XenAdmin/Controls/FlickerFreeListBox.cs +++ b/XenAdmin/Controls/FlickerFreeListBox.cs @@ -73,7 +73,21 @@ protected override void WndProc(ref Message msg) Win32.ScrollInfo si = new Win32.ScrollInfo(); si.fMask = (int)Win32.ScrollInfoMask.SIF_ALL; si.cbSize = (uint)Marshal.SizeOf(si); - Win32.GetScrollInfo(msg.HWnd, 0, ref si); + + if (Type.GetType("Mono.Runtime") == null) + { + Win32.GetScrollInfo(msg.HWnd, 0, ref si); + } + else + { + // + // TODO: Exception under Mono + // + + // System.DllNotFoundException: user32.dll assembly: type: member:(null) + // at (wrapper managed-to-native) XenCenterLib.Win32.GetScrollInfo(intptr,int,XenCenterLib.Win32/ScrollInfo&) + // at XenAdmin.Controls.FlickerFreeListBox.WndProc (System.Windows.Forms.Message& msg) + } if ((msg.WParam.ToInt32() & 0xFF) == Win32.SB_THUMBTRACK) { From 3340640392d848af4e74040784e71516be56a0c8 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 20:44:15 +0400 Subject: [PATCH 14/23] [mono] XenAdmin: VNCScream: Use stopwatch for measuring time to update frames Reimplemented update timer of frames for Mono runtime. Signed-off-by: Ilya Stolyarov --- XenAdmin/VNC/VNCStream.cs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/XenAdmin/VNC/VNCStream.cs b/XenAdmin/VNC/VNCStream.cs index 34aebcba3..721fe789b 100644 --- a/XenAdmin/VNC/VNCStream.cs +++ b/XenAdmin/VNC/VNCStream.cs @@ -158,17 +158,28 @@ public class VNCStream Mode = CipherMode.ECB }; + private System.Diagnostics.Stopwatch stopwatch; + public VNCStream(IVNCGraphicsClient client, Stream stream, bool startPaused) { this.client = client; this.stream = new MyStream(stream); paused = startPaused; - if (!Win32.QueryPerformanceFrequency(out var freq)) + if (Type.GetType("Mono.Runtime") == null) { + if (!Win32.QueryPerformanceFrequency(out var freq)) + { + System.Diagnostics.Trace.Assert(false); + } + + imageUpdateThreshold = freq / 3; + } + else { - System.Diagnostics.Trace.Assert(false); + this.stopwatch = new System.Diagnostics.Stopwatch(); + this.stopwatch.Start(); + imageUpdateThreshold = System.Diagnostics.Stopwatch.Frequency / 3; } - imageUpdateThreshold = freq / 3; } public void Connect(char[] password) @@ -1241,7 +1252,13 @@ private void ReadFrameBufferUpdate() Log.Debug("reading " + n + " rectangles"); bool fb_updated = false; - Win32.QueryPerformanceCounter(out var start); + long start; + if (Type.GetType("Mono.Runtime") == null) { + Win32.QueryPerformanceCounter(out start); + } + else { + start = System.Diagnostics.Stopwatch.GetTimestamp(); + } for (int i = 0; i < n; ++i) { int x = stream.readCard16(); @@ -1286,7 +1303,16 @@ private void ReadFrameBufferUpdate() throw new VNCException("unimplemented encoding: " + encoding); } - Win32.QueryPerformanceCounter(out var end); + long end; + if (Type.GetType("Mono.Runtime") == null) + { + Win32.QueryPerformanceCounter(out end); + } + else + { + end = System.Diagnostics.Stopwatch.GetTimestamp(); + } + if (end - start > imageUpdateThreshold) { client.ClientFrameBufferUpdate(); From b2a615fa80c2436fc829bf093425a053801d8dfb Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 20:48:53 +0400 Subject: [PATCH 15/23] [resource] Use PNG formatted splash screen The splash image that is showing on the first moments on a screen is changed to a PNG formatted variant. The previous BMP formatted variant doesn't work on Mono. Expected that the change doesn't affect Windows users. Signed-off-by: Ilya Stolyarov --- XenAdmin/Properties/Resources.resx | 2 +- XenAdmin/Resources/splash.png | Bin 233 -> 72848 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/XenAdmin/Properties/Resources.resx b/XenAdmin/Properties/Resources.resx index ea1299c07..d5949bbdf 100755 --- a/XenAdmin/Properties/Resources.resx +++ b/XenAdmin/Properties/Resources.resx @@ -1163,6 +1163,6 @@ ..\Images\rpm_package.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\splash.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\splash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/XenAdmin/Resources/splash.png b/XenAdmin/Resources/splash.png index 3e9d6ed41b4901ee2e3811ef6e85df0978acf1d2..a8212596c0540d5d875f52476c46b9a7f35b3a77 100644 GIT binary patch literal 72848 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

+sru$5 zXnck$eK~cCYd>|Fc&B>?32NYOCgDt^iTT8LB8nf(Z0gI@s*M3xTvxM(Kr3$A_6F^< zlc;I%%jpsfX_}U$LPfb(We;^ic}&zPHi(|b%P9{Ol8~sChpZPk?Iw^a0||9lwX*<8 zR!)K9-6@ij*h<#uP*Ut*a1ST2Y_zeZ3d@gK4 zwy11(-TSNrJU&1qOXHZyG0+l7Ar^Vzp#)k6SRb}R7c zU?2M{m5U^toSnB*$A|lSxbJUa2=~4#d-$Io-rxgA8+`HAm++-O`4LV991?i^V1s}D z&=vf{Yx{UK1fI=i53j%UB3^&#hq!sM#iw6C!#D13ORwc?-+mU~eC~OC^cOyWTeoiE z{*zN29Uo;uM@EK_67DU7!3u_pC@8BcbgK#v7uhC*i=~bNmsQkr12^#W*q|WDqM=J= zShU#&DP{)ZsD>SZpIVN@!^nCJLJ;t@ixUg#RlH^5!6{P>3qCnrM|UA_*w|f?rKxVG z_UxS9F$e$w778}tIg<~^$1zE8`tvFgHXN>qv)rwzAs_FxfQ}b%V_b|Ao$}2GQmvT;#tUp(TYIljxe(b{} zHfXV4?VTS7Gs3?l&HJ4EH_yI5wLNZod2@-2CwixY%y-yRV<&Pu@6hWsdILJ;9fr`8q!Q zf%ifZZr{FzY-! z6r$Cb%o%n|ynxB$D9e9l8ypMgjLNYnrA*Y=RolL2{C1_i2glnINXssAr`-yJSz zS#7`e)HA1_)RW#5NFap-LNB2yD1v|pq9CANL9cKHeYx?~j@9`}W@NJBK3NA2QG5BT3H8`Q|ITtiASHY}DM0Q4T4_ z9XmV#KjDoubJ+UTuxGv$SZx$NdUP^DP_z`xM$gj=+p<1bt=dh-{Wj3zBWa^8EwKg8 z9dmC4T_yUr@JT{!2FuoiFfz-lWN=Hr?p*LYip656-?pV?J6?QsH9oAbY@vX~J$-mG z5y$*w20K$86Vq`FOAun^oBh7d9JUM;Fgahu2ov$siTHcA!6qWq#|iZ&Z&56Ux}hUc zKVlS!2wg2((7Ej`6!Ll8*O|jT9XS*R`P`RQuEypqTQP3*DD?LBqOq|N@pxR6LotVn zO9D66z&ZJ8TVO+o5!z%y)z9#zBJvGu)gFz;cGY0kW2xBT|*oGm${Rmd*XFe-HUf1WzIs zvo2B1uv3NTVk}ftaBy6P6{nTWu9XflLxVRMb@gvi}NAgl2~a)4~? zuH~XsV0-L?>^xu%m{2G(3WZX5e0lX+Y-!p4p-nzSgai>b<%?+RF5r>AEJh{?GtzNP zuZp8SPFT{J!{$6=5)qC}K<)a}W>QEc;_ut>#Nr9m4R1!>u#o^59a}e{t7Qv{g#sS! z&f_l~Ib`2PW@}q(D_&Z;2IEGLLSJ7W`uqD)Q&VFgFcSHNY>i?6060Wn^S}vjpMXh8 zB=?2LnPY-H8`zd2=93*@J)g26S&5QRwDS-q6()Ds3#uqx!V<^u;e3(=VY&r_Tsbqa zD7G8f7g>3euyZh!4&ox%G!RmZDEhvJr^}>=?$U6K8CJ4}&AE}1L(C3#2JHr5=OcE; zWOmJrJDv=$@LD>sON~pURWc^?R6Fxl$wlA@f8;<&k)b>+ zqCv3Mk_|3bka)5K16aBCbq@pQ!}H1{5;&l~8sGxjsuNh312*RvZw}<~NOv9$aY9SJ z6jZXN3rNOesI5xBFS9IWMzSh{x?v+xJ7hQtxg5G$-a=Q)7BDkb^yKm9_5rjO_#J!} zuxj0U9I)3yq>{-}@~N#=0h5W;A|M-)QC;1Ls+6qmnSfs;qk&;0Ti96uB~Q!>e+P*L zLED{>v}O0W`m&@-3x*y=b0ZE6xtyW8P-+&k^|G*p2)v={muSTz^DuJuEh0+;f!VXs zk+V8s9)lGY$uJ0jPNmQKY%_UgPRwCt4@=5Wa~lz zghYX570opVlVtZt(REHZpfXt$+_v@F&xBN*U?b>g48Y8AGN3&AlzW}UG#_!U$S9VR z&z5c5vG(;h@L_&2fRV{KrX}NO9$JO%MPOC7fLHnoc)qU?CZ0eAp-v==+IKnY87x~= z)z+hacr&W%8j$PjMQ6)f=xuKWGh2k%~KY3WdRR5?{rL?pqx<2BOn^y z3qs~V{hcu`Bw`dl7U|;|P0|Tl;VvDD%H6L=I6t*R)DhMSpfy9i3#r_1j zoqDJNN=Dv{LTxoN!*23GgtnK8G~mb~8z@}^#R`!6b2`bYE)RZ%7ZzSvA@m*CFG%Zc zv-qdz=9To(NGpzerZRBNx=er~qe12+8A-wtnJzLq7ABpXtg3?C_F`fW>BDwQR;@sI z7m=RrD8W*-h)-&w5U8}s9WNp|TZ@t)F*)QdMrD68%N$@cqhvGVV~@Q!OOp?Zgq+DB zYGh=uwI>yORM>^49BY4w=p1N~04bXki%u4+Y$zS_nA`+X$>WU`D~BDYLgm&Y*BD6b zJ3w!b%TcU6*@a@EoPdg0y>5L7!F^a?1rS;TRps&p=`Iwpv@3@-*#sJL@JH0mMv)8^aip$T^L~CuN^tu);54`d45lyzvlJz z$ma_v6bi@=WW}bxmWy{d1#CQPSoneXdLGh4(nyV+gwzeY0Y7|x*o=BuHRfvPK|Xs# z2AU?9l}VBqA@*Y`E&FT3R7D@xOQvi@LL;vhxsa%Hg2C^Y%&M$hckm?_sO@!DT56Fp zMX0OikSR1jF!BX+Nd(q$*0Kz#;_cx2%&=;;Nmc61m0>QA#Gi?69Fa9h_uM3|o9vlY za5l%Nj-1(;;;~j-a7b6=Z`H}=)r8Lz8;_=N&&M*DN$7b>9)O;Pc}#Sj->XS0S_D`r z9BK&*R+u$e*g|S`k@ud6IvpHiWk^F*gm&oes5VCfRTkNR$ldg3^22#y zrz3BA^4*(So}W#?P_rMltEb|*5LK?UZD8qz;}9NTDsv+Zrc{;1F$f4L;xWhs$Bw!< zIZw9LOYuNH;qj8$sgbh|g!*-)prUfsTY-ER6_pw~yXk*!!o-Oaux8B~J>y|n{E|1? zlB2LpW`C4i$SM@CW))At&0&>A2SmnI&Rq)<9z9k|jeVW5 zGG0*MS+x!n$n0o>iKNo7b8m`H$gxS$vwn5lR@9_4^U-Y}Rj4o`32!|EVviJ#65?U1 zz&LP5NrvHO+;(=gNy9gbK$f$r9A=x*JHf!-bfz}jqSfpmFK9{(&&W83yt zytQ>38tdzj&GwfHgLqu%`ne^xws3N#a?}{o483(wWTpEC7^au|2B+9@rki%~?{rbo zAUMh-X3C@Na^wNo3`$B(AR3NKOK3Bzab{>HAWG|O%idQ0LWCl*Nl(!hJhL1gyBchf zwM;}H(1FLL-4g3yoiF6k+uIw-dii7oyt5uQl;X(DugJckine%WvU^C9kPy+G10%Pv z2=>?xnCZRRp|MnJ#Zok3k?nUC3#{bb6xK3J5y1j#{-Yo-W)-^wWd$~T2bolvbc&Uq z6QSdF%4dxk_2DNXwvgxkggEKMrAEnWU-`_PAO?kE_M`S0WD(}Dl;nX+&N&Q2rSu_N zTef3hAm;?cSS*HOvFKga{Qvc81L5HTVEOhep6DxviHDgne#~ebaPWQ@w)PdYJiY=% zgiI=dMEu=%J=G0Os2MU0nc4H=D~x8la%-H64D7i0D6)o5vH z!RXPWF>Ts3%-nG%PB`&%m^WvRUJfn)S6h1kq@{u!^WTZ@gGHleDj3KJ$wz~sr3@r5sZ0Xxo|so^Zv$;ol>HcV^T zX1IGaY)E=!WQvr+nf-BHbXZ>=g#;-@wkS!eu18DkghUqBTsx8q-Bk3GCp44A*`ZU- zfm|ddI4nPvDhZ&+9(#;I+Eay$`8-+sY>FT?w(WSp-6wL|Vr817+HeScEh)=EYO6gG zmLwDkdGz*{lnnm(mwR!~(uczveB78(*k|Fcm^gkMTHD*P{K=>B{L8O?i25JR7zBXE z`Z}C(%I9(5K6|43jrCZ6$8Bg?u^b~BYtdMfdB+JNm8n5Z(@<154h0tr=xN)Ip0*a` zvi$&nb=e{w>ds+VcOL!kBP*Sm@v#H;#&Jg+hD1D$F=NJ{wx&k4v*elHE5TXEMN|lY zipr3D-Gy_nL3JVo#?80ff>TdDHT;pPsw%wt>Z=$%YE<~1LcWMyciR;&zW8GJa~E82 z0lxRW??G;f|Ms`P#o1?{jgF3vLC?zT1222i&BViOaTll(xu&$*>4S}Oj$X3~ujhUHv?+rKHfOF0{ z2g{Z%!_=wM6oo!GHr9tB=;n-Po_Q8$oN)$Td+oJB&)*S89DysYxE!@LwIYCO86I_P zV1Ps@4&<5Os)x@2%uVNYnW|o*p6HS{YtN zyl^&HxCdktRdH02$^;g))wx_ATUuJfih7sXv+((2j>PPlJ0KQ|p{lA12kpBz{`_pUtt-krmS0S4aZMv#cG zW!rWP3=Du$DdcjwXdfpeu6T$lY+!o1Pr|wiR)Vyots5L|II*xCv_r?Aa00Hs{(3z2 z*kh%cTYo<;z4TK2>}OYpci>Go-=q@H7`-!D{1bM*6c33vT3{6sC%1DCyNGZCc4|b2)QHnO6suc zJe?2rsv1P33<=vM^wOCS_Y{4XQa9j0+Mb*QWRWpD5N6w9*#M(9nq66Y*`OB-r8aRO zm&5kfHUL0FT^&As*rAv+YsWB9_4V~(O!EkQ?&u@&>gqKB2uB}&DE8ZPH)N`+KpUQ9QEziU0FO)pU|DaU@~gD@*X^tZIy#wg@$2#$f!>pF!W!S`0kirMg?+!=Ojok|ol3q&NiRwj=}@bWlnQqAUOCX^NRy1BqD1k)$_&Qv_(G-} zz{TizH*VU5(@r}Lg+c+dXV1pXH{Xn*Lx+U%arEfX*mt3pcQ&R@nur^2y$uCp4gGFu3H5!RSKZ$Mvvd=^bh+;9Ms%w#{Z$zf90kK#decc`C>u5uNS7&%` zf>&38@p69wAM`is&t}or-;cW5nv$cey6EI6M~6CJYH?G;I#SWXE+a>ao@|nl#df2> zvGeSmar)_}=l!L{jma)DT}y zNJ<}@&*zXxB*Q@2-`^igr6?iBYhGNLsDI&N2*(LF(fv1|jP?#+5((A-cM{ z(Ae0Bn{T=aLx&E9U0DqlZqGUA96a>ULwMnZ7jVZNci`xwkA|8v6j_ZGm7}Sexchb0 z^b)3roMGDxdB&wWwdwrA*eCJPqs!5#41{CCZqksk@+AS zs7*rafxQC(NRVu89r3qVD2WmNwaFkPT6iWS0RcF2JH87es}7RxcYe>)uxcYBw0Cx) zv#T4aR1!0$OhkKoI|_vYYHMrJ)YODn*|s2;&*2jXAApJD#(K#I`FtL=)fs&CD93jpBen{UFYr+yKa zUw(P`j=H)!TzTb>6k~4LqmPw>fBDti+>D?6#euY+1`PM#`ZpLpU4Y}&L5Km6ej@x&8PAfL};%9JTM^kawOg7YsxZC#zmYnjp7+KS6A zy9{^Uc_+4P*@A|K1{`_hk@)WSzKidC`#ZSlrkel&^XJdUlBG)&sZ6_J2=xFf2x^&Z z#1-Ki2BEXP1AqMEAIrp%uVd)2;d)La7d*@4qt6_79M-H^gJ+(325oI^XliPT7EjB! zPg`3%mM&e2S6+DqeSLixJ9aDw*QCJ!g)fLzlkc#y8)@wbx#YF=NKy^wZBkM`tJQ z{L`ISvt|vBKIUl5-g$O-4ABmcwDpMCk;LrHMUmE=UjAn#mEl5u(Jm*8Mcp#njSXYX z-Y9JBg>|5iTe_yvVM89!Q)MR=v064{^E*9)b7EG~Kaj*?u1ZEY>m z>2w*UD`3jR@q-4>fq?;}(`lS|%#nCy)oMKck7qxyKs|MI3ZFl)0h5|j0DwX^k9>Es z`Yba503ZNKL_t)kx{VbFklyq+fQxvIXJSofH+afS6u5|{jjyA>yAuQbePAx4zkdKd z{aJMN51?%zk30yInbB0639oA^MmVHCi5LMd_Z84yVDvJ-@Az9jUqH6ZIxH57`d$(g zSGkI>EHdnxp1JJIWoJ-zAH4~a9!Qkk8L%!lQvFcG`1UC z4I0~aW82nE8r!yQ+i38f=Rfm)NIqol%$=OG_uA{HwWAXh1i0V+0jPxV-RRI2XkrcK zOAliOWRVy(>qNb`*rxa})zsATwqjSMAa=&truq}|e_ehX)@Rj+%|tqfhT{Z2qi!7*(C0GnGZ8w2SE$$Y?1Yj; zH*H2}1P~DsHQx*pfUH+o$5RD5ATa+VlG0k|1NZ5)5Y_0-J8KvIBWV`&T8t5RoeNN= zp6~rbzVbzZ2ahJlD}IJ7Qt$hg7hC7&`&B_(+uBRhe z#a!{ubsy@`Nl8xh!`V_nYb$<7M+cbS7*iLa{>!Mk9k59Q!>;Fns9AN}C4%4`@WH`3 z1;IaVe9^`++|=#GUBDOE4;-Wvl#~o{M{_$KZI3ee27wABBXp% zig|i1rqiF$qu$+VA3;McYA4tTN2?iJVj53K91je5&ilE!{f6_>&Wr>Ja!nf& zyZ*;$3V7eX*X;<+!V>>+ZeU?oU;>}nc&a}hn;EUL(6b`u+eTN~oRh0-g^ktuGN`n= zx`D#ri0Ao(Op=d6JW7a<7!?u=tWu{1L-6y3$!<||3(YZ-T%PxWJ;`k_h9t&fu4HEf znEp&v&0*EPf~n`W1O0aRy{qTHw_Om;gW>yrrqAN_e0{wER5`Ab!USdj)xVvp zcMT?vBuwW_?0)Hbw$<^x;P|hehi|y7VgI{m68r{WMz5!~t$`zfC+`0c<@2R$SEPc^ zZ2}c;y%*y9<>1!NzpYOJFoT(VF)rYFOwTU|ebM(o?*cr5*X#9DJM}|Eq5t)8NCcd+ z10$E0Hkls_HTeYvkiar$Etbm&fkwn}gIbds*C*fW3yb)Q>(bjDE_NG#=v__Boe0s~ z(F6%cj)Q{FplYNHLzz1|DraH#z6nMgj?2DJw2gj$zx=yT%B#_Y{aCwXnCfyOEKg3d zWOm2ANSW@4+J~m*M;;}5{arMhqQ3r$~10^wa)@fv;h)+W7-r3l9RAsn0!7EDR;vqUCQ4y9j;NqFsbDgt>EBBcq$Wle^3Pp^T?Trf6GC1 zE%a#hygp|GoJ@N$5>{4L&yIJ86DlSUk|F|qc6Sp=mmN>GZWj$pwH^kemMPq#>X zp2-@#eUGwy2mdQ{AOECivVzP39lB}D2R7UDvPIdTB8Y(Jj-Ow`NWqFeWq6064$;l5 zF9f;BirEl?Ry^He>=jFlB}`3%D6{bo!S~&GnQwG#2u$71OS+*z>A-;{aw47NyJG~Z zDb~cq#D7%LQu(UvW9Dac$anU}Up+ps`}e5=OQw>nHnd+Ad(gp8svhK+8Kj zbDW-?$@r*)v8t(+*3?K8^FaF5TI?00z4AY;JKo&od=ln-+?UvQ=fB@H)c6tse?%3J zCJet=YudYI_~!c8Z_{lL`TqXi;AXdL_q={;utea2E(%vb$8(S_PdOULKuj6VQ{0|O ziQNPXjfoC|m|=~eZMa|FlMoRSTyse<3HArBUsWZ94jr1l%os*Sio2-R7QH~ruv>qg zd1RFfVE8sK?8}D@}U)DQ6Q+Di% z6G4lD)lRDc0e#MX&w(UUDGX8+s%}If7*yyfP(yBJ%jw?;rqtWvayXbyHW*}PzHNb6 z^?YT(pqXXq6=;BGr-8fr(iDTYV?g*b2wgD-|Y8udU6nMgZ64Hc!w&{ch8s7gvURg;Nb)l2A;1-_)ROemR6&M%}(+5G_N~LlW-~0U> zx&kG|e#zU1yW>&FodC)31PuAd`_-qPmq1LG>n1!+&YPIMybQc^e;7K~mEaU4*t+YM z_pn+0B;M=b_fCHRKGOZe;M|Lnrr(prP0TQ7N-=6IJ8LC6p|z4vZ_rbI#&c+TbdNMcameLeFvrV}EA7oLRm z^l00$jEoCqq9{Iz z2OCEU8yE1*u?t>YsM)$dEc{~mw@32H#k#Pt(?SV0S1dnp*>-gaUuKjdF&Vsau2DsuC8HZ$q^0QYSGuU)285|6SYa6Vew%Ewbj^?7}D0|1*_aI4K z6`arW@%)z$xxn|LL9lc16b(?QdZh*m*fIbTL{vrP!N3ikf)Qo*3w2O{L0VXY5eI40 zncNY)W^F!ox@-hmxaz66tn0xl%}2AJKAh*0n#WUC3`e3!ASc3`axNn^_6+m`ifXP{ZZpUB>eo}R z&56_M%4^ub?k4Hh;$jF;Br7yy6qF1{=jk*+M!~KhUo1P}>m?ajE!D0lFoI2(y3@3Q zJ`x8^x*Ud3%AMuR*_k_r0<7X^jc{J9gt0M2dPYW15L#~=(7uYmY#7u4bGwijXasZr zDwtGN5N*f4zg8JynFKL5YumIy1Ay#kjaWimJq4slyTLH4><@`WhlQ|kqT#{%mERs3T z5D{ZTNtpo!OKBWO=md8+4a%sD%jkrQmY9yG#+xEieRDVffRUSdsskk|;B7;9zo3lO zSfl0p<0>W%tc{ChS*rLf3=(k^wskOqpcNlBIqLK5=o+S*N(tv6!V`-LsVD;+w{cuq`_Op3VTit(7t zh(!0WvV-N#7EWkA6d2c0rlWm7dXCeEKlpe$2g5pl1cnGwUnuHOB3;756Zz6;cre*=d<#sT!2+5G8AKKJ#pOTh7M6>eOtUHcNkDj zp^Cm`ilX@f!EV%f81mPn2Y8V==e;4nZOAi;7!0~Zi80xvOv-1M$+COu-=i)?5l&Ql z*Di+Dt+H>l8pEDqoa7`E6BL+-)qxJ6_<>4=HWEQvtJE_=>80Md_0~b_Jhnx|@XP06 z2y*lDZX^Z7@b!*Hs}mhSs>djjoEK-<^p4QvM7=+4F}1^^@?8t*P`mj1-0zX>6*Bpt z+xzQ{guvq1KfJk_hYGKCB16u_CdB^Jb4S$2UB&N!s!}XwE%doHSrf+O$6a&z@reg+P-Qci6S8ean zymo`?U8m*jVA6+20LVnysz1v149VfJn5F#N*tomZd27pc**wK%=AiT|Tt1soCjilQ zLqPX~LcJOlE|trke06ozZnUf^=oij+Ie|cu&Ii@BvVou;wGZgtj-kcZt!I|rFxX=DDr7O() zX&D)$fuwpY#M&jiK?)Sy@Ks8q@Ki@HV6xeIZ6Q&U!14)SVZ9Nw7a!!fWu>sAF%dp1 zo$LrDIz?}Y4mzam+_Xs~)zK^mJMF?A=~Wt3A-;8xc#VjtWaO{y~1C4{u86>-XRUi*K9xE0g@%^dQ0E^0Q>D( zLJ(tG+{tS!nLmQSww>jzVsKFW9AIMT@lXPKgSJv8+DS`|T(z4Ce7rZDn=f0>>^5p@ z`f6(0P`Utsb91Kujt{(YBj`SffGN{;*fwDac!A4l{WnCuHnBL6CohWJsZ>!ti`TF$0cDqS?QvhnBQ z;sTo_sJy(~)w%*r(Ktr%6wYfmR_uxghAFj;?c;r(X?uPzW*}9GLRb{&<7l0#MESPL zF^m{5sk0t0A(92={(QDt5L9=xVS7^p8Ui^=g^a;aG5)-I33?>Dk!WgsG=*^Yp$_^5 z_BNW?V6i`h&sOq)KCi>o889j>j3P@qWF$0g-Yz54kjlbPHcpj191r2E!-|8FD3x6A zEpBBBJJlcG|A51k?}ww?IM5~y(&_U-BWZnhy&ciZnK`vA$hG`FIDk_YibRf|j80s0d}7VR#P<3^ zZbSox0@-P$pySBcCj~#fC=;aqHZ|=5yl8*p@3lmF#~=u7`v>6YS#ikc18}_RGzu;- zrml~q_T%BfrbwY1TV2N=k*OU`CYjM5QXpb?sa2p>rd??h~kyRP-B8klr743#_Wqrd7afb<5bR;-_*Bmd*>Gy zJHM`UKS`IwbDie`_M$3xiH*tOoj$u+^XOjg5?^@O^9~7kL^E+$*YB%ZP2@9O2rQ$X zyfDR-dTt#g-x)22xR-wSymW0ucoJXzn7rF_9^tZNqw5w5D@b5L3diI@h??N`u7iyz zD!gl&B=lK`AK2o#bMsX}Rn%7x9SnJ`rATT5=fyZ1%vwYNPx5880%?b88CRw*7^A7V z0CXAG-8kCUn&W3I)XopX3Kibb2<) zOYawXW$Whu#81bg$$?U(0=xM*2_8>{Q@AujkU1Pvs_@CY^zo|oMx-N)_p8&}eTm># zS41Ym9Ph`T7~eOQ_P1G?U$(YGuMcOS{f{E9k7rCfpwkYiZvb%G)_j%AvLVUPB=1#} zHD}~rj3DvThARmmob#FC)h=Hj6437udmNLc za#-QituV?9yil(DekwaXIR*CovOViAO3{npy=uo44N6dW4Y00&8C$5WLL!KS`Z^}s z+Iq){aru-i8gR{!rb&$G0L?ZkU%a12KdMOr$~}RP!H(mr8pM&3BN5d;Ogd%F;TO49 z90*IwAi?w>tt@w<4|bvt2SA>jc4I)8qKZl&P%&m@X>mk&vV0V-HS-j^qskIk9Qy5? zT%J_9Y{Yr8dIb<&2Zm6VzudWG<9$^B$nyglQzvIk5CaKagy_LL;A_T z`#GBU0+6*m8=NAJ8tBKGJ=Vaei|=q#q6|e@LyEb`q=ZB=uYX4080mvIumpu4KlnrF zjp2Yerbtq|e^F3tJPvsWV6QQpsvxS;@h(z-&_%}Z@s==yA9yrM>dn~3?2(CG44@A8AFDpM%YulFTN+A5Lto$fgQS$O~| zH;kd?E$`{ydBah5^XsaWVpdsns=aEfIzR_v=(GT4G_MmGeF${Jy}GM)t0>+OyM2HO=w?=iY3B$~f?cQ82O0fA)1 zvHwmkHz__?nF)qSDEm$WG6ATn2s`*kzcr%M#wM?4E^OUU?nSQy1z7$iy>BT^3RG&0_uiABPX>uoiS z&!1Dgr;}lR$q>fc3g8OlF;M8cP?Uc0!i3;Yt_Rn4>L}b`?%!TWyr<2o<&YmFsWJ0< zgH+TBYO z!+N6?8=(05{^QC3;Q8|3Qe>c1B0ICi$`aWk4g62KSodDq zX#RKEcJq2xV+;r#VFO0EEJmWg-0i!;{{1eDU5;RBu{|H~60i=e%;~?oJP;8bAfzM-cORsk8+Gb3e-o zY|f9(2%D#}x$Lg^nO*K_#Weo2kgKb!!+VhZ_-)NltolwAuFCPM!fQmzjr`ItX;OX$ zl(tBc&)ucw9pBF|-vjk+lh+jr6kzHGYgJM|?Ui#9=kor|iBg-83vb4{L$IXV1_2B* z-Y&!lh->6GnghIJY^w$_Cv935=NRs-#y8&h2eg~W0Y$x54W7$fo>7Y%@jlm|lZDo1 zK(R>J~{P&8(LT&GlYaGp^b|I72>m0Vv7sy;k>yEY7E5@muzaxhF zWeJvE;#CSsdnOsv)szif4L6#rFyIE_6YDFow{byuzoA3&na=R^oS25sM&%u*Q3}Y| zZM!+lx+uQ(eQp$0ly{#LjzgqR~g*X*Q~%X5+cnxL5OIT^e&fFV}yJSjJWa z26?=m`XA;N_qm3QSOhP^3xb7StmWW$FI1ER|4DKm{;A zK0f}Y3Sh=Ck}OhoI~hm;wICgVcVFj;)NT>C8P05a8Vt^l%uLF)teu>mB9KMQX6E}9 zt0E$BIL;(&;=MfEp(W9daBy%me_oB*9qC{7b-gkW#}v3f*J6Z|<3zfUj2AVS1w@S2 zoHy<;!qp9wAkPFBp(0rc(#5;7OJv_kw|uF_s8^$k;z=0h5q<4|l8L^Zk_V%C@`w8k z6V!_YQX(wdmc`(^kNAmrA}%MS38_Ry&l_es!fE>7L7SH(LZ8&@Et8y^*V*}&iMd#< z8F?_45^B3;KSU%}M|v?`MeD+9iIo+3!p35}LPW1o6YvycvRbw+#nYT{hA}!iqB12t zOby3&M4lHpNNUV=6qvKDnfuV=!Q-UGr4~^NJ)J&u4R9yKF8_L3qDT!-*tfG{g2a-V z&8#!68o1+Y-s!aIHSQo-Y{OeQk46mJ^SYPaHCcx8 zJLuv?nG>el8)3)|%YDBq+B_!|cGOXnD04TO{{BW|$2ZieEdY6tBc&mp#j*LPGE$S- zY7`1e#h=yUdy=B8vcY?!3^{yb+ zT>6#vx2=s}zz7}S|4M-y-?yp*m{_lG%Nw58AW?T79tf_3jbnPV+b#k|Fb65faLs^^ z0v+!0$q77JH)%KkCFYlw@~VpwUNoe!&(dUJ08dlX)}1Hc$9?_hZ8$7g2r5Cqp~J0I zi3-^XIWSA`uOeAYftfI130prd+-8Kti>%IMFJvI$peVR*rJ=9lV*?g)0zH1{N!(% z7%qYgKP$WAB#2KsKECKXp_@%+;!T>YfI`F0F|A)yJMOGAoe$FhYld=&88yin`M?l@ z3m5hwoFswqXd$|@PAjI7)KNfE5he!ft_SoJ8R8Y8SgoQo5>_=Xvqoi3EgjcBN>OG4 zo~U|D)hh4ceF#kcT_LGTvPQ3Dt*Pau1?X`b+^esPgLCzg;$Y4|1#giOI>fnj9+%s5 z|7Rgv8Jp&lC?Uo)E*pi4S}ohpevze%yE>2CS>M$3<;6>Cs;sqj)!h!p zfxFVzk%H59B}A1zxbYFi$=TI-@xF}f@LFVMS+OSiPuhQuk?d?@K)>R;u;9rO7ZHJE zO^Y(}gl4P-wi(}Jzo6Z}jmWKrgTBxQ4wre!c@tIxGu0wCz0g@dZaj-mvip;ng$`bc zxGHwGmkK%~-Lm0B+WS-^GKKxqVGE8w-L3v2Yv|OzbYD&l@a_eG5d>b#!cM`oqXO%C z$nlzn|2zc9%pn?+llvhN+C#bpUfF*_})$VEhU~WNHSxb6F|6 zmy58Ap0G5HGpb}coXClBzjFmq6w`hyqw? z-Bf1H)uQ9QpxO>0i$f9VQ$69|VVSfY(b$qq_60G*<-1c$MtF$KmAmvR~9Y+0hn z6bk#Uho>hH9XLDIXJG>zTY&LHKh8oOfFYe9K5sYK1Iw#*?-X%vVQ?xm@2FWXF;g@#JZ_NK9u$^7wT1e6o$sLYqaJrRdW91ER20s(e`!VD2veWm| zr*Tx{3-g6>2_rg{;z0*Dm%X5WDb(}u=XywP-l`g~AGBIz3`Hu7(~2=bkAu4PcDUjO z5IHx18!NY@33YGq&p^-(ru0DOIwYmKs0wj~i-} zn1gb+2jAVXus8Tj0c*4rDghe-T9%L(2I!i8{l4lRt5`BBAu3M7su}BHxt1!sA5~Q& z+w(tw@XaATxqo{ek&-il=lxm+HG17(sh9L6xl-1}`N$fA&Qc*` zm?sEZC7Cg5uR;&oM6{7uE$Zu@K_zCsNAxgoK`vq0TT{3RA<#s313?_DeazLW+F%$t zp#)G*V~q8uMyr`vi6&@iaZlGItug*i<w_Fi(F+B?&3R9D)SX)9k>xxX7Zv zVdvm*ZzH}kXqF{EzPgeC?1has8xhIL$#y>b6>kLi_%KB-DOlzepu>iT=Q;i-AJWJ5 z&n~?Lny9|xIEwD^(lTJ!GtLqrCFka4p{}%)5E#~`r%9PSOh!GDoa?qor@hsM=n=mTF_ruLC%`r+s;LFL@#$f7VzHl) z?(92o1D<|mTo+i-K1{RUZpERb1FexpRp28XGd*{ibYG(9wMhUKvIM0go zR{nJ+E!7z-TU1rs*A^!v_?=ihyJgCgf=IPjy>pZvO=vHN*J(TFNG1QxstbYqNsU^x zuN7Z2DI!wGu+3B{$pi%HM9idFmzFNoxogRV|>RqzIvx=@ZtQh<(1C}0C4ty zkCpFplzu#?1G9X#j2Zml=_$or^u|tsHuYfmbEQzLOdH`b46u8^UX;d6J;zdyr?YSbVb7f;`f2?s3%%Zhr)QG_rBpZ0hzRY(=MnxqTc>bA%@mGs zYyOi^e195;af9Gsj7%Mu`TpDwl?gjr4~Bn!7v>(a$^w68$2rd6(3^qJ^)J@})R-_*4STi@DZhcJ&H$n^iW6Fsafimq};wVJFK7ww2ccy$#|t7 z-?H_$7wAjt(?Bg@na6u+M8zp`kk&Z9f&X%G|IA_|l~UP9rT?Y)QMI%Dt9mp)(6oDA zt+6e}C3*ByZg5a|eAA#hD?ve$?JVFkB6tHnr3!%*5`xg$k7&eZF1=1*Av)ix8L5Pr zOzGqo-;XTP0zyPEECwnPGx59Yyk(0}3sML@&3Y6oJ?$F$`|W;coHf9IdVF@)*WE32 z{ABFgIm-aVQb3@a--K!!orS397o(dM5dRgNZGv5_jCLq&Bp%9AG{$ZPQ* zj4FJ*A1o_EIHb@_ec159XhfEB3L`}>Qd%wS^A7X$@`Et61c9dq7tR$iN^P*z{yM_9 z)>2pA+yMXn@x)*?ZtmCx=b2`>T&$deBR!GS+d9z6c@#m}%;B6;N;~9}q)%jUggbLW zEn04LEDBv8dVB*CO5UHTbV*s_T$wE2M@}U}3(|#Gisv}&%5mvB2tyhJ#4j*}{iFfm zMPL7Psi>94bNQp=OHPhBo)2m6=^^#4+vlose#veh$C0{Ae$tjjsR#%(y*cwfE#_3I z)5vs0O4PaSK&3-dZ|F74Gxv`fy|89Y6Rpe)I-Fbu=UBi45@-#8#c63--XTnX8ysJWdy9`V zdYU}JUqI|OmKjt$&f{}OxZ*T+V4fTvZ|Vm`1y{OD^ZMa>SV$t{1FJ`+I=>rHxitMIR@rf^w5NR&W##CbOf~2;pf#lpim zmotKyY&I4KvhoNPqfwtj-25+oP}w+McImbg3AjmjzQ*i6p^HzKH~rVCw4J*~YBF$B zjy_5^Od%uL%8*wws>M{N6Zu>|Hu%N6i3r(R%pPJyC^fgbvB6pW3=tC%7$xlPuM(>u zEznLP4Ce7q;h8)eC=pj-*M@pJ8Fs}F%X};lnle<<%IHF4#Xdp&3c+w}`7mxBix>51 z(p2PQF}bP-MMbY1&TogXE1tMoauC$ z^oPIBPP-%K`l8=be78c*0PuAMX9+2dSOge|-JU^1H^+Ml-i58%s;rtkQ)(9dd-j0p z5n#m9{K!WM0mn;l9HI9^+&pT6Uj#6(ti@S9;G#94W;#C&(s_#CzuDnlEjzU*L%cNwUvH zWveb~sRfszdOa4xmN%zfz1nJK_RofDN9KSoov?fJG}W9aF$yn4eo zJ3BjHaovDXJ<7%ic&dbwIsS{ zJck{D=7@~*z8fkcuH#M(241MY+6uP6&T+`|;o?dv)GWx1m|2y?GA=Q^hUMe(zf9!G zK@ti7#3+RSyaL^Fb^2)aI(K6A7#+p(6R~2R*q2f7!s0ndu%AB!<(h3A$=C5)q_-!Pe~1pt(hICY_n5Ldx$I}lh?=fxpo1uC zvd-f!Gbt!C#v?h)q-}z{0s}pM#3cMuTP=9wXiE6E97k)bXYF~J`Sgo|ke;v~QI!0} zSv=62)V`IKfPf!CWnBel>OlU(DKR-`m>V}j;Gt4|<;MZn#Z)ht?HOgS&pHAo%Yuat zms4$cYgtf(!uxUQaF*j2?rAG`$dzHoJo4h4Yn|2YO|EZPwjpMN-uNp8CBI39bS0|| z{V{M)Pz@3FAllwg?}cZxan+udmH5gB6LanPw6!?{nG`jL419YElNV|1@cj zfesR}j=#o0W_2{YQ$cs4!#PMIL^|=D-is?JJ==$HCY-LSa;Ak>hVSEoi?vcwpzc_G zB+7=mva-tJE|LL8Nd~=eUQL9@wEdZIO8~K}xe3cVp2}WApPSVFhScS6v!PzFI z=ez}WNRQenvoVEq>r6@pv~|p>Y#qzEvNsMW6ITS9hbW&J3^w(c<8tzP+;mLw^3- zgStnTSkC+n4Z}em?mzVgCE4&!&Eb~ft1*B$m&TTra_mg$)u=x+9$a`pp_y6{eDoA@ zB9=_hS%tf7tW%Kb-z?J>DtzvqKU6qVj695ZQL<+e)&}X@9p_mr#~nO#Np%_Q^8i<@ zh~}xtNKxDO<8ERxpY)W}Rn-D_JYZv3i;?VnrZNx0bFcEQqL*Gbz>DV^Lo*oW=B0nK z6E7}urta8FN;#`aKLnSGYXP3GcPu}n=@8?5nwT~S9+>IaM{f>a;Yy2+94V`LKWU*d zs$0kS2C?u-OB&lp=~yd}Vp|#^{xYppBsz)({~co-Nz#x2eUhl}FyAj*_3#y{&{1N* z&o3>I;b2a1_pFr6WFAXOgnNH?JhmLJo~SGT5&W2hkPKsUCx=EPT^tlWOji^xwftD? zZ^tJMDbIfeJ}Apc(Na%dt~G@v?V4cp6d-pD7Yojhmq}~z8J{C_1wqAoFm&PBH1*W8a zb=LCBRAD29sA`Jm4Z{trNFgB+;|GQ&lKK9&=f)wD#EBBns0A-LY9T$$8%gS*_@5E< z#E%wY-_c}3d*YO|T9FI3C?;(TxWeKFTO_B@t}KIHmCm=O z&dl{lr10<`zMj!+R(%5%S-(216uJ1=X*K7OJ(;V6nFpyf`$UzOKU2`_=qL=aE2NeIr(nJ9iPYI zVXsHaIX*EqX4(c$dYGqJqC5d2^-o!l#>c~Xk|}LFDE$)uy)@o{C>Gi0 zd^v&cgplxn8J|Mu$r zG!^@0y!tmb_ID)lo^?amuuvAC)3OpTCL{8=OTPWW(Dg;lv+B6|Ib+hHFg^H=b*aVy zRdMH@sd~2@koM11TRL!b^xGG{*)ptCORHL+K58J4Xn2=g1*j-PsfTg41lO41Q1}D{ zK-48}>>!bNea#t8TU+bq+L*!aO(~~a_}^vlsjLMT3Bwlq1Hixtnwy`qn$wunYgX#i zUyAS_;qg0gMe{kK5B?zz25JkLNJwsRtGEuV!-46AC9c$$wc(=VAjkYw@;I@`R;Fc5 zMXHBsbT8h(MRaxF>XBIgH@RldJutCH49M>I zXn$_YariU60bzA5Np;()s@W(a=*HRy>CA((Pke9ayFSi>s|oz{A6%NQ)IK zOD&Qz-=k-xryujWs`Z~>DBp{qgW}jim@X03otb5x2WVY2)gN{)LMN&SIb3eOjG5nQ zl&@{9AqMz(HB5%dNI!GbuIGKJ9c!fCaadpb_OTeI!Ds!yZ0ArxE7p0*_mQ4eqqe7v z6`t#v49O?a>?JX_yeD{|TBL6{UU_-CP^8)#Z~nyEC>Ao(jDI(*^U>&j^8EXPlSHouX+ExpA@?#*$$&me<2G}H{f=tkI24Ukd3l(T>ds~ zBlgGam3yIQUXfmv;v7|3>nIzgcJ!xzSXQElBf{-IUD_1VmY@OJALe3rDE!k?nBXa3 zCBKgG@&FU049p7WPMV5z*noM6L+<xN1$n3&s)lq8?Vj zrCUIf5(5Z1;LgqmxsjiE2*qudB;%YE@)#@YMp$YKp%hn+Z_4iMp6T4P8Dk_c#`EQn zdDJ1q)RibYZZuV;wW9@_bIdsrwqMNBDXuh9B3Z>bFiXYYgLF=g6EuIbIOK`3CYY9a z^j@!Mxoy*kyc~|=%~v=VUvT(E5c6Itj*pB{_G@nJHEkeqPbXoBy4=u<5R;ZT8kQ4& z)fgZ5mL$fr*1p2Y+l`uG!%-i-F==04rWQMLiXh&?kn6jg%Ej1s8NqT9=qy*l#@R2k zpON&meTGG*I+bp@MSh}JIJ1` z(RwZVGFvZ-Xd$X~760lhu;Gb*H~ahh+a0oKq$nqhAf>wnsOKqyp&O1LD;=L+_T19s zd?@z(_PpRhl_2&YwX~AX&l3qj5-a8@$fb_Il@cD3HUf{`=|&G5;j%_Rq!^a1%Ti{8 zn=MNG`eQgaumJV(z2iK3xr@>QL$k1jcIM*OWWll~Sy`Tg5#qANrdingMo@C|k_v;7 zTOLOnb9G|%N=_`{@W427B|aowUE9#gqLL)(f}BQ&$t=TTc89VEA-hkeNDw0jAp4SPp5c6H^Mh%6H{;94j7y%3Uw~B zo`*ULCU=Sc?X#aI21?Z+wLBXyqFOtk z@5ro!Fvi%YX0M!<;M!$o$Ky;Pt&)>5Nx`UuDHx=G5*$>jqAtI5h9zRAW_HCyU3gUr z%KSx3FEL9?T&dSKehc_poW9PH1ZmplK4nG?y~GsS+^Z*pg@qRYZ^bIKjX8Lp^F6pu z#9!Ja?RrP;n{sR(jg0-@=WoVIuF>#Q=Mg#_zPA&D8mF*ay)L!ZcvOd$IK>C3nyP+O z|55{_eASsqkTQ{6lHEZNN*`hMUAaAPQ&q8Y`L)DVgeOPa@ePye>Ukvib|;6|8q(uTX7}!s~cfw1pThh(d z*GWu8kcKF5Sq9wDdwmTcaRRYoBnxYxm%j+j-%I1M=M%8s_DN+nWB0?TYOSv3ObkIM z`$>CPSD#r8kvg~V`jLga(yuz|fE?we%yX-0VtR(YZY~xrA`ow{ScAdHWaWS^f`-tfAKbJ~X!%pVv|Z z{*acU;%4PZ=B^%L{Mjh0``ajnnmQvuioVFo%HDivVwDnZg>b0iPg#DTuw*LQ60e!9 z=q;Z{It3Gme>VD0VF%lCyoao10ix5TlRjF2M))_$3mPL-ueOFd5S_nNU7D+gQC9psdV^ysMv z;`I5d3@t2(nZJwr{d@o>_V`|voLp{1txcX0+7(YgbKhVwua#_OgKoiSQRquT4Bs|u z{qlJha~r%LS*vVx^`Fq4ovY*h7HIXJh~hUZZV4mLQ{S(G#b1` z<4kVgp`^aFmTTx!0B-R>(1{MX@a7aUtgMy(*)1q_C>;d%WtMWwOSGG0wKLP{wqbG0 zD1>1Fm)#g*GY=TV=%@Nx#)Dj(Ky zFzkcu6~1LctlHr~#{`U=^ouZrn59-65%QwJ%wJJ4NOLJH&(dlYHS?GJ$$tV?RUKP% zg=F7JOIJ3WC!ad{>YwyHkUK|x+VjAOYBe_WDE zr&O<81#j13Jpi-E$Tjs}Z$I_B-h4l#-yccd4As=U-;7DhK3_>b0$)7^UyQes z(41wiy?`MzWblRzZh&D+O>NKD)x||m|KH&E)1(xVh4&P_^1Hjc*7o+wrY(1!uGh0J zrO&y~$FT=npMP5)<_toVXIEZ_a}Nr>A0!Lr0yiFN9ktjVfD`-dZTH79V5#AgK?bxc zUPCZp_`cB^iMJjkd4ZY-huFx#nlroW%;9w`)^I%$$+%;D+m#Bn%!Xn`)65 z+_(3uq@qE&vGV2|1nQtVBT_;nmTe#0-s1K!DEbC-O<3>z0BiMjxsaBUzMe~))X~=? z)aE6qMyxrxLDj+K4B3D5wpTU54b2%P5IeG2ifgUn*2X?fiVoh)Z7V0W%L;K{CE`c# z>#3Vn-$y`g$;b6gK1`Ml>iSDr*-cbaJy}zqyG$Rm@+s9^%Z{tHfe^d`IicN~V8Uk` z<yYi;K8Rp{-WD^WNbNuUv%4Jsu_dIj8l<+i^6)*iC1yh?!VSXQg!k-V;s z4%UbVVADATMgmm=k+QZ+J-x+)fdS$>Z)azJqzXGyFggyAAnvW__9}eZ zN_`WVK+$&UGz$yu#a-cM9xi@9KANA}u~%7C^uMN){G~D-wPHMzFKYBUa|ONs2kAf- zzlj4&Fp0BQylJOj!;70S(>RMsS}w~Ngr-8%*+@098mLKTrWsd5HPdSrbF9gyKQL<7Ede2sph4JAW`_U-k@#vQL{OTYYvdxaHLU<{|!^e z$CzaDYPYP3cHQ(t-ue8$`1~&cWnF1b6{?LeK6?Ip!!TEoYWkm`h3s5&cyeH;+19B2 z(NPeij>Cnkr#q)QJG-+(XD>f`SfBj(i$nL%zVfwt`|;!Y_ka8+^{v19>w0kirF#FX zuiSdz1K203$B!S^!?{FFo(rbmWZkyZ=c8sM_ z&~V{jVlLbB4LORj!O(oq@yN{~!zzbs?>d(Rd^ZokFxE-53Fa;MB50t8t(o8uZP(PS zvUJdsg#dC{Acdo6d_~s}$aI3a5z#$H4z`@mxAl3HAc&*u3TbY_2_`RuQ3L3X+>Fl) zvmeU4&u04RKRf9_2~DOrIg2vJskRdvLek9n#^3q;FaC>PGI$J*ovU5R)aB~33~7Zk z99(crZ>feu-?3`fkbW3A`aXT>XUWdIO+u$SyK`qR9Ct4->eH`(ydFMyslN4Be_e0B z^>%&b>))s^|LLFC)2GksgYW;oy1cx2&-Zz=;(7Y?X+3-PZ22$A_c%K{t0zyM)LU=8 z)&Bg|)m5FHoz=y~h5gLCckk9mUi)x;{hQya-}<+||F=?nUi;wt>%aZ^|FZs@|LW)J z;r$m{r&nHirCxpY`|9k@S=*sZRyO*aWS3@IpV%8R#mv>;&s62NA_0t)*?lr&7oX-q zHbG_;MWuDMjPH?bF!Ts6-cr(3h-t|r1P%65b?5V+|NJjCA2zNR z9X0*EFK)LkaP(-Cw;?C2hRZ`Q(4a!kof3k$phl6HmFRkaold7ZJ3HG8(CKul*FW~r zdhJ6Ws3%uf^|fz&tKNM3?fS$2@W=J_Z~kSSo!zPTzwg!e+y!BCe7I#=+V($3f8D!x zZ~yaK@wvFTsH>+>>;L-IFVxd#|LM`-K-Euu?nmmM{lY)4pZ%#Hud}nWIzKJNDC5U1(P znVsL|H1VGQ-R${-#N-A$W#4V|a5NU0DX%lW*ti3o6%hM_$vbYMVju($INF9ORyIUu zr_%y0i%%pMx;w%M=}q=^4FUw_Kfq~eK5;~v3y? zQvc8Y`~TH9zV(;&o4@x5^~FE_a{bJYeXjoAPkgRE_4>zm=*C_P-g*3=7Et$r_kCae+~5D{`iFo2XX=$l4|kaF(Zh%J(v8yt1qaC~S7H3beRnM0 z?&qSgYQS3y?@;qjPNO_BM1JV*U6-;C*+4t=sg%}6nZ1Eyh9&p@@3pzoQ&MD_$i0_9 zE9%nFoT<%)KqBWgK(9Gg3fY0f#z+^%`}gZwMkZw0h+=&XD&)se#-1E-kYW)TUDWS4 z%!+1BBn3zvoimyO^0TK549I&$B{l5_H%GyxfmZ^bYKwARb>KLzWDXbBZ-VGeGe@Kr zDVT@_`TXl0s$$Sodj1r3RnZ1e$}JLi2_KBil1QJiZu#S$QQOxz+fyNPXV~xpuBCA( z23dzWr2!T!p%E0vjEcW_1^OTbri}cMC+Pqe%(hwC6AZeeoi#TT&-%K(=+VP^ z@ZjMKn2!TIO@%1RSZnq_tx;Lbth%}Oh(#s?PT0F;IjCI#J;6Z9WmB8_GRv8?0;M9F4>!bBb!&Uz=T3=<-m|qaEC+eT3G4xQ=*&aP z4FJ*N=T^_<;@-A#305DC;Uc9Gpdh#BSo&KKl^Yi-Lr$13Y`_n&BKl!;Ismq&P(&go4J$Ue-9^8MhNM(5y z=|m5b0B+>#_;*} z=~)igS|4DW$QD#9;lR%zyUr?OtjW;+g=y!a5qdD6i zHXW;l%~OM&eWS{zGpt7A3LQJ&rBfvK)#^UX@P@IpELgW3PRHLrmtZ(863=H*H>wo#>|D*op z|N6fl?s~T0|Nd8BsUQ9HC+jCZ`Yl;QoJ%fC)hwEUERo?zz3v)y z&uRfON-3`Bez=#CF5%qpoJK^O%mIJ zC=UAg44lkk!_lA}j@4WI%&i$=uOXAiphT-A)v3!3s+GxeG}NVyy~{g}2c!`ibI}05 z9BE>rW5#h0?!HtDXSD{(#wDE5nIE)SE9D;QW)gejjW-ti5Ir+w_vB%UIERC%x>L0u z@Gc59eGn$*4Cd&CR^SlvVjSq;HCXTT-@OXp+8aH;W<3|-=XTIPd-klp^7U`l?|<=2 z^~FE>lltYCT};C=wb$NMrG4+yW8A4(X_t`CM zV%ku`h{+pJv;BG4>ol=Ujh0HI<|lSinI}no1|n^DMFUr}WxAEXMrTnXlG%LvfOUYm z|Hv~VH3yvVt8_&eBLODsm*x7IOJ*`F7h^wEBQuHv(P0rQc+83-hkBcb<^&QkxB$F; z`kN-BHaPUjNrtfnfhrM-;-L_`A3DQgG@&i=^`kW=M@|G~W9RN(-drdA5A_IbZ31Wn zm_8M zfBdI^UVrwLuhw6E`#bgSlP7yII-T$$knQf>y1clkM-T4TD=$B)2lwyS-OI~5-Fe}> z@aCIu*Vn%J&HC!szfo_$^Vn|K>2#{QmlyTw%P-f*KJwxEp^tsEKJoD%sE>U3gLU`v za)(Fm+__Wt?%k_<_wLo*yO%E}9Zb1Q0|a>>5FOJ;?K)xf!6KSMsD|OUH$PbHL{#-= zB1Ntg^>t`%D1~rpIQE4)oH04XeRdK=A8L;OdJpd%-y!fQE3B#=c>Qo|5kFK`R6FnE zuvX~O$q7iCnmBZDu-i1~Z}*Pthql@QQT`icU9o-60V1s2>CqXH4K1APcHDO82(r_a z3xoOSQ`NGaDPhHFGhmeZDA0>=8TLp=Q&3pstiR8kB#e{o6fKgG?2LxOhgsY3Uh(;#nY z@SpR#uAg1k(`POw-44&E&z{wH-h8XR{>^XISHJPi`s&xeSzrIwU)Gy%yZ+bSzur?;)3Fz)(~ClN=T2RmpVuodKdOiK@7IUk|Gs+dLm#NuKKOz9&;o!?uQcKgo_3W8nVTttTjoKe9O$45>uayV@b)Un;o zFj+A*H8P#3OR-Xp2VrWXI}^kAjIJ6-K4l9ef<=4;%qWW~9{IS%0ZU!ZA5D5OQQCLQ zZlB_EPR<81a+)X)EjdWB<2X_EYmzXeEvS6cF1ArAaW+kq}Hk; zuj}gSMFD#D>{&g3{=BZQukFBpetlg}pFXRrr&smuzj?EsTwT?ZtE+nZoyYagqL0=jZ2j|K7d2fB#-xUR>1W#d*E*=uurjKK9B-^rY> zT;4lFl5^)g?q8BwCB~{_*Ud--W#6wP6g8Q8#y(`(-9U;{nWlwD#hil$kWCrN24&yh z$<&tRgh!AeJJG|nNW)$x=-UdRGAXX6rCRj->+)!lY*I9UYy0zOW)!#a!3BQML0cF7 zskCTk+pcRUr`e({cEl}Lpb~~6nC@}j4ixjqNQ;n#xg#FBt;A4B>@7;zUCv`lI=z@Q zF7MW}>*vMm>w5nDSv`HaiqW0ZsZJN?b$M}K5AWaqo{T|lDgt&5(8a|?ou8f8`NdhC zot@w8i@InKiN6RlgY35PB!XJs5jtj}(0?X-6ZhisErt@H^IGTOXoi*AVTCUk^zcB% zw4G3`FH{M$d@i@9@0~g|5t0yLpb|Kgp@pFJ&f#e}S+O%={iWV9`7OyR^MvJK&jOKf zQrlHI@7hF*`}YZx&Y*W=$`Mk!d&F$)$Jk`Y6X!a@z!R}w$V1mA=8e`*ceT?ZO@qT| z@Lj@SY_>KXzD(M&Nl+@N%c|v)&tUqiU2G~-TCN5goqL7xA!-(@3s*a_q+`g&NQ6(y z`_K}Fr&x71t-(qTgdMio9=5c$8Adsb_<}HVfMC4W0Mkf_T|#hN_&vcovA=ASeM*|} zfdS2Eal>sUDWXBZ5&@pwIaS@cQ|IUBb@v{M*Ds*8=g*(l^XunzEl}I@=g)7|`A?$r7D3p=2*J9ny1C+o`6h}GgZ1ixPzD5uEp<3D0ykM(kEqXHz{QBLa> z#kgO8S9(%yR&EREB96JrYO`W~Tx=Q_%iPIOPTTjye-QR7u143#hkM8!CTQk}Xi$D| zt)CT{2$}-ALxW{j_f1ci<;8LqTo*@RphVLT=`k2i7ySbxOmb})KdJMf5PBp(X%Y%c zzq@^JvOV_}&+gAk^F(bTVxRgHp{hn6X?{Sh&>AJ3Jua@jC6XR((+}9MB{?*fxJlB* zWX4f6lw%uZWa!`$9;X{P_3EQr3)y5EO4zgNKuoJ~5IokqNGCjJ4`YF@=;~AJf+q-_ z!H#NlZEq@!ut3K<^sv+pNSf^z>5^4FZLqPZCPVRN-MSZ$v$J!vG;!F`IpxOMvws~d zzHkG`v#mu+iHOni)dk=7;3~xVM^Q?5x8gL%RQNJ&l=l6YHVvTf32pHTx6KiV#hvK6 zYtlTNEk1wy%yGQA$BInNF>%u&qU)Q_e?2|_ozgb$S75{5p2_W>bi4l03C0(`3Z0Ek zC(NfsR?w7bYIG?LhFz-i_X7(ZR-_-VniR@`mBE;DYxv(3HSe~@->rJKBDyhl$4vBf zzIBj*6;c)x7h?!-bI-WR6{Gs@(waEUB8oH4t{&{1v+1jpTteT?Q|^(%n#9P4oUDZ0 zyDj0~_x8Xes!lFiX8VJ9FFd*&L)Gf%_DD=;@-mlQ9MDA@$Nk{Q3z;^CNJSFEqOJ+R zhu`DTwENvfyo@9BC`4pOcJSz9HEucHb;8U}8EFA;(b8S@ZU*iOIZ%y3&;zTOi_GD0 zCe0&?`*g&}HI@h57I%ZDV^4W}LDryzdvRwpaXcW^k=jiet7o_k|1zIx{r{-`|FH=t zDW7jUC{i;5&Q1dbgX@f`RYR09on2*bcUoZ!;YICO$Yf}3*VgTPiWTjqyn9I~kX#x0 z>TL&?bnKO9EzgrdNjk+{zqpo+2b^rQZ~aGV;OSFO9zhsDr}E`}EzOML)|$SWHXG)n zRx&x$EpV75miRm_{)dP5$-Q0^t{-90l}Yz~h#N+G9w{yg2sDGuLXCA|(Q~^c#~uT2 z${KLg0sdfh*H~s+A=3{k8Cjamp59y?Z`Nlc1$PKUd`zg!H<|kIpq)ildI$PyGg4*s zvXbp-xC8e+nxv{T4;c81I)0Y*nz0jxcUJ%)ivwefuGKW;v?WS)8&6Zbq1ShZGhwt8ccC@0_P7MI4ZnmE^^4QK&&C9u9eTc?(_&}_YX5K^Z0QgCPnW{n7j@_)~kr%~A@2UgvekC?aO z+THG5pO3R^zK-g{wf8AK=mVe61uHVOaa>&Uc$ehQll&gWG|5n2q$?J^gRAaqt6fe` zNUZEGWv>LZ;IOR-I&Bx@3wN-A@VyKCfZj2CGCJB-MD%l%bm{M9tG{3rnJ#3}&!*f)R5&z5>BD1|R3EYZF%Q;x6sKY>mzn$^LVOLxf!Fd!BM03E& zc|lB7!Qp$Ck{Blcw3|Yy1$VDL@>ygmU=+Sm#v9`d8P)~+)X%y9v1c9n-1np*8(%bm zHuk6uwaMTomVIs(z1P@{0eFZ!nd2Tg@OI$m(^g#A#eUu>-$dF>URjLb2nIZYMq{jf z)P+3ds}o=&AIx7ex^WEf5GnVZe$5APn-aOZ{GkvF(y;wOr(h_UXOp5W3VE{|4#UI4 zE^V7E8PENi3O87Z3QtDSwdJC(06qAOe!m)bCE7(A!{<7FS3FE{P1bY}qDLkSL^*KT zM3HIb;oWI}j?~bx!Hw+h&|Y9EDW%HdLDOTk?>dgoH9&r{u(jtT>9ygUFgO1& z+hx3%=Js8iJYV{p_6~?X6H~kCf#nqwwV8|RbEx0Ln5{ejrs;<>g4Vsi)6SJBo0?KX zv3?7D=3KjMc8LFo_NddN%fKI4jOnj)Zd4*$5$5v_V#P1_eXZ zfxOFf4F1<9Ck;fkxI)9!7!KzMkP5von#iKsydXAC4OWd<4bTZiOK{2_O4wXW(I|pS z$HGAADX}Md!BR%TTJ*T;Z8xKbULwL7dOp<~bolHjoey!vK=djV3)hJ;&5_YWtFLBA z%H$FZolRs+u%|3IA@`Y6QsfTI~<51hMlw+E>eSbjLzbUDJ zGU+)UF@(nnkr8WRQ?v5Foy@W!Gr4 zQD`|b9%t>gU=*y60`a3wHZU34#%x?Rg_MNlt+4de&+7f``srJ)Rk9c{FLWFN95{6c zlbW#@Q4WtEHDMfPgbc8YERz;c2iRH1U~cK;uHmSsI?4)Zw+D{@9bEk0s!F#tqYno2 zaTp(I5v+75Z~)`|0wUOGe!y&yN*z!z6^EZdd$eVqPcT)T;<Q}-EK zZ!01OIZbep*q*DdgSK>_O^b+~lCs?pf`LX2)&0o^oxn@z##%b^1S5{_5gh&rn2R?- zWTSLWmdPZ&Xz8^ggK5QESeQVsOw4IMPKRWRJlxlQXzJG(luFS%FfC<(5vpaMTI;DZyI_YOr%bGyG+B?L~ z2})R2nTAIc;=v5po9&|wFZx6?2BcH2+baAK+8m3*YQ$Vl`=#yd0i!7nrd#HRvZDY~ zv(u)LUF)+E4$5H;yFuhkb--Xt!8{OYc%%tMcfqPmdB%>LoDX^MfCv=FNIkWsuXb!` z=(5r~I7Go(eI;#FS&Z~JQl1di$ihwX4vZ!!z;O6Lan(s|rcrQ%!;L;%|wXaD(N zAAZc?itup~x$@S-RGC4wLtG4!!(xevpN41=+N7eLZTsGRH=&c!9#q(Up2tMT@wf?Q z8i)N6ClW&Q){=wzW=F%~t~FDLE&Fr?L|mLwIT2(5UtW_A{gt5}31Rwfv3qXECxm`R zjbf-Ky3BoLl0Q4GTEfv-vV&$%jtxkb7#1|C=Er5?srwSTV{}$4GPwtA4GqO{9GrSn7ZjU-o5P-tiWN22yE42{pxD!Xv)ErUf6>wR zvV*k_$AQ{~fys#2tW?lv@7OjdlR?>3G$zSjk8}@3v~Cq`Qc@NdoYpoaN*;DY>(4J- z^+u*>yXme)s;wqal>efsVQ5bJgM&7eqf4c`x?dAs*Jhc>2N9#PR_XS#ZdZ8(>ZUi$S z$hb!EY!O8FnRstIt6FyqtLDv0BiJ6cn9SW)iqxkTBKZ1bXsXKfFsVETXt+BnRQuJL zUzjAJgQ`ApWj66C_r-mYR@0|V2#7wVHZZb3Cp+7yCQ3L&m|1Na=1!KGE!}wtB`^34 zOeWagh6}>1Sg!jKKbTq0xVKFW(?pd^bFTlx5zJEu&Ij3;P^&7NbBJl4 zu1n&kW4+&|U3u1>=`%c4$$xVpF{QBY)6h0O!BbnA!w$>#U}#b+_~AQPumBX-6gts> z9R<>ZeK&~+Q9h!P@IoT@TP$y;1O)_sNSWR{*L#d#ERj+a9fSFU$y($P_vlyv}KIn%P5U4uhX_A744IxN@c zB@9l3!M2aNqQcP(S@+kGvx8kHs!Y4F+22T!5Qh=B-=~bR7JMz&x@@O5Se7`u(MTdR z!bz12vR&&Hv~}=s;x4n(a`LsVlKn9AfF37Pv)8~zpf96S$GJq9%Q=N+%D)r|NQyzFjjVt6)X90zt*e<6oss5mY+IXFHHye6=J!?)#pWxVguNxK~`cj*|es3VA*)Y+5kL@XA z2aCRlYZC^CnD43CfO)l5B}05$k~6#w+wMBLQq|A-@BoFPN!*8-QC%RqGO7Kg8XNX~= zi_6TA!O!01O6=s2o&~Ry#=xLqaGWx+LLdQ8$iz6!VH&vyc*dNBYcNw*uf68o$8NEs zmM~F-H&_F@RqehlJ588T{1~}1_OhUwdOzm3?8s4Iq!Nn z=+_jE7E37e_A(Zpt1(Rfg78^OrW%(4jqZIYEJ`FBbvODPywR9&IE@xgdbXGzwz^NS z##{=lF=?W!1)Msrznj&5n7F^AM*C?x+p+WA*q>V_49-y=kh_IQyyy%~^iaVB0u8Os z_4DEWaW#9pSa`ItQ0I4_UdYW}N8M$0*{p|9gJ`6JD@9V+GK3d`j;wKYe5mnOIgrPO z20OXQF~;4mD>~G+WU@C9}vZK6`du?pq5c1LbH$s9rR9> zDuleQnz(U?zG8U*3|oqcZpq0WNh5r3{@d%AQhRi9c%#vGSHwh%UDNpT^(?s(dyGYlB9Z!hiXas9WwT z2NP3NjD4`svs81BY#>dPMU3vd!QVU)cIRYBqfn77+QC$F0B)Ku`6K9)jv6&u2WExe zs;LKZU2B)ffJE318|I@{)t5`432Iei0y6Ob^}DZ+HZ3FDVJ`B9ud@?A7)&@T7D@yW z7Fl-03sPY_i=pqQLVu!1R{o@#LLiz81OrT`JrV~{TUlKDz}0D?e$6Td$*tsqp5@?X z6c!DiRtzj({+4QK>9AJSn5buK9l6F< zaf2PQUKoyKg^b*p9%MH6fq?5=h9^rKn7JwJs&UZUK&GPZq}`~p)0T8N5;5iqBqZRh z9rP8>PSCjKY>Mg!XbroJ*wJ0v1Cq5pK zB}6Mhi9BGAbaUjlU5$9 zu!cd47Z^KXVnm`Ej(F5@2lNXDr8|od5R~s1fBpo}Zk9O?w3lQu)Puh?gL|)X`ZtD( zTj0Rrli6}+hA-Y8WH^K~Oo;ofLoDaxFok-u?}sJaCIXH}C*vpsa?OxaYY+MvZBZ}H zs$;N7VN7>mPZxsYuS$*1XnMlg-W zxDHl$Bjn`ZkSlVxq0ttNx;rqorWFG6IY!(Dx>um2d6I2W8_ghEx-!B8eiCTUI~=%p zyMlcO^rEMfeXyNT)?_nVLUyxO3#99AFUXe)^D4u9fsv4V>}}9pXB3*nnAcWvw$jtC ztLntKkeW%aH`LX`A+FlxM!l=uL~6Q7*F)EGPIU8Swk-}EA-yR0En+dn_Af+|C)7cQS2eFmt zet3+7CqIte+|&*&u7-%g((?n0HB#p32AD7ymobsTS#EvSS&`(C6QpoV5EZiqbfS{?Wbsh4RYa>KQu5-Ooc5gqoi^F%-6p=HW$%F94c9C+q9CAU zlY|E<2b+z+)Qx$hxhK=uIJli!hdlWcnN|hOTBCyMT5XM4UARW}{2H>QA-30+de+mM zyBKd9j@-PT%Am6yPGV|9Dx!dW$;iQzYE4)Z+iiKdH8gPYHOpv-?7S$)4_KHJRq*zauS*!9;ZZI*@z&+!uoTHeagkmsx^Ka?7w5ME_^~|ODFBb z6V42)nn)mSKEk#q8PH*DsB27`oEx_~h~v=bMI?LXT+pJm!GooFCN!hrOc)`@+NWKc z^aRF7Ee5ZIV0)~5I?v<4vn_%ybIwYAukX1cWUkl|nb_%RGqhGOuzjuCt8KsQR0G!cD`6}M@?c1t5ds5) zd^viPBRI156Uc@~rmjrWuG?E?r`P9%o!v6coR$Gwm^U9q8ziaaenXBuo0gqVrmY-= ztHl91#XRpivuTWA+B$~6B9nfHCI(*g``m=$aPrd@9tTbpEiLsRavH6Ki_o?Pr*IxA z{5kA5`}s5VA{%nxY(|fVp%J!dv>x4O>1Rv*9OInT46o+2P#U_2I!vm97NWACKqETs zjVBDx+jp_-8EhwiLV{IhamJyvSE~qSaH936H45i+$=Es{bfFiM_JN>s*DZ9&@~C9P z$RU_>nN|sdF2zSywuLN$LYcNC4MQfoyK`nDv0AhbB4kevF^DyL)8KkykY|-rqF0zPv z+qV7y9ve9#8o^0P<>chBx_ih?&*=Id2d>HrHG&89db*z*hafpF(XT^Z^9|jV02RC6>{*}8`K(doA$)mz3{VPD4eonI6Xnj!Q2_3LGYKZ zyicAT#-$WnW$Wrxi4s={!J+4vkZP7y*@Q0_lw0d z2rZ8(pLb-4wLB&#B&(s#+zVzf-UWtTPs9#%Ylb1VKxo>`7bddDtf1Ej*dw&#K=Y*uc(Py_2I z{W14F9ntn*U=-5PL^JjpjCc-#6KxFSaQF-o14xs=5mmZwY|Lq&0V{69zQSHS2E5fx zMDw#FSyyS@}M2pE3-p+~UV86#6*9YZ8mD}N)y#3J%Vp%i%77062Wox485}S0LE@2_crVk%rt3N zWV(pdFo-bKMWYitD0YSGjAfgtnt3M0N``C(mHG~JWza#Vs>^)Rv`e{C?h}w$#?ar5 zosHF;CszJU(%+lNcfhs=4&oszFwsaP<4O)ssxKghB$Sxmk5W9LMZMW4q8Z)pc}r0~ ztQfJ!RrDvNr=Yqg+zqsaXqXu`!GJCG8yJnuBZHY4_nhuzz_HJLRAwZMPF?9R&)##fJ0PDIFJ)%V~C_}g40`RamMQ+hXoJPu73o2 zBw@26KM%(Xbg0Q$I=a?@+rUH=V^b5i7--3MLbwGuHJ6#1E#7zoRAa*sL}#I}8jP9f z3_ZpA<+>BY!sP&jq9z@7;S&enuiR|U45(mcVHH?&kUn5W-x}N$#166=wZ&c9+4M7q zezgiGBGwZFhO#1Qq+7ZSGHV6$i%c4unWlxX9DnJZfWWu|jRkwQhbO+V7prZb3kj~wP|R{BFd9L2m>j^6EyD{GrbjV|3E=oVluqIth(jJ{ z>h}yi-bAAqdZrFMjwFh5r(U5>26$qo=2=&JVCBD-v|*E>5y!*AI4PZ|a9zfPLmwAF zw+z`>Fi0rc`x5vlx2vWxZhw8bnm{KI9lKu(4ECpX_Dz{Uk=E)0N;&K>rDe(v2!ma? zY;BRrv^Q#TcMj)7r1M=$yGGl8b1mH-`-0UN-Cig$G9Sa@Mxwx(FkW+%_Ry=1a%%3$ zxlhR(b3N=VhwYG2Om15QCG}o|%mO$X16HwiC+Y6l<14z=jy7JL3@kajP%8s$(tD7j zecUi@`W_Pl>8G6|tnR*D%OPP}LbQU6kt^HSE>xHsiI(?mWA3cbef%3|D50rNnCV8S zB|1vmW!2JPVwiEzx?rf`%G`sAA`gQ+TUR3_i_ag1@5UOs_lL z&rrKoE=C+%BhPa zh_LOf9B1f})yz)M2Sss|an!r=pW|Rz!Lrj6w0RI}wpI#^IKhEo%f!BiZ3(XpMh`g( z{FnB)hu}Dbo@YK!B~?~Th*^%jAZ&ijYUhT|jez(|Vzp6&Gs|*4Ui&{qtCVcUOov7* zBrm+(#>^uRX3B27Ev`Mbp+hE6lTX?W&yQ!0<7;))?H|y)^a|2O0f%)FNk?rK1%APB z;4Y5NkZ^d1gO~I`rbzl(>wXYc8WlcZTqcX#1KK<2*w=6(0r)}AqURNxXs-om$Dvv3 zQCVqXyLYe~IVJr*w@GC9cm6C0Y!?>Rl%mm-P%$6A?3$PjXJ;PfsFp#^XbLvQpppyp zmMe>~9X5lKVCyP1@D0P1($Z?vr5w^A;XwNokm~x%7@w{EAYw-+C`Q6mk`U1wJvv0T zPvR|79lmQ}n36J;{XtYg!i+G~WZ#vJq@r8EQ-$O*jEDo{55b<9(s*x*HbV2g6D&CE zdGz1+_L^oBRU$~FVmT zc-YE>6DeTo+Azcu$CSW`kA*nF{JiF6g$m7bafB zz)Tdnrz};$4wew^HoQ9U4$CEj3j&9NvvXSvqQGv{x~%L|w+^6lkkGr9mz*=7(Go3Bo^l2snnIqNoNzerJu%Pc+tRNXN9%s1uo>+a#Ktc z%8q54W?*<3sqq}X_)SmqJxDcazoED{cpw%Hq#q`m{R!y~5q204+KibTz-BX}Pth{TOS)5qaEvziMtg=V)CR<- z4u}M~X9Zg`VLHYp9-i;-PToNbvFMnh5>`$#Pi2U1#t=osql!Ab=oMsx)YmXWtU7g2 zwGeN=l1_jd&A^J13d3(VveJG*IPc)W4w)`3uXt4%w*_#ZN@&H3dW5zJJ zq%8V5@Bow=-#i9s2NP>JI4R4ofc4p^;TrUI0F#hy(p2aRI`y(skb53Uz{tTIXt~9l z_N(3Ho?`Q5iLa48MhsRx_MBoD7gtrE9x_s%5TZrIgVz)pp9l_wIFzm`-8Yf92vo*B zSY*VIy?NTs_>&`SJ#9{ljd9w;p_uRvYT6^Uus2(@Z6d0N@cjN20|sVAR7xH}wzh5!$Ww zp(cUs8S%+Jmypn!IUYLQ^~F1I=G?ou|=_q@z~2HZ$}*;=XK$A(xASH+J*% zJK4=JdB8(3o6*HHtL*R@ROpJsg5KpG3W%x3sHKV;>e)(NW2~X!yB&o}GD44_hlOsE z{aHd>M~sN6700n*^5=Vs?2}FA=rw^CK86lrtk*ivzS3B z!?oBk6nn8V8>ZY#ig^!jx)UBuHQQ1ct)nbQswaI7XiWlZ*z3(6oSm)J4qzM;A9z&s zI7~QLTBCzvc1UK3Yjs`DdUISXN0ICpg@Vjm9J{Cl65Xi;PdG1_6&8*pi;ROSouZoK zM2fTZ*$!)=>N1GbU~zzO^`PYO+1wD6F*OAPdO{8iK6IgbSL6!;1(ANN(^DsArv?+@ zDbmHXYMUS?YpD zvE>*a?faHA&*YKEnYl`L*MQCD!i)q22HHyk&_-RrNd`6CL=N0gM&c^7TQ64(qZvJB zWp$OfG4+z3s6>;{H_T*>1Cgi5t<~CPe{d5iMjxzGDB_25Qs-%1c(OVcYl~syG;9?P zRzfC<76ZX3C^BtD3Ki8*VXn8%r36M z{%YYr6_jfG$dxWEIjL$NHB8{gqR`>691&ftcLBbC0aYUx%kwD@sGVo*2NHYZedMS< z(KB|$3pqvfi2L@t*e71bM4b^XbL2(rgb!A1v=#mE-4!l{PyTJsiwei{A#R4<4Ln)V zr_5o2;>iQ6glz`kP`!m2f*Kco?xRH49fmzWaIhs+7KjNt;|6meKO~`8JmA{5Wgjc| z?jJSKB7Icd>`szf(9TSZ&#FOW80~Q=Q3|Sf#!%yF%6X!?QDz388M-mk-jhH;f#ftD zbaru0ud;Yx#~u7Km?fN&#UbjV(sEv=7bllL zPw0D-YGn6}EK>jg8@)+HK~&-jy0{B@VVbh=_uF@tY}N)$vP*db;*Hp_J76d7H%NaF z9jkXCaJ1iLNHP>5=m&eka^A495ePJ=$u=jM3_9h{<rvj!gQGy7u*`)tl+u#L`7L-qO)LChaG12Q{3skoUgg2m2O`YMwFH^2|^WY3dpG0Vq68?$@^@y3K4=p8wq^&-$Z3>W-iXL{@ z;9m|CRD{8)wkHf-uVXJX@6On4dd%A9`o?W&?AjU6G5d2=H4|iXN1NuD8RM;jZuBB- zr1ybi4hTs__GXZ78x7qVl5Dqmk^KNhg=jh8!>)P3u~*)~Ul?{C?zuL>tk}IIy(eO; z85I55lp>RGpSouIJ%+eOC*By(Va%kg0~?|!UPu-)SVw&5H61y+gJ#L*@BHS9a7u>D zB<#b$cLL%O)zcImcTbTiA+Q648nfL9PO;W7VgYP2V0aS2t4$WHaS0zOmYm=jb_1d` zIYj)-?Xy8B^a?a3v#+|Yi30;kr&83QXx}aJIYc5<^M`3M$m~#_155+`fi?bHjW+-W zmsKkHLcjfWoHyL}jrm|&co{0F`ST&aFnz@fkR$O8l*@?mJ|cdM71)~=rL&q7JWa`m zqi%WtZOnNa+5aB6Y#cyWQxFIT{ab@|( zNyk+w1sx7cQ5U;ZZ*sCkkPWD3~~zF$AeueyYO^xGOl}gT)D~WvU$P;T(5huvE2Z-l-Rp!Q{Zx(BD}jl zUJ|omzwUs%tTE)qB4T4ri$e9B9I1g`%|p?Q!IwAe!qEhik!5tSyhg@k>)%af7CciX#oRjTKM*X6zxL2`%agDBJG05RX1ZGMJlu2fG zLIaUP$9;CWn(r0R6uo*_F8VWT*8Doq;~QY!VvEC$oDN;=>;N6Kh%YlXR|3S7Kr8fLEsuRI^?}vg0@qj!?5| zee8YN`(~&Hj{$3WnL$o-mcvJPXUO+)aQ>=ce(Kp`lsvR4`hZ3xp*HOCuFr7VOh!RG z+l|2no#N720Q+;d9)O5Wfj9N1e$!xMVnr8~vB6OMni#r>@Q2F@2$b&4JL?K_OnE%* zB5-Ki**AXfNIU`AM8H{HRhrDInpil9uB|D@%QQRv&#^5lSIAp+qt`rM!+pYmr3L+U zp<3*D*lFRm44sp%Rvdw%-Z(m>%l=COt&?6Y? zEe3;qm~1w7w&u>*Lh^fDqqKheb!W6qcsRN!x~)!{jm%Nx$bjjSb5J_nF?!DMx%o5K z&Xe0yUdy2@7kCGoP3@8}#E=lZShD6^E$DMLu;c`~;{l0>!wO)emPdp~^Y;+TpJoQi za50&jdd1FyE*N}~S4PZwy48JJu%{9UP!(1T)ln^sP>t1?lf4ZL=uOdeH~Mm>1pOk6 z-cDjyPM^?vBgP;va7ZTAX$US1+l)NbX2blqYRC@RP2LdjgLfHd1+{lQh)$4=gCaKg ziFb4Q`8_EV`j!JW>2RU_dwU6{%A4K%wUiQi-4L>tSjj=>ECmbccXb5OP>fvd#fP!b zlre<;1*vYQ5Df#YkWIUeYC&$aedmhcFr=W>d%3bV>=GoGP(1xC5c^maxlRn*4(etV7y>uFy=j4G0!~^UC%XYt! ztNL=^vK!;i)FVP79Oiu-*Yg{4M`iPo`PF9CGDi|iz;x)c6~y&JbT(|_Yt&(8$@PNY z(lGbXdMB*Viu2m#luPXj{CbUnY@06Ly!=GG`&1X*Y86tKerkF-Vx^l95opROwXw;K zIU69JFxlLi9c@drtDB;UyS)kyf6kiDuun70LuPE(J>-ZYS*8?B=#GON(_fPovUX0` z_X^CV9y(lz7AiJC5A0%O3;^awrR0)~zYob>RP8IRO)H z?#lEri^4)4!Zhu7LOj}nb;V$ZbvBl~UtpL+I-KH$sodw~%qyyNyT17$%YMuW3_Ij{ zb1$!J6-%`my55aa#TjAf=CL`2Yj_V6*yHR1J~WCM2Tna3gaMl_3mBMPtTfnnHXXsC zPr@)n&CQwFgJEb~1v$_&z{mUHuYm>Ee}DV|)X4PP?aIuN7i}Uu^$XXlAd(Hv{sQR> znQ4}c#XW6|$KZ&JMiaG%NpVMxwO5{fB@!I?(rZ_aeuyQ-@gQio(@6$96B?U{ZSe_o z$YrN1M%K!_VCPWH;mjg?a8o!(i)4<$V2l|kJ4}43xp%c-GwEElZgoZ16O;qv3XP0O zvfGi&Mciq4cG!~fW&NODxAR(r|C4pi?Jf$9HKu-8=3aqi?Q+wNZ{#2Et~tbntEMJ| zw@hzD+|u-{use=n%+XD^nx&D`F}n@vv#TlSogV4aFD0+YFE4V}o@2L=?R0u%rH?xi zdzf4&g}syM;|C*Mdx|ykJCk}tE3@y%7*62UyvKfVWHQ$Q=B%t#5lA1HED)I`b+A{G z6^)(Wh~i_+wuaLw*+9aJA`;iQew!`7F(jn4*kl63Rh!9a2G9)~K#$QtSwbMEg?OeE zD%}l@4yi>5WKUJp7gWg_mCYL}qr=%$<7JvDlH-JhYP`##6fb7b&a}F&N`J35^)Z+6 zY#wFqyGLi{*qZ@sBQo(n{!abxR;3^8n`P6hLX=RM1Mx?UBhAG>sFdoyI{|+INP^#43SEX$~AZJpe}k zFee6MN|rLY9AeA#VbX)_asX`kFoQJ{hR-u)5=|^UcWi(cfRYqtx!;o`ry@?Y z=44X+vm+iu))M=~B-hm48Q^TUoAgL<$QYqh%FQIS+zFknnBU_17E_JB8>;4?0_kkO zz$5y0K!4QL8%-X-%H~Nip_@Gc(QRt%bFBA-lgl=0cEP4A?lCnbTf+p7u=SwI7)GP( z7Os}89}Kq(=*<~oCyVJ|9nEUvXBklgQ3WR~Z!UPt8me{tnGg&u6n!#M*m|kn*-SQ*n8TJ))UZg`yO>psOc>SO z0JePzP;DYjo{H;|k}ZXrf=!r^y*hg!Q#NZL7)c1DQK+#dN`s}mf$U*%J!}#~{6Z!w z)6Nn32WgW;-${XG;RosH!D#ktI4_w7$+bkYyk#iKcNb$AXZRFK!+N@H6~&R~2qG)zrqmND_d3P){qoN9?d zZ#p=;(PL5ejz1V_4cd^UstXZi&oJEVwj0~KDHwx>_Vb21(+D4RXjBaj#F0IthNI)T zGkwyebwRo<>LOq0-SD=u3J94Y_~LM(A+Q9EkbEK)itbQ`hW;t>0is}U3-if^A*j95 z{BUrCrx;6e!cXiOPBE}Qp|JNlvSv7tH7e-&tm@nI(1?k?jsXFY4h^Tcok?t^?_~&u zySWcnO+Tiw6v|LT8U1_bnl=}F+zQWeJS@>1!a1B0Y=*E5_w6)h-kuql!G;Yz5Hn?G#kz@QlL|?8%yz8PnS+MuP2v-v-vA;laYZ;y~=EYm0N>5nE0D`WUuF zwX8$Ph4)av_yrmF?57&S>$Lbet75RDk}iDm@1iblCJQFUPV9!@<3*bWk57dRaVXA0 z>>PQpqa2Ln(e}LS`yC>?z8)X;9~q5NF^%9zuo;s9)xqI0b0MmU(}j?(p5>hO>bzRtvRB{l|9f*47egF9TvgPR}k|dANv0f~Mi8VNdwLm|;R^AULtzV2GZ*eiE{I}zB`e^Ao z`090ghaN#NL0kzJc`(}$^*&@K)xmO|I@#(op^n^)-QjqTmB=ydEQ08fr~`+IV&2-& z#oJjxm3cQzajcx2xonv@06Cbc&+U7a+ZFW`TklvfFn#+wL1RVMjRS{YzZ#qk=#x^i zHroMCKW7nB^2kxm#tU<5s@+XA&LJ@pBZ z?IK6GIp6+M5n7cEra(CMDv^R+CIWWnVACBiY4e*Xkj>PQbSswT14fA`#0d0!u49ST4%X^I2YqJ8ztsx^TSh&o*-jr9Y zqwre3)~%Bdb{;r{9kKm#J^bmOOmW_$y7RBynT-mI)h%#{ZT4=ABG_VYi`(8vmYB`( zD|IVyNTk9RL?Jl9K941Tr&pFbUq?Wi;?VwiusiE+w+>i#FBSTY^)!XcHvFL6t{fP~ zEvTb_6{D|bqqfIl)EpM3!n#Hem+!oh0!6=B_NaEDk3h}BlWZ7MbJ?5G(^>X--up7nIscFs&<(n@I#YYscc zP+=?J-62p8h))A?vgx^NyF&vxn1q$@KDB{pOp?tK%;`;s#i!jsV6$)vVHszmPM|Q$GuG-e8LbydA-`BcBnJra`k2{~MyvyXW;r{< zGur$G6{Z3u>@OYh50qwfM+{r`??HaKz#a%TF;)1^0wVCfww{XNxyH~2DVs0*v8L^h z#u+t{0;Zk!=3XJ2clsW*r4AE5!P=-HQiAHN0{45w01mJ@UFSY*IN}yFkP`g4rxmRC z_txSw(l2+WM~EMhB2i5ytvJjV6%;j}#67#-VY6Wc>YWje4f)F9$#XtXi>qWc~)VxE8-q~v89o= zK@;;~XgZHLSZtXqLR407ev-}Anh&*BDR)2SSd0|P+k{?a4&#SE{t z%_2O}4q_0Z`9#rjLX@~rl35WBup8gM5%nhVneBQMwqblJ6@cBCdulg=C0Na!N%CA2 zKI1U$Fnckj84tJ+$Qi>%2wle_bYN|>O+nyzXi^t}`yLA8-lj@(l)`y;^q?8sffZKL zCW{GFhYy?LFZH6_xmrHI2~_y|{H6!*+RR2r`UL z<6c@Qon^YD`Driih@GjGL=(q~7L6Qs!m)eA>^|+T?vw5dja-05TqEpcIfP9O+NjuijU*Q5HVsO z-zUGN3Cb&r9$*{o-Fl~!-g5lzYDKodyFoh}sQG?s?b&r3kqn3$gr5nz->C6b z#9EVXX)46y=quTL`j5H2b(=?M3wl8a%{pzR5&<>V$vhyU54TL$75 zzlY*uU4a>QW)}><(C`W1FgikJu{B-A+7pgHyV@R;bfHHd4Akn?t*D1p$LjkJgxlE1 zp|l*M-HM$S1CYx_)L=wceLjOfocgdeJUtfQ?H%C&J#^_CM_Y+lNuzFG>^E{xkItru zNxS`yL~iql1y^mKRORN9B)b=AliJTYOv%t1Be;w1z`T3Q>4pr$GsV^*={Rx!Z16$HCxxjER?Q=mThyqCqNyzO_by+9T4J{ z-inRb;O530a1jRt0rnR^@b48D%$Zs}RVI|jfbTmbU1(%CKIN;-ziupA*Br|Au}y!9 z`yc{R4BVF~V`{ffsTxQf(fUL;-*t9w_28IBT7Nm>CjAqD_lHQV~8n2ohhyK zm!oUeXr`Vv1%rLF%Y zR@Dx)UG$L(31i;alAbGjrkLO$LSNH6oNaPIEM!xEkQ?%3Tp83hP5pB1VT`vDthc&7 zKG+oXEB4&*F~imw-(lhDX!qhK$6@8e4Bkh|cvIF%j`iBno7IXfetDRu(?}=jqX$1+ zkW7;dCRE3D)9fe!x2AA6$+S6}hN-9%vmdKI;Vst04O9%8~^|S From 26e40e31cffd15c59699c9dfe8cb6b595fb969a4 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 20:56:38 +0400 Subject: [PATCH 16/23] [mono] XenAdmin: MainWindow: Disable adding HomePage tab content For some reason, enabling that HomePage tab is the cause of connection lost right after the attempt to do connect to a server. The HomePage tab shows nearly nothing useful than the add new server link. Actually the tab content is a web page that require a webbrowser library that doesn't look available at current days, and doesn't work on Mono, so just disable it. Significant negative impact to users on Mono platform doesn't expect. Signed-off-by: Ilya Stolyarov --- XenAdmin/MainWindow.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/XenAdmin/MainWindow.cs b/XenAdmin/MainWindow.cs index 2e0392093..27f3a2a66 100644 --- a/XenAdmin/MainWindow.cs +++ b/XenAdmin/MainWindow.cs @@ -1,4 +1,4 @@ -/* Copyright (c) Cloud Software Group, Inc. +/* Copyright (c) Cloud Software Group, Inc. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -187,7 +187,13 @@ public MainWindow(string[] args) AddTabContents(CvmConsolePanel, TabPageCvmConsole); AddTabContents(NetworkPage, TabPageNetwork); AddTabContents(HAPage, TabPageHA); - AddTabContents(HomePage, TabPageHome); + if (Type.GetType("Mono.Runtime") == null) { + AddTabContents(HomePage, TabPageHome); + } + else + { + // TODO: Cause of connection lost + } AddTabContents(WlbPage, TabPageWLB); AddTabContents(PhysicalStoragePage, TabPagePhysicalStorage); AddTabContents(AdPage, TabPageAD); From c71c63f6e0551a804892102412a7f98690204746 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:01:55 +0400 Subject: [PATCH 17/23] [mono] XenAdmin: MainWindow: Disable registering the ClipboardViewer Doesn't work on Mono, so just disable it. The impact in unknown. The ClipboardViewer must be a crossplatform to revert this hotfix commit and restore lost functionality. Signed-off-by: Ilya Stolyarov --- XenAdmin/MainWindow.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/XenAdmin/MainWindow.cs b/XenAdmin/MainWindow.cs index 27f3a2a66..f23cfc131 100644 --- a/XenAdmin/MainWindow.cs +++ b/XenAdmin/MainWindow.cs @@ -391,7 +391,13 @@ protected override void OnShown(EventArgs e) protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); - Clip.RegisterClipboardViewer(); + if (Type.GetType("Mono.Runtime") == null) { + Clip.RegisterClipboardViewer(); + } + else + { + // TODO: Clipboard doesn't work under Mono + } } protected override void WndProc(ref System.Windows.Forms.Message e) From c58803bccd9b841fc4c1fad6355c351da0c2bd28 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:03:16 +0400 Subject: [PATCH 18/23] [mono] XenAdmin: MainWindow: Disable RestartManager Doesn't work on Mono, so just disable it. The impact in unknown. The RestartManager must be a crossplatform to revert this hotfix commit and restore lost functionality. Signed-off-by: Ilya Stolyarov --- XenAdmin/MainWindow.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/XenAdmin/MainWindow.cs b/XenAdmin/MainWindow.cs index f23cfc131..85ef7388a 100644 --- a/XenAdmin/MainWindow.cs +++ b/XenAdmin/MainWindow.cs @@ -1,4 +1,4 @@ -/* Copyright (c) Cloud Software Group, Inc. +/* Copyright (c) Cloud Software Group, Inc. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -153,7 +153,9 @@ public MainWindow(string[] args) Icon = Properties.Resources.AppIcon; //CA-270999: Add registration to RestartManager - RegisterApplicationRestart(null, 0); + if (Type.GetType("Mono.Runtime") == null) { + RegisterApplicationRestart(null, 0); + } #region Add Tab pages From 08b91f667940187ba38afcc204e498fe0afbca67 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:09:40 +0400 Subject: [PATCH 19/23] [mono] XenAdmin: Page_HomeServer: Fix New VM Wizard crashes due to call loop This fix disables the functionality that is a cause of the program stuck due to is a call loop. The negative impact isn't expected, since the disabled code looks like just selects some default value. This doesn't look important. Signed-off-by: Ilya Stolyarov --- XenAdmin/Wizards/NewVMWizard/Page_HomeServer.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/XenAdmin/Wizards/NewVMWizard/Page_HomeServer.cs b/XenAdmin/Wizards/NewVMWizard/Page_HomeServer.cs index 586b728fd..e5fb7fabb 100644 --- a/XenAdmin/Wizards/NewVMWizard/Page_HomeServer.cs +++ b/XenAdmin/Wizards/NewVMWizard/Page_HomeServer.cs @@ -101,7 +101,14 @@ protected override void PageLoadedCore(PageLoadedDirection direction) public override void SelectDefaultControl() { - affinityPicker1.Select(); + if (System.Type.GetType("Mono.Runtime") == null) + { + affinityPicker1.Select(); + } + else + { + // TODO: Call loop under Mono + } } #endregion From 267b7ffa2774d34e2989f25a7904eee74a1a25ba Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:11:42 +0400 Subject: [PATCH 20/23] [mono] XenAdmin: Program: Skip logging GUI resources at boot This fix disables the functionality that is a cause of exceptions throwing. The negative impact isn't expected, since the disabled code just prints some debugging messages. This doesn't look important. Signed-off-by: Ilya Stolyarov --- XenAdmin/Program.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/XenAdmin/Program.cs b/XenAdmin/Program.cs index 2d703cc29..acb54f16f 100644 --- a/XenAdmin/Program.cs +++ b/XenAdmin/Program.cs @@ -1,4 +1,4 @@ -/* Copyright (c) Cloud Software Group, Inc. +/* Copyright (c) Cloud Software Group, Inc. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -251,8 +251,11 @@ private static void LogApplicationStats() log.InfoFormat("Time since process started: {0}", (DateTime.Now - Process.GetCurrentProcess().StartTime).ToString()); log.InfoFormat("Handles open: {0}", p.HandleCount.ToString()); - log.InfoFormat("USER handles open: {0}", Win32.GetGuiResourcesUserCount(p.Handle)); - log.InfoFormat("GDI handles open: {0}", Win32.GetGuiResourcesGDICount(p.Handle)); + if (System.Type.GetType("Mono.Runtime") == null) + { + log.InfoFormat("USER handles open: {0}", Win32.GetGuiResourcesUserCount(p.Handle)); + log.InfoFormat("GDI handles open: {0}", Win32.GetGuiResourcesGDICount(p.Handle)); + } log.InfoFormat("Thread count: {0}", p.Threads.Count); log.InfoFormat("Virtual memory size: {0} B({1})", p.VirtualMemorySize64, Util.MemorySizeStringSuitableUnits(p.VirtualMemorySize64, false)); From 0676739adf8d7fe166f0dab0f24880c186183184 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:15:23 +0400 Subject: [PATCH 21/23] [mono] XenAdmin: Program: Disable NamedPipe creation This fix disables the functionality that is a cause of exceptions throwing and impossibility to run the program. The negative impact isn't expected, since the disabled code probably needed to run tests. Maybe that functionality need to be restored in the future to provide automated tests. Signed-off-by: Ilya Stolyarov --- XenAdmin/Program.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/XenAdmin/Program.cs b/XenAdmin/Program.cs index acb54f16f..1367f942b 100644 --- a/XenAdmin/Program.cs +++ b/XenAdmin/Program.cs @@ -200,7 +200,10 @@ public static void Main(string[] args) ///

private static void ConnectPipe() { - _pipe = new NamedPipes.Pipe(_pipePath); + if (System.Type.GetType("Mono.Runtime") == null) + { + _pipe = new NamedPipes.Pipe(_pipePath); + } if (_pipe != null) { From 91ac3b9f0c45efed99ecf19bc526a78c8aab6ea2 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:50:16 +0400 Subject: [PATCH 22/23] XenAdmin: Program: Fix possibly unhandled exception on calling ExistsPipe The function ExistsPipe could throw an exception on catching the NotFound related error. Add safe try-catch block that skip the error since if the pipe doesn't exist the code does nothing too. Signed-off-by: Ilya Stolyarov --- XenAdmin/Program.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/XenAdmin/Program.cs b/XenAdmin/Program.cs index 1367f942b..3d63a547c 100644 --- a/XenAdmin/Program.cs +++ b/XenAdmin/Program.cs @@ -1,4 +1,4 @@ -/* Copyright (c) Cloud Software Group, Inc. +/* Copyright (c) Cloud Software Group, Inc. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -153,10 +153,16 @@ public static void Main(string[] args) Environment.UserName, Assembly.GetExecutingAssembly().Location.Replace('\\', '-')); - if (NamedPipes.Pipe.ExistsPipe(_pipePath)) - { - NamedPipes.Pipe.SendMessageToPipe(_pipePath, string.Join(" ", args)); - return; + try { + if (NamedPipes.Pipe.ExistsPipe(_pipePath)) + { + NamedPipes.Pipe.SendMessageToPipe(_pipePath, string.Join(" ", args)); + return; + } + } + catch (System.IO.IOException) { + // For example, Mono throws the exception on calling ExistsPipe + // Since if the pipe doesn't exist the code does nothing too. } log.Info("Application started"); From 296e7294623acb3748c3fccf0be125c423ba4456 Mon Sep 17 00:00:00 2001 From: Ilya Stolyarov Date: Wed, 1 May 2024 21:28:18 +0400 Subject: [PATCH 23/23] [mono] XenAdmin: MultiSelectTreeView: Disable HScroll manipulation This hotfix disables the functionality that is a cause of exceptions throwing on Mono runtime. The expected negative impact is the probability to lose the horizontal scroll function somewhere. Signed-off-by: Ilya Stolyarov --- XenAdmin/Controls/TreeViews/MultiSelectTreeView.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/XenAdmin/Controls/TreeViews/MultiSelectTreeView.cs b/XenAdmin/Controls/TreeViews/MultiSelectTreeView.cs index b81c7a3cc..3cc026fab 100644 --- a/XenAdmin/Controls/TreeViews/MultiSelectTreeView.cs +++ b/XenAdmin/Controls/TreeViews/MultiSelectTreeView.cs @@ -1088,11 +1088,21 @@ public int HScrollPos { get { - return ScrollInfo(Win32.ScrollBarConstants.SB_HORZ); + if (System.Type.GetType("Mono.Runtime") == null) + { + return ScrollInfo(Win32.ScrollBarConstants.SB_HORZ); + } + else + { + return 0; + } } set { - Win32.SendMessage(Handle, Win32.WM_HSCROLL, (IntPtr)(((int)Win32.ScrollBarCommands.SB_THUMBPOSITION) | (value << 16)), (IntPtr)0); + if (System.Type.GetType("Mono.Runtime") == null) + { + Win32.SendMessage(Handle, Win32.WM_HSCROLL, (IntPtr)(((int)Win32.ScrollBarCommands.SB_THUMBPOSITION) | (value << 16)), (IntPtr)0); + } } }