From 2d9bab432f58230f6c15f387608d58657201e536 Mon Sep 17 00:00:00 2001 From: RichiCoder1 Date: Thu, 6 Feb 2014 22:51:53 -0600 Subject: [PATCH] Initial commit. Basic styling and package list outline. --- Chocolatey.Gui/App.xaml | 17 + Chocolatey.Gui/App.xaml.cs | 26 + Chocolatey.Gui/Base/ObservableBase.cs | 28 + Chocolatey.Gui/Chocolatey.Gui.csproj | 209 + Chocolatey.Gui/Chocolatey.Gui.sln | 20 + Chocolatey.Gui/Chocolatey.Gui.sln.DotSettings | 2 + Chocolatey.Gui/ConfigurationSection.cs | 45 + .../Controls/FauxPowerShellConsole.cs | 142 + .../Controls/ObservableRingBuffer.cs | 314 + Chocolatey.Gui/Models/PowerShellOutputLine.cs | 20 + Chocolatey.Gui/Models/SemanticVersion.cs | 253 + Chocolatey.Gui/Models/SourceModel.cs | 14 + Chocolatey.Gui/Properties/AssemblyInfo.cs | 55 + .../Properties/Resources.Designer.cs | 90 + Chocolatey.Gui/Properties/Resources.resx | 129 + .../Properties/Settings.Designer.cs | 26 + Chocolatey.Gui/Properties/Settings.settings | 5 + Chocolatey.Gui/Resources/Controls.xaml | 325 + Chocolatey.Gui/Resources/Entypo-license.txt | 3 + Chocolatey.Gui/Resources/Entypo.ttf | Bin 0 -> 36376 bytes Chocolatey.Gui/Resources/Icons.xaml | 1570 +++ .../Resources/SourceSansPro-Regular.otf | Bin 0 -> 127448 bytes .../Converters/BooleanToVisibility.cs | 20 + .../Converters/LongSizeToFileSizeString.cs | 33 + .../Utilities/Converters/NullToVisibility.cs | 22 + .../Converters/PackageDependenciesToString.cs | 46 + .../Utilities/Converters/UriToVisibility.cs | 23 + Chocolatey.Gui/Utilities/NativeMethods.cs | 11 + .../ViewModels/Items/IPackageViewModel.cs | 11 + .../ViewModels/Items/PackageViewModel.cs | 229 + .../Pages/ILocalSourcePageViewModel.cs | 14 + .../Pages/IRemoteSourcePageViewModel.cs | 14 + .../Pages/LocalSourcePageViewModel.cs | 64 + .../Pages/RemoteSourcePageViewModel.cs | 64 + .../Windows/IMainWindowViewModel.cs | 14 + .../ViewModels/Windows/MainWindowViewModel.cs | 27 + .../Views/Pages/LocalSourcePage.xaml | 27 + .../Views/Pages/LocalSourcePage.xaml.cs | 29 + .../Views/Pages/RemoteSourcePage.xaml | 27 + .../Views/Pages/RemoteSourcePage.xaml.cs | 17 + Chocolatey.Gui/Views/Windows/MainWindow.xaml | 27 + .../Views/Windows/MainWindow.xaml.cs | 43 + Chocolatey.Gui/app.config | 22 + Chocolatey.Gui/packages.config | 17 + .../Autofac.3.3.0/Autofac.3.3.0.nupkg | Bin 0 -> 241799 bytes .../Autofac.3.3.0/lib/net40/Autofac.dll | Bin 0 -> 201216 bytes .../Autofac.3.3.0/lib/net40/Autofac.xml | 6873 ++++++++++ .../portable-win+net40+sl50+wp8/Autofac.dll | Bin 0 -> 201216 bytes .../portable-win+net40+sl50+wp8/Autofac.xml | 6873 ++++++++++ .../MahApps.Metro.0.12.1.0.nupkg | Bin 0 -> 463803 bytes .../lib/net40/MahApps.Metro.XML | 4402 +++++++ .../lib/net40/MahApps.Metro.dll | Bin 0 -> 673792 bytes .../net40/System.Windows.Interactivity.dll | Bin 0 -> 39936 bytes .../lib/net45/MahApps.Metro.XML | 2715 ++++ .../lib/net45/MahApps.Metro.dll | Bin 0 -> 543744 bytes .../net45/System.Windows.Interactivity.dll | Bin 0 -> 55904 bytes .../MahApps.Metro.0.12.1.0/tools/install.ps1 | 3 + .../MahApps.Metro.Resources.0.1.0.1.nupkg | Bin 0 -> 171636 bytes .../MahApps.Metro.Resources.0.1.0.1.nuspec | 20 + .../content/Resources/Entypo-license.txt | 3 + .../content/Resources/Entypo.ttf | Bin 0 -> 36376 bytes .../content/Resources/Icons.xaml | 1570 +++ .../Microsoft.Bcl.1.1.6/License-Stable.rtf | 118 + .../Microsoft.Bcl.1.1.6.nupkg | Bin 0 -> 1007004 bytes .../Microsoft.Bcl.1.1.6.nuspec | 42 + .../Microsoft.Bcl.1.1.6/content/net45/_._ | 0 .../content/portable-net45+win8+wp8/_._ | 0 .../content/portable-net451+win81/_._ | 0 .../Microsoft.Bcl.1.1.6/content/sl4/_._ | 0 .../Microsoft.Bcl.1.1.6/content/sl5/_._ | 0 .../Microsoft.Bcl.1.1.6/content/win8/_._ | 0 .../Microsoft.Bcl.1.1.6/content/wp8/_._ | 0 .../lib/net40/System.IO.dll | Bin 0 -> 21168 bytes .../lib/net40/System.IO.xml | 8 + .../lib/net40/System.Runtime.dll | Bin 0 -> 22208 bytes .../lib/net40/System.Runtime.xml | 56 + .../lib/net40/System.Threading.Tasks.dll | Bin 0 -> 34528 bytes .../lib/net40/System.Threading.Tasks.xml | 475 + .../lib/net40/ensureRedirect.xml | 0 .../Microsoft.Bcl.1.1.6/lib/net45/_._ | 0 .../System.IO.dll | Bin 0 -> 22704 bytes .../System.IO.xml | 51 + .../System.Runtime.dll | Bin 0 -> 39104 bytes .../System.Runtime.xml | 860 ++ .../System.Threading.Tasks.dll | Bin 0 -> 164576 bytes .../System.Threading.Tasks.xml | 8969 +++++++++++++ .../ensureRedirect.xml | 0 .../portable-net40+sl4+win8+wp8/System.IO.dll | Bin 0 -> 22704 bytes .../portable-net40+sl4+win8+wp8/System.IO.xml | 51 + .../System.Runtime.dll | Bin 0 -> 22208 bytes .../System.Runtime.xml | 56 + .../System.Threading.Tasks.dll | Bin 0 -> 164576 bytes .../System.Threading.Tasks.xml | 8969 +++++++++++++ .../ensureRedirect.xml | 0 .../lib/portable-net40+sl4+win8/System.IO.dll | Bin 0 -> 22704 bytes .../lib/portable-net40+sl4+win8/System.IO.xml | 51 + .../System.Runtime.dll | Bin 0 -> 22208 bytes .../System.Runtime.xml | 56 + .../System.Threading.Tasks.dll | Bin 0 -> 164576 bytes .../System.Threading.Tasks.xml | 8969 +++++++++++++ .../ensureRedirect.xml | 0 .../portable-net40+sl5+win8+wp8/System.IO.dll | Bin 0 -> 22704 bytes .../portable-net40+sl5+win8+wp8/System.IO.xml | 51 + .../System.Runtime.dll | Bin 0 -> 22208 bytes .../System.Runtime.xml | 56 + .../System.Threading.Tasks.dll | Bin 0 -> 34528 bytes .../System.Threading.Tasks.xml | 475 + .../ensureRedirect.xml | 0 .../lib/portable-net40+win8+wp8/System.IO.dll | Bin 0 -> 22704 bytes .../lib/portable-net40+win8+wp8/System.IO.xml | 51 + .../System.Runtime.dll | Bin 0 -> 22208 bytes .../System.Runtime.xml | 56 + .../System.Threading.Tasks.dll | Bin 0 -> 34528 bytes .../System.Threading.Tasks.xml | 475 + .../ensureRedirect.xml | 0 .../lib/portable-net40+win8/System.IO.dll | Bin 0 -> 21168 bytes .../lib/portable-net40+win8/System.IO.xml | 8 + .../portable-net40+win8/System.Runtime.dll | Bin 0 -> 22208 bytes .../portable-net40+win8/System.Runtime.xml | 56 + .../System.Threading.Tasks.dll | Bin 0 -> 34528 bytes .../System.Threading.Tasks.xml | 475 + .../portable-net40+win8/ensureRedirect.xml | 0 .../lib/portable-net45+win8+wp8/_._ | 0 .../lib/portable-net451+win81/_._ | 0 .../lib/sl4-windowsphone71/System.IO.dll | Bin 0 -> 22704 bytes .../lib/sl4-windowsphone71/System.IO.xml | 51 + .../lib/sl4-windowsphone71/System.Runtime.dll | Bin 0 -> 39104 bytes .../lib/sl4-windowsphone71/System.Runtime.xml | 860 ++ .../System.Threading.Tasks.dll | Bin 0 -> 164576 bytes .../System.Threading.Tasks.xml | 8969 +++++++++++++ .../lib/sl4-windowsphone71/ensureRedirect.xml | 0 .../Microsoft.Bcl.1.1.6/lib/sl4/System.IO.dll | Bin 0 -> 22704 bytes .../Microsoft.Bcl.1.1.6/lib/sl4/System.IO.xml | 51 + .../lib/sl4/System.Runtime.dll | Bin 0 -> 22208 bytes .../lib/sl4/System.Runtime.xml | 56 + .../lib/sl4/System.Threading.Tasks.dll | Bin 0 -> 164576 bytes .../lib/sl4/System.Threading.Tasks.xml | 8969 +++++++++++++ .../Microsoft.Bcl.1.1.6/lib/sl5/System.IO.dll | Bin 0 -> 22704 bytes .../Microsoft.Bcl.1.1.6/lib/sl5/System.IO.xml | 51 + .../lib/sl5/System.Runtime.dll | Bin 0 -> 22208 bytes .../lib/sl5/System.Runtime.xml | 56 + .../lib/sl5/System.Threading.Tasks.dll | Bin 0 -> 34528 bytes .../lib/sl5/System.Threading.Tasks.xml | 475 + .../packages/Microsoft.Bcl.1.1.6/lib/win8/_._ | 0 .../packages/Microsoft.Bcl.1.1.6/lib/wp8/_._ | 0 .../License-Stable.rtf | 118 + .../Microsoft.Bcl.Async.1.0.165.nupkg | Bin 0 -> 491030 bytes .../Microsoft.Bcl.Async.1.0.165.nuspec | 36 + ...oft.Threading.Tasks.Extensions.Desktop.dll | Bin 0 -> 47424 bytes ...oft.Threading.Tasks.Extensions.Desktop.xml | 684 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../lib/net40/Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../lib/net40/Microsoft.Threading.Tasks.xml | 630 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../lib/net45/Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../lib/net45/Microsoft.Threading.Tasks.xml | 630 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../Microsoft.Threading.Tasks.xml | 630 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../Microsoft.Threading.Tasks.xml | 630 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../Microsoft.Threading.Tasks.xml | 630 + ...osoft.Threading.Tasks.Extensions.Phone.dll | Bin 0 -> 28984 bytes ...osoft.Threading.Tasks.Extensions.Phone.xml | 141 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../Microsoft.Threading.Tasks.xml | 630 + ...Threading.Tasks.Extensions.Silverlight.dll | Bin 0 -> 29008 bytes ...Threading.Tasks.Extensions.Silverlight.xml | 141 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../lib/sl4/Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../lib/sl4/Microsoft.Threading.Tasks.xml | 630 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../lib/win8/Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../lib/win8/Microsoft.Threading.Tasks.xml | 630 + ...osoft.Threading.Tasks.Extensions.Phone.dll | Bin 0 -> 28984 bytes ...osoft.Threading.Tasks.Extensions.Phone.xml | 141 + .../Microsoft.Threading.Tasks.Extensions.dll | Bin 0 -> 31520 bytes .../Microsoft.Threading.Tasks.Extensions.xml | 275 + .../lib/wp8/Microsoft.Threading.Tasks.dll | Bin 0 -> 37104 bytes .../lib/wp8/Microsoft.Threading.Tasks.xml | 630 + .../License-Stable.rtf | 118 + .../Microsoft.Bcl.Build.1.0.13.nupkg | Bin 0 -> 33529 bytes .../Microsoft.Bcl.Build.1.0.13.nuspec | 19 + .../content/net40/_._ | 0 .../content/netcore45/_._ | 0 .../content/portable-net40+win8+sl4+wp71/_._ | 0 .../content/sl4-windowsphone71/_._ | 0 .../content/sl4/_._ | 0 .../tools/Install.ps1 | 37 + .../tools/Microsoft.Bcl.Build.Tasks.dll | Bin 0 -> 37104 bytes .../tools/Microsoft.Bcl.Build.targets | 232 + .../tools/Uninstall.ps1 | 25 + .../Ninject.3.0.1.10/Ninject.3.0.1.10.nupkg | Bin 0 -> 1374273 bytes .../Ninject.3.0.1.10/Ninject.3.0.1.10.nuspec | 20 + .../Ninject.3.0.1.10/lib/net35/Ninject.dll | Bin 0 -> 125952 bytes .../Ninject.3.0.1.10/lib/net35/Ninject.pdb | Bin 0 -> 378368 bytes .../Ninject.3.0.1.10/lib/net35/Ninject.xml | 6209 +++++++++ .../Ninject.3.0.1.10/lib/net40/Ninject.dll | Bin 0 -> 126976 bytes .../Ninject.3.0.1.10/lib/net40/Ninject.pdb | Bin 0 -> 384512 bytes .../Ninject.3.0.1.10/lib/net40/Ninject.xml | 6157 +++++++++ .../lib/net45-full/Ninject.dll | Bin 0 -> 126976 bytes .../lib/net45-full/Ninject.pdb | Bin 0 -> 384512 bytes .../lib/net45-full/Ninject.xml | 6157 +++++++++ .../Ninject.3.0.1.10/lib/sl2/Ninject.dll | Bin 0 -> 121344 bytes .../Ninject.3.0.1.10/lib/sl2/Ninject.pdb | Bin 0 -> 366080 bytes .../Ninject.3.0.1.10/lib/sl2/Ninject.xml | 6120 +++++++++ .../Ninject.3.0.1.10/lib/sl3-wp/Ninject.dll | Bin 0 -> 119296 bytes .../Ninject.3.0.1.10/lib/sl3-wp/Ninject.pdb | Bin 0 -> 359936 bytes .../Ninject.3.0.1.10/lib/sl3-wp/Ninject.xml | 6071 +++++++++ .../Ninject.3.0.1.10/lib/sl3/Ninject.dll | Bin 0 -> 121344 bytes .../Ninject.3.0.1.10/lib/sl3/Ninject.pdb | Bin 0 -> 366080 bytes .../Ninject.3.0.1.10/lib/sl3/Ninject.xml | 6120 +++++++++ .../lib/sl4-windowsphone71/Ninject.dll | Bin 0 -> 119808 bytes .../lib/sl4-windowsphone71/Ninject.pdb | Bin 0 -> 364032 bytes .../lib/sl4-windowsphone71/Ninject.xml | 6019 +++++++++ .../Ninject.3.0.1.10/lib/sl4/Ninject.dll | Bin 0 -> 121856 bytes .../Ninject.3.0.1.10/lib/sl4/Ninject.pdb | Bin 0 -> 368128 bytes .../Ninject.3.0.1.10/lib/sl4/Ninject.xml | 6068 +++++++++ .../Ninject.3.0.1.10/lib/sl5/Ninject.dll | Bin 0 -> 121856 bytes .../Ninject.3.0.1.10/lib/sl5/Ninject.pdb | Bin 0 -> 368128 bytes .../Ninject.3.0.1.10/lib/sl5/Ninject.xml | 6068 +++++++++ .../Rx-Core.2.2.2/Rx-Core.2.2.2.nupkg | Bin 0 -> 561029 bytes .../Rx-Core.2.2.2/Rx-Core.2.2.2.nuspec | 25 + .../lib/net40/System.Reactive.Core.XML | 2622 ++++ .../lib/net40/System.Reactive.Core.dll | Bin 0 -> 104680 bytes .../lib/net45/System.Reactive.Core.XML | 2878 +++++ .../lib/net45/System.Reactive.Core.dll | Bin 0 -> 114920 bytes .../System.Reactive.Core.XML | 2622 ++++ .../System.Reactive.Core.dll | Bin 0 -> 105192 bytes .../System.Reactive.Core.XML | 2878 +++++ .../System.Reactive.Core.dll | Bin 0 -> 122088 bytes .../lib/sl5/System.Reactive.Core.XML | 2622 ++++ .../lib/sl5/System.Reactive.Core.dll | Bin 0 -> 105704 bytes .../lib/windows8/System.Reactive.Core.XML | 2878 +++++ .../lib/windows8/System.Reactive.Core.dll | Bin 0 -> 114920 bytes .../windowsphone71/System.Reactive.Core.XML | 2521 ++++ .../windowsphone71/System.Reactive.Core.dll | Bin 0 -> 104168 bytes .../windowsphone8/System.Reactive.Core.XML | 2878 +++++ .../windowsphone8/System.Reactive.Core.dll | Bin 0 -> 122088 bytes .../Rx-Interfaces.2.2.2.nupkg | Bin 0 -> 139518 bytes .../Rx-Interfaces.2.2.2.nuspec | 21 + .../lib/net40/System.Reactive.Interfaces.XML | 336 + .../lib/net40/System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../lib/net45/System.Reactive.Interfaces.XML | 336 + .../lib/net45/System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../System.Reactive.Interfaces.XML | 368 + .../System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../System.Reactive.Interfaces.XML | 336 + .../System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../lib/sl5/System.Reactive.Interfaces.XML | 368 + .../lib/sl5/System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../windows8/System.Reactive.Interfaces.XML | 336 + .../windows8/System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../System.Reactive.Interfaces.XML | 336 + .../System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../System.Reactive.Interfaces.XML | 336 + .../System.Reactive.Interfaces.dll | Bin 0 -> 24296 bytes .../Rx-Linq.2.2.2/Rx-Linq.2.2.2.nupkg | Bin 0 -> 2105620 bytes .../Rx-Linq.2.2.2/Rx-Linq.2.2.2.nuspec | 26 + .../lib/net40/System.Reactive.Linq.XML | 10724 +++++++++++++++ .../lib/net40/System.Reactive.Linq.dll | Bin 0 -> 701160 bytes .../lib/net45/System.Reactive.Linq.XML | 10779 ++++++++++++++++ .../lib/net45/System.Reactive.Linq.dll | Bin 0 -> 705768 bytes .../System.Reactive.Linq.XML | 10724 +++++++++++++++ .../System.Reactive.Linq.dll | Bin 0 -> 701160 bytes .../System.Reactive.Linq.XML | 10779 ++++++++++++++++ .../System.Reactive.Linq.dll | Bin 0 -> 706280 bytes .../lib/sl5/System.Reactive.Linq.XML | 10724 +++++++++++++++ .../lib/sl5/System.Reactive.Linq.dll | Bin 0 -> 701160 bytes .../lib/windows8/System.Reactive.Linq.XML | 10779 ++++++++++++++++ .../lib/windows8/System.Reactive.Linq.dll | Bin 0 -> 706280 bytes .../windowsphone71/System.Reactive.Linq.XML | 7748 +++++++++++ .../windowsphone71/System.Reactive.Linq.dll | Bin 0 -> 402664 bytes .../windowsphone8/System.Reactive.Linq.XML | 10779 ++++++++++++++++ .../windowsphone8/System.Reactive.Linq.dll | Bin 0 -> 705256 bytes .../Rx-Main.2.2.2/Rx-Main.2.2.2.nupkg | Bin 0 -> 2730 bytes .../Rx-Main.2.2.2/Rx-Main.2.2.2.nuspec | 24 + .../Rx-PlatformServices.2.2.3.nupkg | Bin 0 -> 196463 bytes .../Rx-PlatformServices.2.2.3.nuspec | 26 + .../System.Reactive.PlatformServices.XML | 378 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 38128 bytes .../System.Reactive.PlatformServices.XML | 378 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 38640 bytes .../System.Reactive.PlatformServices.XML | 286 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 34024 bytes .../System.Reactive.PlatformServices.XML | 304 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 35056 bytes .../sl5/System.Reactive.PlatformServices.XML | 354 + .../sl5/System.Reactive.PlatformServices.dll | Bin 0 -> 38640 bytes .../System.Reactive.PlatformServices.XML | 376 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 40680 bytes .../System.Reactive.PlatformServices.XML | 311 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 40680 bytes .../System.Reactive.PlatformServices.XML | 378 + .../System.Reactive.PlatformServices.dll | Bin 0 -> 38640 bytes .../packages/Rx-WPF.2.2.2/Rx-WPF.2.2.2.nupkg | Bin 0 -> 2730 bytes .../packages/Rx-WPF.2.2.2/Rx-WPF.2.2.2.nuspec | 22 + .../Rx-Xaml.2.2.2/Rx-Xaml.2.2.2.nupkg | Bin 0 -> 112235 bytes .../Rx-Xaml.2.2.2/Rx-Xaml.2.2.2.nuspec | 25 + .../System.Reactive.Windows.Threading.XML | 196 + .../System.Reactive.Windows.Threading.dll | Bin 0 -> 28904 bytes .../System.Reactive.Windows.Threading.XML | 285 + .../System.Reactive.Windows.Threading.dll | Bin 0 -> 29928 bytes .../sl5/System.Reactive.Windows.Threading.XML | 196 + .../sl5/System.Reactive.Windows.Threading.dll | Bin 0 -> 28904 bytes .../System.Reactive.Windows.Threading.XML | 256 + .../System.Reactive.Windows.Threading.dll | Bin 0 -> 29928 bytes .../System.Reactive.Windows.Threading.XML | 196 + .../System.Reactive.Windows.Threading.dll | Bin 0 -> 28904 bytes .../System.Reactive.Windows.Threading.XML | 196 + .../System.Reactive.Windows.Threading.dll | Bin 0 -> 28904 bytes Chocolatey.Gui/packages/repositories.config | 4 + 324 files changed, 253321 insertions(+) create mode 100644 Chocolatey.Gui/App.xaml create mode 100644 Chocolatey.Gui/App.xaml.cs create mode 100644 Chocolatey.Gui/Base/ObservableBase.cs create mode 100644 Chocolatey.Gui/Chocolatey.Gui.csproj create mode 100644 Chocolatey.Gui/Chocolatey.Gui.sln create mode 100644 Chocolatey.Gui/Chocolatey.Gui.sln.DotSettings create mode 100644 Chocolatey.Gui/ConfigurationSection.cs create mode 100644 Chocolatey.Gui/Controls/FauxPowerShellConsole.cs create mode 100644 Chocolatey.Gui/Controls/ObservableRingBuffer.cs create mode 100644 Chocolatey.Gui/Models/PowerShellOutputLine.cs create mode 100644 Chocolatey.Gui/Models/SemanticVersion.cs create mode 100644 Chocolatey.Gui/Models/SourceModel.cs create mode 100644 Chocolatey.Gui/Properties/AssemblyInfo.cs create mode 100644 Chocolatey.Gui/Properties/Resources.Designer.cs create mode 100644 Chocolatey.Gui/Properties/Resources.resx create mode 100644 Chocolatey.Gui/Properties/Settings.Designer.cs create mode 100644 Chocolatey.Gui/Properties/Settings.settings create mode 100644 Chocolatey.Gui/Resources/Controls.xaml create mode 100644 Chocolatey.Gui/Resources/Entypo-license.txt create mode 100644 Chocolatey.Gui/Resources/Entypo.ttf create mode 100644 Chocolatey.Gui/Resources/Icons.xaml create mode 100644 Chocolatey.Gui/Resources/SourceSansPro-Regular.otf create mode 100644 Chocolatey.Gui/Utilities/Converters/BooleanToVisibility.cs create mode 100644 Chocolatey.Gui/Utilities/Converters/LongSizeToFileSizeString.cs create mode 100644 Chocolatey.Gui/Utilities/Converters/NullToVisibility.cs create mode 100644 Chocolatey.Gui/Utilities/Converters/PackageDependenciesToString.cs create mode 100644 Chocolatey.Gui/Utilities/Converters/UriToVisibility.cs create mode 100644 Chocolatey.Gui/Utilities/NativeMethods.cs create mode 100644 Chocolatey.Gui/ViewModels/Items/IPackageViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Items/PackageViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Pages/ILocalSourcePageViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Pages/IRemoteSourcePageViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Pages/LocalSourcePageViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Pages/RemoteSourcePageViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Windows/IMainWindowViewModel.cs create mode 100644 Chocolatey.Gui/ViewModels/Windows/MainWindowViewModel.cs create mode 100644 Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml create mode 100644 Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml.cs create mode 100644 Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml create mode 100644 Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml.cs create mode 100644 Chocolatey.Gui/Views/Windows/MainWindow.xaml create mode 100644 Chocolatey.Gui/Views/Windows/MainWindow.xaml.cs create mode 100644 Chocolatey.Gui/app.config create mode 100644 Chocolatey.Gui/packages.config create mode 100644 Chocolatey.Gui/packages/Autofac.3.3.0/Autofac.3.3.0.nupkg create mode 100644 Chocolatey.Gui/packages/Autofac.3.3.0/lib/net40/Autofac.dll create mode 100644 Chocolatey.Gui/packages/Autofac.3.3.0/lib/net40/Autofac.xml create mode 100644 Chocolatey.Gui/packages/Autofac.3.3.0/lib/portable-win+net40+sl50+wp8/Autofac.dll create mode 100644 Chocolatey.Gui/packages/Autofac.3.3.0/lib/portable-win+net40+sl50+wp8/Autofac.xml create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/MahApps.Metro.0.12.1.0.nupkg create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/lib/net40/MahApps.Metro.XML create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/lib/net40/MahApps.Metro.dll create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/lib/net40/System.Windows.Interactivity.dll create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/lib/net45/MahApps.Metro.XML create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/lib/net45/MahApps.Metro.dll create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/lib/net45/System.Windows.Interactivity.dll create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.0.12.1.0/tools/install.ps1 create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.Resources.0.1.0.1/MahApps.Metro.Resources.0.1.0.1.nupkg create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.Resources.0.1.0.1/MahApps.Metro.Resources.0.1.0.1.nuspec create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.Resources.0.1.0.1/content/Resources/Entypo-license.txt create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.Resources.0.1.0.1/content/Resources/Entypo.ttf create mode 100644 Chocolatey.Gui/packages/MahApps.Metro.Resources.0.1.0.1/content/Resources/Icons.xaml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/License-Stable.rtf create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/Microsoft.Bcl.1.1.6.nupkg create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/Microsoft.Bcl.1.1.6.nuspec create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/net45/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/portable-net45+win8+wp8/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/portable-net451+win81/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/sl4/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/sl5/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/win8/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/content/wp8/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net40/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/net45/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp71/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8+wp8/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl4+win8/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+sl5+win8+wp8/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8+wp8/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net40+win8/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net45+win8+wp8/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/portable-net451+win81/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4-windowsphone71/ensureRedirect.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl4/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl5/System.IO.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl5/System.IO.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl5/System.Runtime.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl5/System.Runtime.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl5/System.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/sl5/System.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/win8/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.1.1.6/lib/wp8/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/License-Stable.rtf create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/Microsoft.Bcl.Async.1.0.165.nupkg create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/Microsoft.Bcl.Async.1.0.165.nuspec create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net40/Microsoft.Threading.Tasks.Extensions.Desktop.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net40/Microsoft.Threading.Tasks.Extensions.Desktop.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net40/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net40/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net40/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net40/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net45/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net45/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net45/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/net45/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net40+sl4+win8+wp71/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net40+sl4+win8+wp71/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net40+sl4+win8+wp71/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net40+sl4+win8+wp71/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8+wp8/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8+wp8/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8+wp8/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8+wp8/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/portable-net45+win8/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4-windowsphone71/Microsoft.Threading.Tasks.Extensions.Phone.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4-windowsphone71/Microsoft.Threading.Tasks.Extensions.Phone.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4-windowsphone71/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4-windowsphone71/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4-windowsphone71/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4-windowsphone71/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4/Microsoft.Threading.Tasks.Extensions.Silverlight.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4/Microsoft.Threading.Tasks.Extensions.Silverlight.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/sl4/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/win8/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/win8/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/win8/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/win8/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/wp8/Microsoft.Threading.Tasks.Extensions.Phone.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/wp8/Microsoft.Threading.Tasks.Extensions.Phone.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/wp8/Microsoft.Threading.Tasks.Extensions.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/wp8/Microsoft.Threading.Tasks.Extensions.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/wp8/Microsoft.Threading.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Async.1.0.165/lib/wp8/Microsoft.Threading.Tasks.xml create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/License-Stable.rtf create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/Microsoft.Bcl.Build.1.0.13.nupkg create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/Microsoft.Bcl.Build.1.0.13.nuspec create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/content/net40/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/content/netcore45/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/content/portable-net40+win8+sl4+wp71/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/content/sl4-windowsphone71/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/content/sl4/_._ create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/tools/Install.ps1 create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/tools/Microsoft.Bcl.Build.Tasks.dll create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/tools/Microsoft.Bcl.Build.targets create mode 100644 Chocolatey.Gui/packages/Microsoft.Bcl.Build.1.0.13/tools/Uninstall.ps1 create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/Ninject.3.0.1.10.nupkg create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/Ninject.3.0.1.10.nuspec create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net35/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net35/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net35/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net40/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net40/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net40/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net45-full/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net45-full/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/net45-full/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl2/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl2/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl2/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl3-wp/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl3-wp/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl3-wp/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl3/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl3/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl3/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl4-windowsphone71/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl4-windowsphone71/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl4-windowsphone71/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl4/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl4/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl4/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl5/Ninject.dll create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl5/Ninject.pdb create mode 100644 Chocolatey.Gui/packages/Ninject.3.0.1.10/lib/sl5/Ninject.xml create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/Rx-Core.2.2.2.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/Rx-Core.2.2.2.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/net40/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/net40/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/net45/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/net45/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/portable-net40+sl5+win8+wp8/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/portable-net40+sl5+win8+wp8/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/portable-windows8+net45+wp8/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/portable-windows8+net45+wp8/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/sl5/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/sl5/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/windows8/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/windows8/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/windowsphone71/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/windowsphone71/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/windowsphone8/System.Reactive.Core.XML create mode 100644 Chocolatey.Gui/packages/Rx-Core.2.2.2/lib/windowsphone8/System.Reactive.Core.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/Rx-Interfaces.2.2.2.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/Rx-Interfaces.2.2.2.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/net40/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/net40/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/net45/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/net45/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/portable-net40+sl5+win8+wp8/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/portable-net40+sl5+win8+wp8/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/portable-windows8+net45+wp8/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/portable-windows8+net45+wp8/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/sl5/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/sl5/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/windows8/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/windows8/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/windowsphone71/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/windowsphone71/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/windowsphone8/System.Reactive.Interfaces.XML create mode 100644 Chocolatey.Gui/packages/Rx-Interfaces.2.2.2/lib/windowsphone8/System.Reactive.Interfaces.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/Rx-Linq.2.2.2.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/Rx-Linq.2.2.2.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/net40/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/net40/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/net45/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/net45/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/portable-net40+sl5+win8+wp8/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/portable-net40+sl5+win8+wp8/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/portable-windows8+net45+wp8/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/portable-windows8+net45+wp8/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/sl5/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/sl5/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/windows8/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/windows8/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/windowsphone71/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/windowsphone71/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/windowsphone8/System.Reactive.Linq.XML create mode 100644 Chocolatey.Gui/packages/Rx-Linq.2.2.2/lib/windowsphone8/System.Reactive.Linq.dll create mode 100644 Chocolatey.Gui/packages/Rx-Main.2.2.2/Rx-Main.2.2.2.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-Main.2.2.2/Rx-Main.2.2.2.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/Rx-PlatformServices.2.2.3.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/Rx-PlatformServices.2.2.3.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/net40/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/net40/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/net45/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/net45/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/portable-net40+sl5+win8+wp8/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/portable-net40+sl5+win8+wp8/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/portable-windows8+net45+wp8/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/portable-windows8+net45+wp8/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/sl5/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/sl5/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/windows8/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/windows8/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/windowsphone71/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/windowsphone71/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/windowsphone8/System.Reactive.PlatformServices.XML create mode 100644 Chocolatey.Gui/packages/Rx-PlatformServices.2.2.3/lib/windowsphone8/System.Reactive.PlatformServices.dll create mode 100644 Chocolatey.Gui/packages/Rx-WPF.2.2.2/Rx-WPF.2.2.2.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-WPF.2.2.2/Rx-WPF.2.2.2.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/Rx-Xaml.2.2.2.nupkg create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/Rx-Xaml.2.2.2.nuspec create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/net40/System.Reactive.Windows.Threading.XML create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/net40/System.Reactive.Windows.Threading.dll create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/net45/System.Reactive.Windows.Threading.XML create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/net45/System.Reactive.Windows.Threading.dll create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/sl5/System.Reactive.Windows.Threading.XML create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/sl5/System.Reactive.Windows.Threading.dll create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/windows8/System.Reactive.Windows.Threading.XML create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/windows8/System.Reactive.Windows.Threading.dll create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/windowsphone71/System.Reactive.Windows.Threading.XML create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/windowsphone71/System.Reactive.Windows.Threading.dll create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/windowsphone8/System.Reactive.Windows.Threading.XML create mode 100644 Chocolatey.Gui/packages/Rx-Xaml.2.2.2/lib/windowsphone8/System.Reactive.Windows.Threading.dll create mode 100644 Chocolatey.Gui/packages/repositories.config diff --git a/Chocolatey.Gui/App.xaml b/Chocolatey.Gui/App.xaml new file mode 100644 index 000000000..f2796111f --- /dev/null +++ b/Chocolatey.Gui/App.xaml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/Chocolatey.Gui/App.xaml.cs b/Chocolatey.Gui/App.xaml.cs new file mode 100644 index 000000000..c09e09b5b --- /dev/null +++ b/Chocolatey.Gui/App.xaml.cs @@ -0,0 +1,26 @@ +using Autofac; +using Chocolatey.Gui.ViewModels.Items; +using Chocolatey.Gui.ViewModels.Pages; +using Chocolatey.Gui.ViewModels.Windows; + +namespace Chocolatey.Gui +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App + { + internal static IContainer Container { get; set; } + + static App() + { + var builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + + Container = builder.Build(); + } + } +} diff --git a/Chocolatey.Gui/Base/ObservableBase.cs b/Chocolatey.Gui/Base/ObservableBase.cs new file mode 100644 index 000000000..bb2dc9e9b --- /dev/null +++ b/Chocolatey.Gui/Base/ObservableBase.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; +namespace Chocolatey.Gui.Base +{ + public abstract class ObservableBase : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public void SetPropertyValue(ref T property, T value, [CallerMemberName] string propertyName = "") + { + if (EqualityComparer.Default.Equals(property, value)) + { + return; + } + property = value; + NotifyPropertyChanged(propertyName); + } + + public void NotifyPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} diff --git a/Chocolatey.Gui/Chocolatey.Gui.csproj b/Chocolatey.Gui/Chocolatey.Gui.csproj new file mode 100644 index 000000000..7b4ebe36e --- /dev/null +++ b/Chocolatey.Gui/Chocolatey.Gui.csproj @@ -0,0 +1,209 @@ + + + + + Debug + AnyCPU + {851FC2F6-AFB0-4153-8520-BF68E1BEA3CB} + WinExe + Properties + Chocolatey.Gui + Chocolatey.Gui + v4.0 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + packages\Autofac.3.3.0\lib\net40\Autofac.dll + + + False + packages\MahApps.Metro.0.12.1.0\lib\net40\MahApps.Metro.dll + + + packages\Microsoft.Bcl.Async.1.0.165\lib\net40\Microsoft.Threading.Tasks.dll + + + packages\Microsoft.Bcl.Async.1.0.165\lib\net40\Microsoft.Threading.Tasks.Extensions.dll + + + packages\Microsoft.Bcl.Async.1.0.165\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll + + + packages\Ninject.3.0.1.10\lib\net40\Ninject.dll + + + + + + packages\Microsoft.Bcl.1.1.6\lib\net40\System.IO.dll + + + + packages\Rx-Core.2.2.2\lib\net40\System.Reactive.Core.dll + + + packages\Rx-Interfaces.2.2.2\lib\net40\System.Reactive.Interfaces.dll + + + packages\Rx-Linq.2.2.2\lib\net40\System.Reactive.Linq.dll + + + packages\Rx-PlatformServices.2.2.3\lib\net40\System.Reactive.PlatformServices.dll + + + packages\Rx-XAML.2.2.2\lib\net40\System.Reactive.Windows.Threading.dll + + + packages\Microsoft.Bcl.1.1.6\lib\net40\System.Runtime.dll + + + packages\Microsoft.Bcl.1.1.6\lib\net40\System.Threading.Tasks.dll + + + packages\MahApps.Metro.0.12.1.0\lib\net40\System.Windows.Interactivity.dll + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + + + + + + + + + + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + + + + + + + + + + RemoteSourcePage.xaml + + + LocalSourcePage.xaml + + + MainWindow.xaml + Code + + + MSBuild:Compile + Designer + + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + PreserveNewest + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chocolatey.Gui/Chocolatey.Gui.sln b/Chocolatey.Gui/Chocolatey.Gui.sln new file mode 100644 index 000000000..d6e441df2 --- /dev/null +++ b/Chocolatey.Gui/Chocolatey.Gui.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chocolatey.Gui", "Chocolatey.Gui.csproj", "{851FC2F6-AFB0-4153-8520-BF68E1BEA3CB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {851FC2F6-AFB0-4153-8520-BF68E1BEA3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {851FC2F6-AFB0-4153-8520-BF68E1BEA3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {851FC2F6-AFB0-4153-8520-BF68E1BEA3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {851FC2F6-AFB0-4153-8520-BF68E1BEA3CB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Chocolatey.Gui/Chocolatey.Gui.sln.DotSettings b/Chocolatey.Gui/Chocolatey.Gui.sln.DotSettings new file mode 100644 index 000000000..584d2d000 --- /dev/null +++ b/Chocolatey.Gui/Chocolatey.Gui.sln.DotSettings @@ -0,0 +1,2 @@ + + UI \ No newline at end of file diff --git a/Chocolatey.Gui/ConfigurationSection.cs b/Chocolatey.Gui/ConfigurationSection.cs new file mode 100644 index 000000000..afa4e4d3b --- /dev/null +++ b/Chocolatey.Gui/ConfigurationSection.cs @@ -0,0 +1,45 @@ +using System.Configuration; + +namespace Chocolatey.Gui +{ + public class ChocoConfigurationSection : ConfigurationSection + { + [ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)] + public SourcesCollection Sources + { + get { return (SourcesCollection) this[""]; } + set { this[""] = value; } + } + } + + public class SourcesCollection : ConfigurationElementCollection + { + + protected override ConfigurationElement CreateNewElement() + { + return new SourceElement(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((SourceElement) element).Name; + } + } + + public class SourceElement : ConfigurationElement + { + [ConfigurationProperty("Name", IsKey = true, IsRequired = true)] + public string Name + { + get { return (string)base["Name"]; } + set { base["Name"] = value; } + } + + [ConfigurationProperty("Url", IsKey = true, IsRequired = true)] + public string Url + { + get { return (string)base["Url"]; } + set { base["Url"] = value; } + } + } +} diff --git a/Chocolatey.Gui/Controls/FauxPowerShellConsole.cs b/Chocolatey.Gui/Controls/FauxPowerShellConsole.cs new file mode 100644 index 000000000..de80704cd --- /dev/null +++ b/Chocolatey.Gui/Controls/FauxPowerShellConsole.cs @@ -0,0 +1,142 @@ +using Chocolatey.Gui.Models; +using System; +using System.Collections.Specialized; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Media; + +namespace Chocolatey.Gui.Controls +{ + /// + /// Fake PowerShell Output Console + /// + public class FauxPowerShellConsole : RichTextBox + { + /// + /// The input buffer the console writes to the text box + /// + public static readonly DependencyProperty BufferProperty = DependencyProperty.Register("Buffer", typeof(ObservableRingBuffer), typeof(FauxPowerShellConsole), + new FrameworkPropertyMetadata { DefaultValue = null, PropertyChangedCallback = OnBufferChanged, BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }); + + private ObservableRingBuffer _oldBuffer; + public ObservableRingBuffer Buffer + { + get { return GetValue>(BufferProperty); } + set { SetValue(BufferProperty, value); } + } + + /// + /// Creates a unique identifier for each text line. + /// + private readonly Func _getNameHash; + + /// + /// The container paragraph for all the console's text. + /// + private readonly Paragraph _backingParagraph; + + public FauxPowerShellConsole() : base(new FlowDocument()) + { + var hashAlg = MD5.Create(); + _getNameHash = (unhashed) => "_" + hashAlg.ComputeHash(Encoding.UTF8.GetBytes(unhashed)).Aggregate(new StringBuilder(), (sb, piece) => sb.Append(piece.ToString("X2"))).ToString(); + + _backingParagraph = new Paragraph(); + Document.Blocks.Add(_backingParagraph); + } + + + private static void OnBufferChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) + { + var pob = d as FauxPowerShellConsole; + if (pob != null) + pob.OnBufferChanged(args); + } + + private void OnBufferChanged(DependencyPropertyChangedEventArgs args) + { + if (_oldBuffer != null) + _oldBuffer.CollectionChanged -= OnBufferUpdated; + + _oldBuffer = Buffer; + Buffer.CollectionChanged += OnBufferUpdated; + OnBufferUpdated(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } + + + private delegate void RunOnUI(); + private delegate void RunStringOnUI(PowerShellOutputLine line); + + protected void OnBufferUpdated(object sender, NotifyCollectionChangedEventArgs args) + { + switch (args.Action) + { + case NotifyCollectionChangedAction.Reset: + Application.Current.Dispatcher.Invoke(new RunOnUI(() => _backingParagraph.Inlines.Clear())); + break; + case NotifyCollectionChangedAction.Add: + if (args.NewItems.Count == 1 && args.NewStartingIndex > 0) + { + Application.Current.Dispatcher.BeginInvoke(new RunStringOnUI(item => + { + var run = new Run + { + Text = item.Text + Environment.NewLine, + Name = _getNameHash(item.Text), + Foreground = item.Type == PowerShellLineType.Output ? Brushes.White : Brushes.Red, + Background = item.Type == PowerShellLineType.Output ? Brushes.Transparent : Brushes.Black + }; + + var beforeString = Buffer[args.NewStartingIndex - 1].Text; + var key = _getNameHash(beforeString); + var beforeRun = _backingParagraph.Inlines.FirstOrDefault(inline => inline.Name == key); + if (beforeRun != null) + _backingParagraph.Inlines.InsertAfter(beforeRun, run); + else + _backingParagraph.Inlines.Add(run); + + Selection.Select(run.ContentStart, run.ContentEnd); + }), args.NewItems[0]); + } + foreach (PowerShellOutputLine item in args.NewItems) + { + Application.Current.Dispatcher.BeginInvoke(new RunStringOnUI(line => + { + var run = new Run + { + Text = line.Text + Environment.NewLine, + Name = _getNameHash(line.Text), + Foreground = line.Type == PowerShellLineType.Output ? Brushes.White : Brushes.Red, + Background = line.Type == PowerShellLineType.Output ? Brushes.Transparent : Brushes.Black + }; + + _backingParagraph.Inlines.Add(run); + Selection.Select(run.ContentStart, run.ContentEnd); + }), item); + } + break; + case NotifyCollectionChangedAction.Remove: + foreach (PowerShellOutputLine item in args.OldItems) + { + Application.Current.Dispatcher.BeginInvoke(new RunStringOnUI(line => + { + var key = _getNameHash(line.Text); + var run = _backingParagraph.Inlines.FirstOrDefault(inline => inline.Name == key); + if (run != null) + _backingParagraph.Inlines.Remove(run); + }), item); + } + break; + } + } + + protected T GetValue(DependencyProperty dp) + { + return (T)GetValue(dp); + } + } +} diff --git a/Chocolatey.Gui/Controls/ObservableRingBuffer.cs b/Chocolatey.Gui/Controls/ObservableRingBuffer.cs new file mode 100644 index 000000000..efba55e72 --- /dev/null +++ b/Chocolatey.Gui/Controls/ObservableRingBuffer.cs @@ -0,0 +1,314 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.Diagnostics; +using System.Collections.Specialized; + +namespace Chocolatey.Gui.Controls +{ + /// + /// Represents a fixted length ring buffer to store a specified maximal count of items within. + /// + /// The generic type of the items stored within the ring buffer. + [DebuggerDisplay("Count = {Count}")] + public class ObservableRingBuffer : INotifyCollectionChanged, IList, ICollection, + IEnumerable, IEnumerable { + /// + /// Creates a new instance of a with a + /// specified cache size. + /// + /// The maximal count of items to be stored within + /// the ring buffer. + public ObservableRingBuffer(int capacity) + { + // validate capacity + if (capacity <= 0) + throw new ArgumentException("Must be greater than zero", "capacity"); + // set capacity and init the cache + Capacity = capacity; + _buffer = new T[capacity]; + } + + /// + /// the internal buffer + /// + T[] _buffer; + /// + /// The all-over position within the ring buffer. The position + /// increases continously by adding new items to the buffer. This + /// value is needed to calculate the current relative position within the + /// buffer. + /// + int _position; + /// + /// The current version of the buffer, this is required for a correct + /// exception handling while enumerating over the items of the buffer. + /// + long _version; + + /// + /// Gets or sets an item for a specified position within the ring buffer. + /// + /// The position to get or set an item. + /// The fond item at the specified position within the ring buffer. + /// + /// + public T this[int index] { + get { + // validate the index + if (index < 0 || index >= Count) + throw new IndexOutOfRangeException(); + // calculate the relative position within the rolling base array + int index2 = (_position - Count + index) % Capacity; + return _buffer[index2]; + } + set { Insert(index, value); } + } + + /// + /// Gets the maximal count of items within the ring buffer. + /// + public int Capacity { get; private set; } + /// + /// Get the current count of items within the ring buffer. + /// + public int Count { get; private set; } + + /// + /// Adds a new item to the buffer. + /// + /// The item to be added to the buffer. + public void Add(T item) { + // add a new item to the current relative position within the + // buffer and increase the position + var index = _position++ % Capacity; + if (_buffer[index] != null) + { + NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, _buffer[index])); + } + _buffer[index] = item; + // increase the count if capacity is not yet reached + if (Count < Capacity) Count++; + // buffer changed; next version + _version++; + NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); + } + + /// + /// Clears the whole buffer and releases all referenced objects + /// currently stored within the buffer. + /// + public void Clear() { + for (int i = 0; i < Count; i++) + _buffer[i] = default(T); + _position = 0; + Count = 0; + _version++; + NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } + + /// + /// Determines if a specified item is currently present within + /// the buffer. + /// + /// The item to search for within the current + /// buffer. + /// True if the specified item is currently present within + /// the buffer; otherwise false. + public bool Contains(T item) { + int index = IndexOf(item); + return index != -1; + } + + /// + /// Copies the current items within the buffer to a specified array. + /// + /// The target array to copy the items of + /// the buffer to. + /// The start position witihn the target + /// array to start copying. + public void CopyTo(T[] array, int arrayIndex) { + for (int i = 0; i < Count; i++) { + array[i + arrayIndex] = _buffer[(_position - Count + i) % Capacity]; + } + } + + /// + /// Gets an enumerator over the current items within the buffer. + /// + /// An enumerator over the current items within the buffer. + /// + public IEnumerator GetEnumerator() { + long version = _version; + for (int i = 0; i < Count; i++) { + if (version != _version) + throw new InvalidOperationException("Collection changed"); + yield return this[i]; + } + } + + /// + /// Gets the position of a specied item within the ring buffer. + /// + /// The item to get the current position for. + /// The zero based index of the found item within the + /// buffer. If the item was not present within the buffer, this + /// method returns -1. + public int IndexOf(T item) { + // loop over the current count of items + for (int i = 0; i < Count; i++) { + // get the item at the relative position within the internal array + T item2 = _buffer[(_position - Count + i) % Capacity]; + // if both items are null, return true + if (null == item && null == item2) + return i; + // if equal return the position + if (item != null && item.Equals(item2)) + return i; + } + // nothing found + return -1; + } + + /// + /// Inserts an item at a specified position into the buffer. + /// + /// The position within the buffer to add + /// the new item. + /// The new item to be added to the buffer. + /// + /// + /// If the specified index is equal to the current count of items + /// within the buffer, the specified item will be added. + /// + /// Warning + /// Frequent usage of this method might become a bad idea if you are + /// working with a large buffer capacity. The insertion of an item + /// at a specified position within the buffer causes causes all present + /// items below the specified position to be moved one position. + /// + public void Insert(int index, T item) { + // validate index + if (index < 0 || index > Count) + throw new IndexOutOfRangeException(); + // add if index equals to count + if (index == Count) { + Add(item); + return; + } + + // get the maximal count of items to be moved + int count = Math.Min(Count, Capacity - 1) - index; + // get the relative position of the new item within the buffer + int index2 = (_position - Count + index) % Capacity; + + // move all items below the specified position + for (int i = index2 + count; i > index2; i--) { + int to = i % Capacity; + int from = (i - 1) % Capacity; + _buffer[to] = _buffer[from]; + } + + // set the new item + _buffer[index2] = item; + + // adjust storage information + if (Count < Capacity) { + Count++; + _position++; + } + // buffer changed; next version + _version++; + NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index)); + } + + /// + /// Removes a specified item from the current buffer. + /// + /// The item to be removed. + /// True if the specified item was successfully removed + /// from the buffer; otherwise false. + /// + /// Warning + /// Frequent usage of this method might become a bad idea if you are + /// working with a large buffer capacity. The removing of an item + /// requires a scan of the buffer to get the position of the specified + /// item. If the item was found, the deletion requires a move of all + /// items stored abouve the found position. + /// + public bool Remove(T item) { + // find the position of the specified item + int index = IndexOf(item); + // item was not found; return false + if (index == -1) + return false; + // remove the item at the specified position + RemoveAt(index); + NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item)); + return true; + } + + /// + /// Removes an item at a specified position within the buffer. + /// + /// The position of the item to be removed. + /// + /// + /// Warning + /// Frequent usage of this method might become a bad idea if you are + /// working with a large buffer capacity. The deletion requires a move + /// of all items stored abouve the found position. + /// + public void RemoveAt(int index) { + // validate the index + if (index < 0 || index >= Count) + throw new IndexOutOfRangeException(); + + // move all items above the specified position one step + // closer to zeri + for (int i = index; i < Count - 1; i++) { + // get the next relative target position of the item + int to = (_position - Count + i) % Capacity; + // get the next relative source position of the item + int from = (_position - Count + i + 1) % Capacity; + // move the item + _buffer[to] = _buffer[from]; + } + // get the relative position of the last item, which becomes empty + // after deletion and set the item as empty + int last = (_position - 1) % Capacity; + _buffer[last] = default(T); + // adjust storage information + _position--; + Count--; + // buffer changed; next version + _version++; + + NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove)); + } + + /// + /// Gets if the buffer is read-only. This method always returns false. + /// + bool ICollection.IsReadOnly { get { return false; } } + + /// + /// See generic implementation of . + /// + /// See generic implementation of . + /// + IEnumerator IEnumerable.GetEnumerator() { + return this.GetEnumerator(); + } + + private void NotifyCollectionChanged(NotifyCollectionChangedEventArgs args) + { + if (CollectionChanged != null) + { + CollectionChanged(this, args); + } + } + + public event NotifyCollectionChangedEventHandler CollectionChanged; + } +} diff --git a/Chocolatey.Gui/Models/PowerShellOutputLine.cs b/Chocolatey.Gui/Models/PowerShellOutputLine.cs new file mode 100644 index 000000000..e72370276 --- /dev/null +++ b/Chocolatey.Gui/Models/PowerShellOutputLine.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Chocolatey.Gui.Models +{ + public class PowerShellOutputLine + { + public string Text { get; set; } + public PowerShellLineType Type { get; set; } + } + + public enum PowerShellLineType + { + Output, + Error + } +} diff --git a/Chocolatey.Gui/Models/SemanticVersion.cs b/Chocolatey.Gui/Models/SemanticVersion.cs new file mode 100644 index 000000000..cfe5fc068 --- /dev/null +++ b/Chocolatey.Gui/Models/SemanticVersion.cs @@ -0,0 +1,253 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Text.RegularExpressions; + +// Full credit to the Nuget team for this implemenation! +using Chocolatey.Gui.Properties; + +namespace Chocolatey.Gui.Models +{ + [TypeConverter(typeof (SemanticVersionTypeConverter))] + [Serializable] + public sealed class SemanticVersion : IComparable, IComparable, IEquatable + { + private static readonly Regex SemanticVersionRegex = + new Regex("^(?\\d+(\\s*\\.\\s*\\d+){0,3})(?-[a-z][0-9a-z-]*)?$", + RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled); + + private static readonly Regex StrictSemanticVersionRegex = + new Regex("^(?\\d+(\\.\\d+){2})(?-[a-z][0-9a-z-]*)?$", + RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled); + + private readonly string _originalString; + + public Version Version { get; private set; } + + public string SpecialVersion { get; private set; } + + static SemanticVersion() + { + } + + public SemanticVersion(string version) + : this(SemanticVersion.Parse(version)) + { + _originalString = version; + } + + public SemanticVersion(int major, int minor, int build, int revision) + : this(new Version(major, minor, build, revision)) + { + } + + public SemanticVersion(int major, int minor, int build, string specialVersion) + : this(new Version(major, minor, build), specialVersion) + { + } + + public SemanticVersion(Version version) + : this(version, string.Empty) + { + } + + public SemanticVersion(Version version, string specialVersion) + : this(version, specialVersion, null) + { + } + + private SemanticVersion(Version version, string specialVersion, string originalString) + { + if (version == null) + throw new ArgumentNullException("version"); + + Version = NormalizeVersionValue(version); + + SpecialVersion = specialVersion ?? string.Empty; + _originalString = string.IsNullOrEmpty(originalString) + ? version + (!string.IsNullOrEmpty(specialVersion) ? "-" + specialVersion : null) + : originalString; + } + + internal SemanticVersion(SemanticVersion semVer) + { + _originalString = semVer.ToString(); + Version = semVer.Version; + SpecialVersion = semVer.SpecialVersion; + } + + public static bool operator ==(SemanticVersion version1, SemanticVersion version2) + { + if (version1 == null) + return version2 == null; + + return version1.Equals(version2); + } + + public static bool operator !=(SemanticVersion version1, SemanticVersion version2) + { + return !(version1 == version2); + } + + public static bool operator <(SemanticVersion version1, SemanticVersion version2) + { + if (version1 == null) + throw new ArgumentNullException("version1"); + + return version1.CompareTo(version2) < 0; + } + + public static bool operator <=(SemanticVersion version1, SemanticVersion version2) + { + if (!(version1 == version2)) + return version1 < version2; + + return true; + } + + public static bool operator >(SemanticVersion version1, SemanticVersion version2) + { + if (version1 == null) + throw new ArgumentNullException("version1"); + + return version2 < version1; + } + + public static bool operator >=(SemanticVersion version1, SemanticVersion version2) + { + if (!(version1 == version2)) + return version1 > version2; + + return true; + } + + public static SemanticVersion Parse(string version) + { + if (string.IsNullOrEmpty(version)) + throw new ArgumentException(Resources.Argument_cant_be_null_or_empty, "version"); + + SemanticVersion semanticVersion; + if (TryParse(version, out semanticVersion)) + return semanticVersion; + + throw new ArgumentException( + string.Format(CultureInfo.CurrentCulture, Resources.InvalidVersionString, new object[1] + { + version + }), "version"); + } + + public static bool TryParse(string version, out SemanticVersion value) + { + return TryParseInternal(version, SemanticVersionRegex, out value); + } + + public static bool TryParseStrict(string version, out SemanticVersion value) + { + return TryParseInternal(version, StrictSemanticVersionRegex, out value); + } + + private static bool TryParseInternal(string version, Regex regex, out SemanticVersion semVer) + { + semVer = null; + if (string.IsNullOrEmpty(version)) + return false; + + var match = regex.Match(version.Trim()); + Version result; + if (!match.Success || !Version.TryParse(match.Groups["Version"].Value, out result)) + return false; + + semVer = new SemanticVersion(NormalizeVersionValue(result), + match.Groups["Release"].Value.TrimStart(new [] + { + '-' + }), version.Replace(" ", "")); + return true; + } + + public static SemanticVersion ParseOptionalVersion(string version) + { + SemanticVersion semanticVersion; + TryParse(version, out semanticVersion); + return semanticVersion; + } + + private static Version NormalizeVersionValue(Version version) + { + return new Version(version.Major, version.Minor, Math.Max(version.Build, 0), Math.Max(version.Revision, 0)); + } + + public int CompareTo(object obj) + { + if (obj == null) + return 1; + + var other = obj as SemanticVersion; + if (other == null) + throw new ArgumentException(Resources.TypeMustBeASemanticVersion, "obj"); + + return CompareTo(other); + } + + public int CompareTo(SemanticVersion other) + { + if (other == null) + return 1; + var num = Version.CompareTo(other.Version); + if (num != 0) + return num; + var thisSvNull = string.IsNullOrEmpty(SpecialVersion); + var otherSvNull = string.IsNullOrEmpty(other.SpecialVersion); + if (thisSvNull && otherSvNull) + return 0; + if (thisSvNull) + return 1; + if (otherSvNull) + return -1; + return StringComparer.OrdinalIgnoreCase.Compare(SpecialVersion, other.SpecialVersion); + } + + public override string ToString() + { + return _originalString; + } + + public bool Equals(SemanticVersion other) + { + if (other != null && Version == other.Version) + return SpecialVersion.Equals(other.SpecialVersion, StringComparison.OrdinalIgnoreCase); + return false; + } + + public override bool Equals(object obj) + { + var other = obj as SemanticVersion; + return other != null && Equals(other); + } + + private const long BaseCombinedHash64 = 5381L; + private readonly Func _addIntToHash = (obj, hashCode) => (hashCode << 5) + hashCode ^ (long)(obj != null ? obj.GetHashCode() : 0); + public override int GetHashCode() + { + return _addIntToHash(SpecialVersion, _addIntToHash(Version, BaseCombinedHash64)).GetHashCode(); + } + } + + public class SemanticVersionTypeConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + return sourceType == typeof(string); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + var version = value as string; + SemanticVersion semanticVersion; + if (version != null && SemanticVersion.TryParse(version, out semanticVersion)) + return semanticVersion; + return null; + } + } +} diff --git a/Chocolatey.Gui/Models/SourceModel.cs b/Chocolatey.Gui/Models/SourceModel.cs new file mode 100644 index 000000000..5cfb28969 --- /dev/null +++ b/Chocolatey.Gui/Models/SourceModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Chocolatey.Gui.Base; + +namespace Chocolatey.Gui.Models +{ + public class SourceModel + { + public string Name { get; set; } + public string Url { get; set; } + } +} diff --git a/Chocolatey.Gui/Properties/AssemblyInfo.cs b/Chocolatey.Gui/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..49cfdf927 --- /dev/null +++ b/Chocolatey.Gui/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Chocolatey.Gui")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Chocolatey.Gui")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Chocolatey.Gui/Properties/Resources.Designer.cs b/Chocolatey.Gui/Properties/Resources.Designer.cs new file mode 100644 index 000000000..e4eeb37c1 --- /dev/null +++ b/Chocolatey.Gui/Properties/Resources.Designer.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Chocolatey.Gui.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Chocolatey.Gui.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Argument can't be null or empty.. + /// + internal static string Argument_cant_be_null_or_empty { + get { + return ResourceManager.GetString("Argument_cant_be_null_or_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid version string.. + /// + internal static string InvalidVersionString { + get { + return ResourceManager.GetString("InvalidVersionString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type must be a semantic version.. + /// + internal static string TypeMustBeASemanticVersion { + get { + return ResourceManager.GetString("TypeMustBeASemanticVersion", resourceCulture); + } + } + } +} diff --git a/Chocolatey.Gui/Properties/Resources.resx b/Chocolatey.Gui/Properties/Resources.resx new file mode 100644 index 000000000..034c45acf --- /dev/null +++ b/Chocolatey.Gui/Properties/Resources.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Argument can't be null or empty. + + + Invalid version string. + + + Type must be a semantic version. + + \ No newline at end of file diff --git a/Chocolatey.Gui/Properties/Settings.Designer.cs b/Chocolatey.Gui/Properties/Settings.Designer.cs new file mode 100644 index 000000000..f665ecf41 --- /dev/null +++ b/Chocolatey.Gui/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Chocolatey.Gui.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Chocolatey.Gui/Properties/Settings.settings b/Chocolatey.Gui/Properties/Settings.settings new file mode 100644 index 000000000..8e615f25f --- /dev/null +++ b/Chocolatey.Gui/Properties/Settings.settings @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Chocolatey.Gui/Resources/Controls.xaml b/Chocolatey.Gui/Resources/Controls.xaml new file mode 100644 index 000000000..b8cb1bc06 --- /dev/null +++ b/Chocolatey.Gui/Resources/Controls.xaml @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #FF4e2c01 + #FFb4884f + #FFa07644 + #FFf7f1e4 + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chocolatey.Gui/Resources/Entypo-license.txt b/Chocolatey.Gui/Resources/Entypo-license.txt new file mode 100644 index 000000000..1db3d78bd --- /dev/null +++ b/Chocolatey.Gui/Resources/Entypo-license.txt @@ -0,0 +1,3 @@ +Entypo (http://www.entypo.com/) is created by Daniel Bruce and released under the Creative Commons, Share Alike/Attribution license. + +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/Chocolatey.Gui/Resources/Entypo.ttf b/Chocolatey.Gui/Resources/Entypo.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d6d7687eb432ed7a7fcda849126e0c1427294136 GIT binary patch literal 36376 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 literal 0 HcmV?d00001 diff --git a/Chocolatey.Gui/Resources/Icons.xaml b/Chocolatey.Gui/Resources/Icons.xaml new file mode 100644 index 000000000..a86bbfab4 --- /dev/null +++ b/Chocolatey.Gui/Resources/Icons.xaml @@ -0,0 +1,1570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chocolatey.Gui/Resources/SourceSansPro-Regular.otf b/Chocolatey.Gui/Resources/SourceSansPro-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..38941ae72f5c9b0d9f3ba46c812778261177698c GIT binary patch literal 127448 zcmdqK2Y3_5)-XJ~YPQyvZOL*Il0|RExSI|xGB_C9*rtUl+j0R}GO}y~p(c=okU$Cv z2}$TJ1PHx%LTI6+kPrd{2X#E%PE5ZXw(|nS_uY8ChB8?H7W(6Ea{n;WXni3$y!oyKryStnJ?M<6I}0GyN#YnAPC7xhWF-%Loa#nsLl_ubtD;14K;=VroT z(}1_bdY-*JHmKKcL?-(ZYRK6|Gi#*l-F|-_kUuWl4fis_V=eqaKiQ=}e;`D@{%*g! zVe-c*B=(G+<--WcC-M<+BjZkRPZI?p{1g0exF5)_+!&I;nW0ut$YgRE&&%NkM~XDj zzqHJB3+YG9f8OQ4zpF%yTnLc-96sc(^9$i(2AY5m+|I^c7JLW?o`ZB|Lf^;Xdy!A?=CwskR6&Xj)d&_<#itFkv`;!1J+glb$Bsauc4h;E-b9l=d z(ni;xm4T=L9cT(AjU#GZy|>I0LFdKG$)NnCw_Z;Cb&FtpoZKJ!JfU0WEpx;a+R0ny zi6(S_w=5$$p+mi8d6PB@;tE~ityhvx`cQ9KMGouxc*}kyN&ly}>`x-X61-)BB!oTS zEeE#V88+2h){p@`ylr4W5k01`dX6KZJ)ZTJc@oxRjkhd=@_uhwPP9GV&2Uyvc2$;F zxXlT1@o_PDPB5pHI*V=Q!pSvmTUCuY+fm|lRXbf)x2-hRoMyM13$R0txxiLqbJam* zp|jRi0v)W58gstOSzs%#wOd{Bv2n?9JyCgjvIh7Z9(VCRhevtomZ3IRO{LReX07uJ zu@D#6v%={vaXRYoE;co;XO(q=&FL;jTWjs+ z%vkdPXjj79b?S(mF|j0{+qL$4!1cM ze2lq0V?g`+%gOw|&7MGYpt`66xKAl6be6g6tuC7xD(sadHb)Kcx7JY#97To~X6Kmm zs%;L|IEOWeG5ZuEKDH5_w>v^AaaLCXoMM~ZSs#OP!b+>X#%Z?JSu5? z8*H|^dzigktSNC-R=aCrYbx!rPFH!?ysR8V(B;4X3sloVlNt*i_lP*SWVXnU0@GdO&Ts#;Z%fp{yKG7f_xWI)p~W#IZn?6G7L4rp5rXYD+=YV$4;} z(#kSaI;0J7!dP6D#kJ@zkYxL0vlTSl=_to5NCEDF-43VQT;sHZs!qnrsv4WU4qS*C zWk!+30J$Z0z=0hdlR*%!$~wk&95!&M#OgqDios~?NQkYf*j8GKrRG$4y%ohqT?2xv zk<8D_;8LK%>ZX`nUe9gD#00FzODzr?slAtwCNxtP_?`oe70!B4AQvSThYa+(Y<8Q~ zXY5D}bEN14QOCSYXK-D%iM5q38`VEhAg_=?5Kw0Yfl403=S9q=PM{i*S*xpo`_Pv1 z&skDSp-_#4q14tOYtby2Z~-{nRJxiBkm&`ai`lu^McH||g@Ni;S*Y`p^J)cTlz}=S z5`Ae+hNk_xK>SW^xP=c=-zFLYrwI!s9wo3jH|*X*#> zn{AG|N|)1td}hN9O=UT_H}D0B$c81b?{e^!Rakc0N-7+cB_Nx67vwXL z!AMC=H7GF%q`txlGQf0(IWVtUH=~LYkZ&m%lwDW|HeqgO&dAHnlD@MQ2T z&=S0`jRK@T(Cd?-wy7gzAqD)by}8S-bu@Z#00ptbPd!1iJZI#v0 z1=5XDn&siF96dA84eUh61L45staepmf>Q-Vf`Ry&SJ~Xq(G6)vrOjSiLz4sShX?>f zF?cjc(3oQfB7E`O3B-E)cxi^{RtdhluF_V|A|@gSjdfA^B!YT4|02@AmkM;G)c@6O zv-km#rp9cWR1N&AbW^)_LwW=j)x-?F_J_`fd0-dBcyP4T|7A3agoPzhN1EGUOC;QD+V>)-kJt== zxws~6n_ChjcwouioC45Llpx?LryG2O%~9%f0p~z;)>247+?8;HuI64_f~J#7Y}M4P zttAs2&U(nD${EWWJt5e36FTlkGX`yBZ4;thEWw0Y$SMAffT&g^Gww7SqSuXKY6-*e zxhd)&Fp>4@HaKlN47sYdhUQmIqbA4#k|z+}U(+P!4rwPZ6PtEq?P-XE0l1o3CwSHW z{hX{BCn$@GFy!Q>VIJn4M|xcbB$ePiG3ToVjX+7%IV&OCFOxhi3Py52lB;e^Yr*g- z_{{9WjGVOWL6!o5KET4JY=wDQMZ?kxEavP&bACbI(Ckc0rnyyGA>6l$F%Qcw8jv@n z$P6tC(sGMN!0f@CmOH{cFgrIh#%vi5GqJ)#b6$Ztdr*E(wgu|4b2D;=WM=2~H>X3t z+&r8V4$3Y9phbDKs~1$Z1^Q)~ftZW|068r^J14tnM2tBryC@f7W&zMNbADPuQFg|V zoU{US{*VG##k2s7OaPmkotsqvSS*7qFz*CF8F~353bOkTD2jnjMNk=IE-FaNvT=E0B)%(O`?Pzf;1mZ8|Wa6np4ju{!!2*W%eFDDaPr(1yfG?-~Ja$w+;fidRH zv_Wb8aRd@vY~~$-j|0f5{+3)zL0V3XxiH_7k&OjlU3P&b0|3ilTd&R23RQRKyw=Wmx1cRMw|;HL^wrx1;7I@DZ{c0EivY_g6u*RLRLZEAOH@c z03P8OhX4zqDX1Bv7sY~g_>9is8x;atVQ(+vGA(I201)&d_pfbZ@4HTevz@MXTe;N^ z&#UZ(c56)qSo##3%UKAEQ*_nMo@R$E&4B^S>MNEPLM~edZL>)Ragu5>nYc(LDJK=g zP0X-v97p2eh-oY*Kq-xsLfc|ugK{DCsDZXNQUzBt$tDg`0#9843(r>itdzvkes*Gq zYe6Fh>`?%HYv6E^Iyhs?Lg-lw_a$(T7_0yjTjoQZleRC1=XR)f0d=uJUosp$fv!xF z4lBStn?aEJv)*0q>CbxQ(SAcI6*WMe6EK>a!OjPmQcWDiRspTtbgT}bTzVEuQt8tw zpl$-d!!~6=qaC0Y13zPdRy?{xtGNFGoy~btN%>&~tZv|e6}X1{M}ACzIwxTK@1$e~ zDskj)kU#Q%2;5b|9m)kI;RYOdhtfc)l#;H1%>{QjPV9qalz%NeMcOK9>)8KFXYv6D z%GnHZMg1Azg^IfA2L0***t?Q?`Y#sRN?I99DX4;HZqUwZpx}R3x6PyjwU_^lrjFE_ z>M36K4Dzo?UFDX628h8Kdz%7Oblswb%XKFB%EAjH74 z`*{fTK!2sLId-%wv>CLFYA7>$(1Y5crk-j9vnQ#g6`s_D!A^$i2A^&`m z$Oj*uOUIQ5*CHt8fRr+5Z6TchP7Y?E9b;As?P~*WxxizfR!pY#=y6l&NdIq)u}dS5 z^TFmVAhSUbb#kC2X*No>9OS}eFZppvQ~y~*(GM|cb_7V0HMpr3VT`T>U&7)h`f$`D z)B!u#1nLu7hMAr*4x?UHQ{Tfp5sN9Pzvy#N6Q$^0N#nK|Y*6xA)d1B=#sicRs&i;L z5*4)om1PF#-=wkm`l7Dd06tR7qOc7h<8v2OG*$O+%b zkYeO+3AAJ5kT5zZBo;AH%b8XpEXj5z095Rcx`^7qxPzm@NQ1tb@d&dsd{zqoq`H5{ z3#JEBZsi+WQ@_us!)MK-pQJZTgOMZ13#6UN0l9;?o95hRpqFVea`|4~O462i`%fIX zKc5+Pr00J986PpHt_RwX$F3%vm88u0i_{};Q74d_W-q^4WJliN7=4z29AJ5%!chbV#^FNh zO8N67&uzMQrz1i8i%j^L_L80RRUr9&vR5 zC>ZnpGww@X7A+pN2xB1fU7A5Lt}>5P12EBtOFF{jDf#fGegnM%TBC2~>Kh^Y2=od# zV$|2>IayQ7XfA7C9Q4Vi)qgZ&_&Zrh*3s17Ye4fbRyX(9C>Lq;NFhp^S(qeGmd!R_ zF+k6bRHIEWePyy~N`D@39M>3-dl-rC&FB7(_NI6-ezE*Q$`hDYWq|~k#onu(QVxLG z2gXlqg=1uL{=2C3-{@h}u?_-k&12zEz>U_y=>EI0N^-iNuVk8vPb80wnGj-;e1Mbs zPHcf(!W;;npcXP;fO0Jc8t@55Z>a@l(3nGGdoySS+6J>&^ct)d^BS}~#Likvv@!`a zl@ew#&AHvY%|B@Zvm3Ncv_Ztfv<5Q*=8@47nH<^3n7pJ6)5j6Ep7HOrgL!kz_fR|P z;fgwfnILAfjz)cMD%~{7JLHFp{3nt`sh3muEV>~EHX<8fV|6Tkm%|-KWV9kyk2Zx| z!2A{S4YZqjc*fReP(F+UP2(QgHR>ADkFAkXW(TPK_hw*>1Cspyo>x8&;7qLm<}uk2 z9dQ1Jal#C5TcXFta^_#+M?R&f3aGAWv;ovCv_!Ukg!49(IO71)DP>GjhA2f4rV}`e zwNc%cB*@}s^ReT4C3+^*2uUkY){+mCVE*&yQ70KDmKWi@lmk!p<}5frU}Yvhi9%l< zh`oGyGHZ)b@P2*>+oJBX$bmL(Z`NB{PmtPR6!gKCp0bg$dC&iBw9H#b^Eqks5~t7( zrP+kUS;U3(qHZ!jR|6{((rhH2#_C)cEnCGv9Yv`BY@?VhVcX^&2ce+;Aa=ybW^Xw2 zM?N7f_xd5^D7MBK(Y>*VVfZJ%&GJ<#4`6vI+F8>%2%`(-g)6|)=o9GZ|9iaux$Ib+ zKwJ8|dCA{t9BLZVrvGLRg53Rgvk=U=&~}?zAJZ7gLQ$HMKCrb0HtS+K+&tr888ln# zlc;9B@0WYW0^}m9X_$>71vpNLL#PwdJdkC9&2?1D36W0JwJvaFb5w+do@x@DF*ZrL zE%KrQq6BJ+1KK0UF&(g+w8#S}7T0jNd3Q6ZmEM)#YaJK+h^hOK>gn)4Y)%+?_h zF4`+bT*mR{85i@ht|s=A==B~L$^OYo{~KFj7=8Lz0CeGqq~E8St`JM>^G)X;m>FSg z!~9_q$cxQ2(HHpQHA)Y)j>V|^N5kgvPs;QpjX+Cq!9T>sax7o|mqGQUxs^1XElD=O z?1RBz*#NHB`SNK8(2nwv=B85YXr3o9jYR#Hv;=)Wj#ipuNZNue884-%j$B4LN~4mb z-E{3LiOQSVtPiHd@#gvDKaJeit7*h(n#K8A;BROWU4NeoVeH4ul*MFeHqZPm8x8tW zHcDo}7@1N2=owH8a4i5WA8m$N9a<|}0YPc7C+Iy;7XPI24C*BCVm8nVlmf$z9(Mx3 z!1Wc>&{CQ;`9_HP)I29-dT@V!{HJ_oUebr<{+vcxNPb9a%hoCWI}7r~+T>=s^Y>Cj zuAyAehM3<%sWEBXFPp;l%wzu39Em|jO+Z;Ny+AB@e{cSc+JF*AD`A%RpR8vf28qwO zzRxf<*TlcW*c85`VNK@`|Nmbn`+J@6X;D$*EGL(wHLizAzuMd{%V3g5o5J{uvA_Y6 zVLn2VRUJIVHCogp^ff;IH}yRCWxHP>(U<`>4k`SRu^Ea)9=1@EGY z2x|nzk1L`@fLEduIfs;{!I2N=0(gqQQx1V%c!#w^;F=HZ*zcAI8L2{Qacwmhcv3*G z{Q)Xcz<%#!yuvwjKH$a{{ei9`N(ExV(P2yEN)bHAH(#(nVjW0p8D+>5lrqxdgM#rN zaWguQ|3kg-@J#_6e-8XZ$V@~2N(a7+kq2!ME5gRNZW!;8YxtWc(<{auCUKtzBGs9I z1?k0c`()mfUgZ2=WpF&WRIg|^9z&{H}1R=2+?2p=m`kmqBAcM)Y8@VdA zWjtgn87RNOAWg=12JhZc;JAiSp82@W_>2^yo*+hPmBc4w#ECRZ^q|h7E=iW);|f|C zQi7OJ)_8{)&=OFS@_?uKOtM0TLz3eV+E;>#{hISvvKFbG)bHPU2*x7`H^TOf9kl~_ z$tXlAGj9AdT;{$0=kNJ+rMXQx&BtOPFLQ%8w8N2tb9eY)&cjD@?{V*Q7r76(54lU+N8DxZ zW9|y~2lpqxh2P9?<$1mfe8nvza`+-!313C~0R?IzkN}7R8u%JIn1m25(UDO20y>O@ zlL!(?qKJVv@Gbck{7ycCzX@Y75)+9A3AO}(-%paQ{kU{4lgr?$I6LRys`)njJpLJeKHrWH=i75Oz7yYp@63P7f6MOz?OMX` z=Xdbi`0e}x{s4cFKgPew@8b{g75sR>{Vy($m+>6Gmp{xu%kSZj@ESgdyDLkAw?w*= zXUS47pV#s_-jDa^mAs1I#DB~^K`!yH@=x;td?2@&dzo*`hw*A&;Fptb5UEnhgWxYQ z%c=wEKTVziEDOj!vY+hbI`g;qZ}{){@A;qjANZg7ANgPS&xqVl4x$bNB~Sr}y8_;R z0An1PLZ*{LQ2EZ}V6APvKko09lYsCo{;}$U4YkW%07Z#tdV&agZ_JSYRA(9BF*TxXifE zq%sAW!c8qrZB3m`Jx$rBLQ{#!X_{kNV0zB9$h5?C+pIE&nWM}mb1V1~C(fK`?qTk2 z&NNRnPd3jm&o$3CFElSVuQIPSZ!m8)?=bIescRYD(%iCD%XTeeTNbq()AG4id@E(E zpjO&e`c_e`OszV%8qjK7D_iU6w#(XXYrCuMfwo85zSZ`0yO4I{+w0mFwErTut%v{f z?%lh^4s`&on>f<;xoL>*g)Mmp#q+QrL22 z%cs432?4%DHu9ykbqnCj*0wv_?r(b-_;RXUu$M2N$F}ki#usiSA$O0!u@87e?$*I^ z01BW{;J>|p+`hX-pj}P=?v5e9-L>59b2s(wQCi&^?A9bTxckT5J9mG(`#r$=`tFy1 zdOqtw$Y*WfXb(r*TkqVuaO>1(J)j&b^&sTdufFol_iu&~@@eDK8z0@Acys-Y_dX4{ z3Hv|XI1I(wyE7c#r_3_k?D=x+=Us8-9 z90%Ar*wcdR1xF_L0GuC%;}tm8!*Q5T;>Yk$GkU>;?FQ?=#9!vG_(lN!_yhiux5Wqi zb+B99Z-f5vKQ@-2jt4H`A^q{NUj}%d@4>czrmj9fW&*p5mBnET8Sq4QP4>C$Ygv;% zQ1>}IBq-R*SH53K26DsW{(rI!_o@G2)+;BUVLPg?;V zb1xqPUiUlj!#nr{J`sHH0lqzW#h>|jemozp<8t5f& zkSF+!WC`rAfnM?;c)OdN4ZQ!q!2io30-*mlLj*wo{~XtY-^AsC=dVKF&ppm91b^I< zd_{VZuOYX+4O)K(vW!0<8@mhH-JhfYG=B&uBO^I~GKy1^(VRfaxKJ{JQ;~8`PbxrL zD!Fhno{Jz3t_7LMMUz^tHL2&?%DT&Xk*QoqGKuRq+Kv-MPMGA!m{Gko6|db6FTc$XaeVd5s%E)^QJ#jj+$jCT=X* z%vs4B+&Hq6Da6WnAnfr}(-xM5@qS4?(s z6}+3D%Fp5-k*9iN&@T{=e&p-;Y5c?dul(WlLXIOvpi*`&ia0qVspd?wbXf*@gi9o|xg;`&OD2zTspLtp!l$_2 zWIor2tmj6O*SS$-12>v%lI2_hS-};O zm0S^7#SI~=xuN7FH-((y9wKjZ)5%$G206#gBdHs zO7jK1Yyiy{)HHJtAV+Bn*-0EsWP1joiU&bVg-6MT};Lf$}H$ZvBkuA%FZ|If@p&OM_bU zQ-tg`67uVCt*n-ZMAHwFJUt|Etszm1hXkfCFm@0rf-sAV`_*8cv&dtR#4G{>T}@sm zTgYxO(UasnnCVqWO1=Sc+~x?U;Mkdi8Zd6AG9w&!E{WWE=qG!O83{7`;0 zU&>G5UHoKz20sVf&vX1@emTDu($_t}z!UsA{v!V|f0O?Tlv(8e0M%7PXm0_5y%VH6 z-DG`bS+YU0BH0MpI9a*OA*+>5l|3wbT=tyo71;{eM%i}RKG{*(DcO11N3!d(FJ#}# zewBITyxdju-t-j6IGK`(^a!o3sf(vmZ)A+ zZC3449aJ4xol#v>T~U3i`damqszK#Z{prW~`TK?Vnf%)M#ryT}%ksziM}#xNMd6z8t>6hz1_TF0 z2DA+57?2pyE5H&kC}3ECHDG+eq=3f)o(*^Mrvcvu{2nL| z)CHOXI|L>N_6$r5>>oHNurP2$;MhQ0;Do@5f%SpY0v`#S8@M3w`M{S0mj|v5+!(km za8KZ&z~g~u0^bR|68J^nFM+oM?`jkpe@(C^RAbPz)U?&aXc9F&G-;Xvnmo-2%{Wb^ zrdBge^SI^-&9j=9G^;clG}|Mq~)cm0NU2```859^48e|A+71S{( zE+{pqPmm=jC#W#!!60i;MUXS7E@)cN?4Wr;&j!5|v@B?C(59drLHmP_1)UDM7<47* zi=gj=ZU>WKAy^x13~m$LH8>?WEqFk1Veo^&wqSd3eem?)xxr5dzZ|?Gcw_MP;C;bI zgHHut2>vkmTJTrFKL&e3_z?e)(2&+4u_3)f280X?DGr$!GBspg$O|E>LpFyT3OOC} zQOK>3Uqb%W25KX;?X?NoH0=Z0LhXZEt9F96UOQboNBgAqIqhQYa_t7~KJ8KMDeVRA zhuUk}&$Qoaf6+E*@92n5uJh9c=z?{jx(HnhomtmL*FhJfi_<0Py6Jl9`sp%t19UmM zd|i=lxNekgoUT&m(#_P()jh9Us#~YqtlO)5Q+G~xNq1BCt?u_w5~>aj4K;;!2u%p> z6`B@0Fmy=hxX{Yb`p}u7Pldh^x-4{k=(f=Pp~pkt3%wHhW$4eL9=)Glt8bxir;pS3 z&}Zs%^~3eWdb@s#{t^At`o;Q{`i=U1`cwM%^jGz_^xx@!50i%lhDC<84vP!x5tbR2 z8#X+wIIKEsO4#hMr@~$cTNbu9Y)ja_u;XFp!Y+l~2>Uwhm#{y=RpBAwhVVAwUBY{Y zXNKp8KNvnf+#NnW{PFN-!(Rzs6TUfoZ}_qBli?S_FNfa>|317Sf{zG@2#YXBbc{%d z=oOI_kstA3L`lTNh$#`XBj!iE7_lN^L&T1VLlLJU-ix>z@p;4#5r0G~Bejt&BHKoG ziR>NOKXP#7$VgkHGjej|Ba!nWpO0J``C8<*$ODmYMV^nm8u?Y^&yk)e|0sP_bX3Qv z#Hij;Sy6dWqoT^9>{0Hh=}~i{o{m}?wI*s~)b^--QAeXrMO}#cFzRa5t*CFJeva}O z@^ckg2x3vVepmJx@dkQIz!Hu(I z0)x$VzA3(-~PAjI0bsRt6(0BgMkV>hB|{KZV@CDP-7l zEup`Ut^@=X7nhV8ml&5gz}J(~kiZ}(qzx#xy0YD{8;mWRk(}KeWJVTkpTTI(NXurF zJkShYTzq0m4rN)6gdeKXa{v_Woyg>o$bclWfhQ&8(k{8aE=kF>c@iToiSBWXT&iUW-u0JG8Ses7G^S7nG9BDw>;Pl#X);zGBPq*=S%-Le$xY(E$$g4R9E2Y6Y7(RMw23&qw&4P;A}2-5Js>#Hr26sOLxZYZdq0~Qfm_{XJFEppwn=aAQh%2X*f!_!%@P8jWW&a7MR+mvwrEU zUpniTo@!+rD51oZ_$V)-5-Dkc*(>Wok^@$Qg??Hw>E`6SSoBzMz8a) z8qdtg8wR{?%Igp^8Dpt6#9OE}z@@vhQR6ciMVU-0nM^7cCKU^I2HQ_}QEKT;a;i%r zI^L4ZIw!Nv$yqhDUClkrN=Bey(u@Tu40cMQTY?i8pF$BO#4~Uy3|tDMrF$yuDh1+# zt!k*am_?xN*Z!3gXk#Evv@y7#F~bFo87^L9W(>BZ)-n;-Hgdwk=(8{)EQ|;XBO)ul zp4xUj9bmn0fc28?Po~c&`*7UC@#-K0Vq zG-G^;wOZjnFD|PWm$fM_*dGnV0*!pQyj~0HsFdJ}a+1(lyjarWr9z@qNR|qzQlYz4 zNS6wkQb8g+U4oM?!AY0kqyrqUYm2o40ZkkU+<1xeITH#Q-3hkD^u~)SfnkuGN-S(V zVP(b+S8qc!cyIs23~#?gX&8ypFcM)H_8Q!!dV~Ik>0)-3?lhTY=giNm#GL|T0T0qEHK*;n;A!CU_#u9~$1ysj48n0lxT(p&h z_;|FHg!qIwt2?#?_CBP@Yig@u%QagpUJ*IHQsh{o$Y}wQV*!!VD@Beah8#;2ITm1B zAaLZiGB<5X@91`0>=yP7ahB2|Y?xDJr6n&d#a>!q>pMydT)nguOSC|N(NgTC1+HFN ziW_MumS`z%MvM1Oq6KaxT8e8VT8e8ZEu{|F!wL9;SEPkrDJ@u{e4z!T1q;X*dZn~r ziSY$XlrLED@ul&O(L!$-Em&l1KC7OzMPy;54RL}{S~qy-B|3%ycWu*7J= z5~T$TK3W>@7%lXc(Sk)r3znR&(lXdEl|lelhJr3;Vx(s#Ql=$kw5FV%E9kkBp2ySk z1bVj9a}_;1=$UC>H7!r1XBR!gcDR6xDN`*i*U@u5Ju`irOv_W~*~WYpc!969G%y} zg_>0y&BfpjV`4%=d@^%Murq84tLTnmfCM2h`Ch4j4St;vIGf?P`lMuLIpoIWS?^5FFU1~hW;)IlxG`n*O>b@SEGL?bb-yRU|l zofwzqtDz%Ej7#^`cn6c=tDzi7jLT}QiD#prER9Q~IUcZ*4TMg<;f|44sV+@YQj}~;-#AwoA>d`1)nsL4TxQWMvJ~acSxr$Gka29X9lB7jnpA;V+T5SHriwB=Hp$%`ncxbVCA1@w!(nM=mrh=Sjxl0_g zDcDRKVo-@K7CnLkBapX@3Y3sUVZ|p<=EWybNyK-fM8zjyz6{eCulR9TUOl8mFHJCe z#9FwpR5%f37jH>q`EfjZMngYLE>Lgal2{q*c1=i&ttm-|BLj|1I4p2v!OsUI^;#sq+27}L`0jz(hhI4B;+1j z0mXs@GglfV5DtzdS%R9>$g`wIvXT&fo}_1a65H~c=~ z;w7{hje3>Qs8^YddX?FzSDB6EWj2zRNy(E2ornGD>Z=4hvr&698?j_IVzD%0v3RlI zdaOiYQe(She9D$-u^{o0vM;%jmgGiU$&I*@5e8eh#X>W#6*hjGZ z6{*+vfpEP#1*KGIO&OI5Ik&fj>P!b{X%wji*+`d*8=p0@K@th9FE@_L;$>I7B@3Cv z7Lc(ZjjzcvGFCSk7F$e)$`MlACJW10-J~t0vYQWABfVLTV$VW4*_tyJB%%7&pP`n5 z>5gKuxM3nxQiN+`tUfNjo7aaxlIu-2k|4%=Gb~#4#`pwF0!D7QV7dSojPY=x6OhFC z47^K>$8-TMm_xuNi%uQm*trJlKws!3F|%SaEPf&xut71dpFp9?TcGV>GK@APAhUIcxR`Y zI|45}o8fh@=;+c<1G9`TGhPeaj_O z(N~eJ$X668CMsqt<|-Dzdo61eTNFDL`xM8N;mWDXIm)M%o0Vsjmz6h_U#fVOTBTD( z!CNQKsa{sCSKWs9O4NQM{l@y0_|5b?=Wp(!5`PpQufNG{E_zB+E2nuW&7!#NhI3RF%U@5$#;f6OfW(7VLI6rV{;AVIy z<6_{S8b6Ij6Qyad>7q%6cQCRv12skP2F84N=VF)UZO!+Ze+2~uMF({X>Kc?7)GcU4 z(Bz;OgI2(s6sLmT5Bdb&qWCuGhoE1BJi%PBDmXN_WpIb!Uho#hAb5vjd~kK}%-|=3 z7X~j2UJq|j>grtO|h2+4y6Qe>(LdJ(o44D)%E##?? z#UZOg)`e^d*%NXs&Ri!K@7k{GF*0PjXTq?@gKO80{9W!(zh z8r^!`8@eO#e#HB_k942tZt1?#eXsjfcRQ314e-7v5fd60+AXwqXlCeu(A?0X&=H{( z@V3O%&^e*cg)R6{ZajC{RRC8`YZYy`p@-W>wnYVhPNpE z!$QNN!#ae;h9!n|3+q*C^d$ZqBZi$lv|`N;ljDfOU0ynMv>`UOWO_avK&a zx+pz^?krY(qTDC8Q-~v!8c&J4>(G`_SDw+II=W3vU25_eRMt_Y?oo!3Wh;(G3pYi( z-qYviU{Ng!*N=;ROybdAo?|MHFw~ZrIc$q4n8ahVUy6mwo)^4N02cL(18 zW@EHCuwjLwr!vX2eEPU)Bc_dwd`vlY_ml%ucXSY!N2DmlVRs&yS+2;duNYfom@#$1 z{8`b$`W0i;?&Ws7yY^?}b=i*V`usPq*uF4`rt8;!`8I!d-wn~R+Z4l=7py!T_16B) z@1NXPW7}rheMGTuRMv*x29J=G*1q$*qfSkX{;F7U%DK00K-9qD>gb|nLtohwwR!D^lRGy}c5N_iJ*0T8Z0M?7L#sh~y}N%n z{(>v|aQ*Sx5mD9&l>-NlTe;C{5Obq)*d0u?+ z#XZmOd0{`Wf6;>r$1EECj_0L_ACzKP!xTktWu|B2tkDmTojC@0F?09KT{HId6*oro zRQB_1oH1tB7+U}E?uU2H+>-(IsQ|P`*fnvuQtT;yph#9`dyJE9Q_3foLib5qC%-Xe zOSWi?NQB3p4-~@l+n?LIaI4<}<#VOal|Enmv1ez*w@Og~Lhqw2@~oIy^l;&hb;_L`nj z3I(GpTq6tvtG9k0EgtA5i0SHMbJsj%oba$o&@Y_+^t7o_V=5jhdemh198)$|4$o0l za|K$WdTY_ab?5pTzY#m>J8#PV<+Tk97p^fqbV@Pjq1xF~426?6o`@D#h~eiv;bMy{ z)hthozK<#fy{8hyf$HyLMg8$(E4S`4l^sz`bdi~w-nbJ7WeTyrWB4DsVxjwcWmJG>wj4J{<8O$ zeh9j?tnadnmFer-M~MAAOZ6Vt?KWuHu0Pr+t}9QAqZHyJ%2S?E3XM2gJgP4owfo(7 z_w0D{%{|u4%u!{e8(#T9 zC3d;g75LPnPbW{8XhDDO0i!Tb{hJ~~Da0?!SEDJk2kra*GqJDOr^8K8-)K*3=sQB+ z5PnJ}2EAqR1bRaA`+I_-h0(?dwYByM%N^>6X1r@V4r~~#7W8YEEn6#&Hj0CgA?ubd zTf44)sl!=U@0exOWIdC%AlvkqGE;2fnbi;n`Y)VU6d8s6>av|iVdMnC+i@&)n9Got&PR!kH-zWzz>HQleP7wAXre0$ta z2GRe^_e905+~a*-jfSob7gp^(bSdiRo+mxBe)*N7A2jV6rr5G&_nO0o^E-+M4Hz@T z(;|AHO82W6b7*M4jG~c!`iAIFiu$IP~T|C&|lcL<;{V*i~Ki+E1u`R>jJh2Sn5 zWf(vY1=zqf?Jlj`sUd%TN3zX;jD}?o74f1oISCrzy20^jQbA5m~N#$91M^FgL z)29^TXpoxMO$+ae4~uG}fGpT~TI~5Qcb5#CNiN6KA`VrE^WOEmr>yh5z00Xsy=Bddy9`&43{8k1G`M%ak()NdpkFjz z9k#3Y&{6g=Ri-T!ir1H~TeZQkXPtd`{=i(&D=u22_dGFJd_t*79J=99bjD15>eW#Y zj|5My_`+dv`ayBB@!JNA{@m8xdsnW0*uBQ&Nl{f-yQfbyjvhEy@8J#&yuNwe z(iN-0_MWa#927qoshnef#JH;3@lvHBy?;*IXw4q+QN3_3PH{pRBeqoZR|+4^J1;)7 zSFAqIiSldW@f$L6*m=G9jM#Cnr=wVXkI{G%8m{X-+f}_DQ;fUpxhVEh{l(rizp1YY zlQ*h`Yr3m@0huS|vN*$d==IH8O!Jkx1J43F|Q^?#|l(~Z&nR^15yK2jtmyo%`5)%d$Aal0>b6=YGwm5LF7=IStjsHY^ z?50c{^0rCO?{R9pgVA_B?HWetJvFMnFoq93Pl_E>&1_yn6+>gxIE`XJ zop2T+V@I{%DgIs1CoAJcrCOt3^P91Hyjn~PTfJn-n$?q*OdJntBx;TIlO|R#owPa{ ztbg@Vcv8=vtX{Ho)#^z%pu-Dl;rv@qiw~)5%0_Qh3(r0@b$*?pXhdo5_~^%#f`064 zhbFwOej!@-gZ>=yv=eonZxnl#qE`IoFyvPY zl#dRc(|d4~=a0*`+jLZUw4Pr_d!imOjufLjI`LOUM+oq$=1!@yYTPJvN`h!GuB%(> z6vS@cd@-Q(tAWR(g{xs##b1>Nc5h$xhT+t@(zs~P0jN+N*u8bt7Q;!Y;-pFp9(lHX z{s>#qaMSVnl1*ub!Nbc(TajtbWe{vgI$WH|*Oue&~qG^3h}L%inNCYs9WK!b3`5~G2!-NI^@8Ye%Hlb+<3#K@PU?us1130S4~=@%B-CqnzCHPx?#s`@bU!Xt zPHf{Gef_{}z@KkOWHHWzc zXJq;P^xH(8v3%Ol*{0`;6(2r(-nhMb$%Ge7s}3uMDm7xAde69(*T8_!eQp$fgwQy0 zaT$ijH7hm&QI!*?O?1|pgmp`ou9JebV_7|D)c8jqnl!1*acHPPVD`Io;zYsY*YJ-1 znDV%osqQWc=snLgL=96`*H4@=_7Okpb(Lmet>f7$L#Hu=V1hKDk2+iVjZisf=9Kyg z_JhLIN%aiiGv|%MjCUHw)e9fX+Ni~u!a*^5yBKj$E6zSW@{I1wO~Trz7r(Of^%Z0G z8TPE*cKGRNVcpX&y|nbGQFqDl=(K6|2Ho!QlXi|UjCP8tMwWr4g{>7%y!_hk15sb~ z*yvH3JbjecJWjnBe?@h5NA1v|<&L=M-kw={G5a%>u+a#a%Gx?{n0oWNVTTPGQEt38 zY$ryivBGxXX4$l1l$(NmPVEJ?FmuKQvFk}O?;SyZRQajc8Z)Np!@e^L%f!CG)Sh(> z$v@7k7sL+Y5|xS$C{lZ)e6-+LGHDI? z?R9G>EuC0BsorVQ=$));?K*Jf)srSUOu~jG;|>7pMZH>>qFz2hxV}~`)HO`07e0tj z$m{0`_e7rPcPsj!e0as-Uw+wi@Zh0M!&|qm7&& zX{s?Ed3CQxjMbNgD;p1-yAgF_;^uMVowemcvZzLKc5k*;y!jcJr{0441YX z0f7jRF`zi9(ocQ>>l6 zLQGZ<6(<^ni{m~N$G=;6S$9h~D(*SLiL*}24hh*XojZFc^=d<^AdWRcep@{{@6l+O zj$9VMQ3@z6HEvub(0eSGaC2uhx( zMCWO4yEsL*T?Ff&a@sRRsd-l{en*Hp?%n|Z?_!o%&!3MvH+Z7(!k#6EqxOvzVfyle ze*LQD>tA;*vx^oG@@VyGWmj>gQCKJHjSdLi1C5Y62v>|7h1I_q!5Pk40m>JiVg3GEjgjWctxyI@45cuUUAT#C$9_ovNf*PH>_E;c}w-G@e|LV zl461C&cou1in&V7Zlm_IOAr*6)iw0GIHP`fy&yXzzM%J{3CcK6OT`(8@-1haY0#d5 zNuTm-$a`tx0h0u1c17`d8P!ydLJQb1Mb?-sg5NJrK2b+=@P+`^Ad=j|-dE8NU=|+|6s^yvsYz z%Rnd8t{D@Am&C45z6n?a{duJ*2XPAxJGr+{$;2+gXW&VOfhQ5Bivx@T#KGNBr-ik~ z-GWV=W!$3vx~-spc*gWcrxafr-1(sUYuHO@NwqR@jAtkO-n77>}ug-)o#P5=$Gs)XB%zmSVPu03FKipk2M)-jf zYp=>KhlzL2dm;qoH?!22-%yJa)f(#8M^{5|^PKfmox2@eFP!*5j1 z-x-c8GFLuuoV~yI$btH`rvt_&E@7X^!QI*dY$sq1!Fwh()Kwm{Z)w zhBTS*xXI-ztt^5839qdjqpn$AWd|jM9A~emzfuD*9ZTzlU*6dF=svA57i1{x<-R&4 z`$`ZC)gukUzV&-gLUJ7{w5AnWtG7je!VJDQ=KsWlpN37#ZAAh_e zTKGV0IpTnJkHBp>Bc`4Lb?SFjD|P@)-nnActLqHHjI#}~XN5Oj8+OPbc%Jvf>=n9- znm2`CF-SuishRg~!@_f%_~pkkVdOUOapzza4KTz(wjN@9S}eb@~aDb4i41=5w=ZKoRhQ99#OUAzdv(XBL20mgYq*WwIk0hH2e5Ot|6S9$T zk8$J;!p#kY?P=iSXKs;-z>XAKIc_N-+X=TUjO-!s4L`Swz=zS?ZVh>oa3^@!%YZvA zgAb+2J`VP9AqNO|&L2L5=Pqf;VZwdk58JxHSN_~jgd8K>&tb5a3GYwHTZC83$q52m z(2&K1yh`{GLe3EQ{+yg8X^RE^!35y0}dEk^ba4j<;#xLvG$JBhM3l zk^**PfDH!t>9FGl;b(-An}mM>_VOV7A~}5R&A-CIuS8@8;g`rs700hkCMrTg{P~ZJ zuvHN37(@&l>_Z6~3c>z0#7y8vCD>L8ziv+>@Toa`Q4Tvf!uATVF9G}yfMEYq`1+g| z32e4R<`S+4;b8|P7lBw-S#mU4PGCz**y9MkYlmI+WJ3t- zBO@D1U{?p(FhAJ+QZ|kwN&=hiz=!VSWkOcs)*)O!8Ek|^))2CekflTheN6;5JA%EA zWF;JVg~0dnG8-Xdi42HYL}cad$W)#@PGs}tWCkIR5ZEPx%qHYfLLMe$4uNm!WzQAL zk8$z?GWk!Oe2+|igp>cu$-Y=B|DDJm)60J(@>e6|zYzIJfBA7NSdK@KO3p@HzTP z#T{ikWpCv$<#WpQ$^**xly~97@xiJp_{r|D>U+Nqegpg__#N~Q@wfR;@qgZbyZ_t% zU#WSuNo`igsngXX)V1nm>h0>Y>g(#?;Rm{2LZz@!*e(1JpbHotU=NrP@It_mfU5z& z1$GTA2($+-4E!?icli7{K$D?yYi4U!Xm)6>YyN~E*rI}xgB}Q~33@tcebAAhPlNsp zj)fo59Kp{Ae*{04ncxHC(IM3#b3&GcoD2Chq(K|1jnQVo&tG%k!{PJrLsv)LO5Lxa zVWEBD$Eii3AL|A9k!h}e9sHzpCoCC0znvWReAwpj_Tl}*$A;IzC$wTjY{WqLT(&M^ zZp4y^EfF^(b&;JSyG4$Mk71vWJQn#yR6tb!sF6_N=S6Rg{@fgG9tJxHEjM3i8P;-O%X6*jT3u-Md27--s&z{1DXm{k?nHZ9cmxYzNr1n?Z51h(4n@&sSe+F z)OQ@z@#T)McRbMXa>u)!!aB9@)UVUfPV+nM@AOHh?>ehH$8;XrxwiAt&PO}niXkx_ zV+O@6irE`;G3L)My}L~4@^qK&T`tF(V-sRCW5>l#i+w(JL+r8GPhuOo26c_^I=JhU zu3Niajw^_}9(OlBCVo`>6Y(eGe@hsf@MyxJgf9|96GtS@N_-)4SK`H_tfUD^k0dQg z=91ebPf30?d3W-~6m3dUNq#4uW(A zq$<6awE!0ET|rP(q>41@C<3B1MMb5nvG;l|x%fQanY)W6<$d4Z_eUZ-_sp3yGiPSb zoHj8N3MbS}xIN*`#P25#oH${k{Y3wX(GxQ#)=qphNqth_r1O(%Cbdo;J$dfr#L2g( z^qLYlW&M=BQxd0~o$_L;Xeu-Hx2bwlO{e-y&6s+A>L0r5x&w91bhqoC)@`2l%e1-E zR!!SJ?fkTk=@X|PoL)cu&l!DYESpg>gVP(UXQbz^cTBHVuT#IDzMg)N{zm;c{Yw1@ zGryWSXr|#z>zP|-o-mkfU~3R!kZ(|EaL?d@!G~D`W{sQ`J}Yt7nOQKaV|M@917}Z~ zy<&FLoMCgO&M}`8J?HS8lsRd0&d#|%=k46?b9>JnG8%DQ{p3h_FO`bPvp2Ix%c|r4H=atR7Fz?d5)_J$* zy_?6)r{)ixKV`oE{EYb*=HFeQzaU}3*#(yuJYJ}=aO}cG3%4!$X_3LA-HVzQ&sn^2 z$u~UQoW^SOTCv? zEWK*_gXuI=SJQo_CrnFCZ6q|6H65DTWr`j&GU16JTduDmR#%L**DIY?UU6LHSnf2^X`9nqr}s{r)1S^`oPC{ZoL{*3x!iP}=X%8L zdpB3N6t^0;)>S{Onz71wmBXr?tIn=^zFNL|?rQJViL2Y(DffQvw(j>m`g=rp-0|$~ zIma`@^PZQ6m$TPv@1ML4ygj|6y)(V9_zd(}G<-Y&( zGxFQ+7wwnpSL#>i2mXEhhxDbion3Y$iO{;M+46VUJ7goyc5_Fq#ZOSXl{^2(5j%F zLD@m=!99XU22Tlg30@n#J~$%yXmCkzL-4(j?jb`$^g}E|!b0|i6ofnr{ZHu6q2oiB zg?fe_4lN3;4gDjO3;Q~(PuS!zi?H=!d%}{!n#0<{ZioF5_CR5!*rYhLMtx1+H8a+P ztVv&UYt4tX%-Rua7p-+!yM67+wPovmTQ_mt{B^eLyw^pqt6X<;-P84I>wj3kXno51 z$KiV6Gs72!`-iUy-w}Q=JSV&~{CfE9@F(H#BK{Mh6)`AcRD^3pWyF(+j!4bO?<1#2 zE{r@JnHZT9SsB?J`QHsgH_YB(yJ5|S^bO}XG;DabQG4U;jlLVVZOq$vZ`1diCT=p@ zv}V(}&03q+Y|e=KKB`aD@TlogCQ)8do1+q<5~K2>s-l{rUTqO=>Ahvb7K<&OTefV; z-qO5Ped{k!WQww)NX)w9R2#=(e-lnzp^)-gmp_cE$FM+YfEOy1jFU zWXGT#qj%Ws2-p$1BWuTn9d~y8x%0c7Iy;Sb2JGCvGjnI%F11}h?i#ntd{@k_OS>NL z{%ZH&-4k{j?Y7<>vHS4u%-vUZKiK_Y54~sNp5=Si?kU*Qw0FVY1A8y+ZQuKL--vx7 z`*QbxyMOrp`TJe=hwsnYf9F8|1Fi?w9XN0x>!9@DJ8W{;`LOTd*w}AlN5syI zwTktLjfy=Sn-NYofa zc|EarqHp5P#B+(SlNKk%Cp9OFlBLNblJ%3#l7o_?lVcukF6S~XsQ*z7Pir;)=*hWv z{L<+zuI|idxaFFtj1Lyw?}^IzU{U9CP5#_c<~sB`_ZrnqB?GSUy+k|%EsWWt*{GL< zFf^|BSoWJp!v86mPJtELBO$gQm9V)6qAr4Sjn=(Z*wtd)g0?vsOLK7){^7|=_J&>K zlCG(j+#W$mN;lVW(RJzwh$bOjRJyy2La>i2GP(qL9{XEXeVf{Tr`#aotkok-EqvsuYX(iYe2jz(WratPbnUk3+j zNn44nXvt`W{XmIfz_V(!CJp$tkRK@LEm0xb%)kLq(*)6Z*P+9f*z#hzB!;enC%hH#Bqa+qM?gu$Pje|Y!qBcbT zP;zw2;Y?zOUlHRR?ec`z@AW{;FNV8d0M|vM(C1}RkXxvGfIXu1I~{T&FmWVI>NQ*p zGx;lMls974!L&_d2qp2oPpRi}rb}6gA$yOdbBD3Ce}9V39l%N=!ptaeCMpHk+fE0! z^sEung=<+!|5QpnuU%u*M~DWBF8sUMFc{5-g;OcXJW3scDUCkJOmR5r$OKPXG~jB7 zDFe$X%~$N}+5tB;FCIzGi#Z&*4(%XDY%L2b8p4`TYrK=CZ}l;v@UP{lM~@p#(YJKX zDf+tZY>K{lb~*X*hWwnuN`m50*NEh*Be|%d7)mW$X>BRn`a-ZHNw!j8hPJ_XT6G{A z+(JKGPth;4;Tv|&eHJ!hoo0;yq^~>-3|QK|BM$03R--Q^iGZ0@Sl7Tkg|TNC$J|_Bm7Qxm3_&~B z_lt~O9jwtBMmMiNFEaRG(1PX{7~GA1O6*+)Sq-e5Zg#ObkZvuPtP#-RC_hz=GHMIX z7bl*|kVTFW@zYv0>E;fD*_!mzb(W}EJ8f+jyI6_?4}DpjJGycyMejd!RYX_%u=L6G zcZqTU2C(WSjiBGCF&Mk;8CJ`w)v7;f)fkE67zX+*c(%~F!ztR|3|WGIra7F|lnmQk z%Z>9>-^b0@fcdED1zq$gnjjv|pA0b%S{7o7oEDrHR2Wh)98RKll?3`x>hT>THHKgd z;`^-n0knD@=y_XQ1ENEThfYQ(Aos?sj&X}#RnLoh{UPQ@!bTVb;pk?upii(z@ahnE zL>YJ@C?WXx9I_-}5N@ZET1p_{XPll{lzI}^O~ahU4YLUKbGT<-e?m>{oZAntX37F? zU^~Tk|GWg^Iu0^|qd_gKMuqw+<;PMOM}bx@EX$+cbE1w5jB~^ZmVR#TYH1V!7D}57 z{XSn%A@Px&g`|m!XX+q**6>UNIy$UB^CaP?^$cZ|J|tnCO9bZ!e#%AtDPm@b>9_jp*W+9@xApd{g&7M2k4S)b#7dR2FG+n9Adq~Wqo}A zjxlvJi_T0mgY7J&s>H+IiFobK>`z_5{;7KLm#Mt`A&>N`1T}d$uG}|&%8~Zz{X_-g zy8R650GCP4eG^mHp*{90#k+Ur3R9p2hKn6J%(S;6J@J!%qPzbGXc(2P4yhFy5Y>?- zD3XhbBKaugzt%Hc1{!|<-p*s})(-wV<|<_^{)`x3LPyu^l;o>=_61LT``^Kn*&yDr z0;b~xa(${%jS8{3>^eci+ahi`)4540_rG*Ym-|H)uH|UFjUI$v;JJue;*suvi4k z`NdrKda-0LvGR_&suW4UzDk2rfHq@cYw2Mq<-eQs2AxmGwY-AwOS8QkQswz)MLG6H zrzc5qzQ5xcekE@M8vJ)KOd-F-X4dU0P020ktrBrg&Y0iO6iF(SC;?9@Kp-3bQ#Y*fc$4r(Pn z6v9BSD4P2G_bnKU{rJ4(`=XD1_`LWKjQyem3)qTh*qj&cJoLj~Df&IARWMx}4tltJ za%n^C*UAty6ryMjA>UrPW{fl-mkDwqn3OQeZO2TUM@T7uj~~u~n2>8yj$`7C-L@hE z-(}o1uyFZ@*UTX771=m&lzLW?!U@^T7Q{++(0i@U!WQ}z8+!x0N*U#bX(<+V)5l%A zsg!<`PR2&qJno^t8e+)+F;gt2pWYXC5Zpd;_!-P4rDKmUOrHVcAz2ANxVUknDZ$-| zub%rQC~h-I-u?#YKlGr(C-u`sm#f3fRp*B z0$eHjo!T);xaVG2ZH(}6VU^U9Ma9-@-WpB9zjd5v8Kc3Kt zV8M^)Y+ga$4*Ax4^etHnTk6pcxcsA3uH9Mc$zQ97G{o&*TOgW2-qh)g`y<^I%!7*A4ou0>9y+_%BDJH8#JJ zSYw^T$?2)EKx=a9_Jc98QUpk6KVC4ds8$)dW5C2Bre;pp;(g%8e!PP`1NCPDMA(Pd z1=It6c`@jzZYVf$$BSV|@$ojgV-rjN4-n)ab;_U}t?RV%8l#bK0XkanAG{5<;Yk+3 zeb3-PYe2aeM&y%2tr@-=he8wH6v|P8g0FOhADWXRM7Fm&6bul$`=j^;6il_*g+hoG|BxCr!|*CALY74>M)GOPr^;|_bLq!3RZkrLU=D>EUUaY zDp}wP3p0eFB!%0O)~V{rEQMO-;j{OjW58)UbG&(1otzhh?~72p=Y1V<4)Gj}k-D zf4y-%Ps0tKR7ASg!Y2A9A?P7o`>@BB)l=SpAGc|MK|KR2G{NY(s7{kN8YF_Mar{fo z@fM<4nk{)Eemy6y*Th@08{2hDh5@)@t)VW9@lyRSP*9FgvxPGb*DV1fjCikce=eBk?rfw@bP=P2E~4D4JDa7= z6;SjSo?NQ?i7Cw$>Fgb0l*t`_TvbaWor?9dv3lKX7VJNcHfiYAdnEcLh#oi6mI&mA zK(Pq420c-zJ2>Wu;w`8>`4YuiVeIeV$l~WT*p%?;a}CmW3OdQ~u2k(!N{vB4NAGCr z%Od!(V~LIj!IVpeQ@&o2_J$k4GvZ63#q9$3Z{s z%iixWWAM0ZRvnQ~$q_l7ko^}p+{{EBm5iS1czlY-qYA7f8#i=#QW0{8{u2kI6Er(! zA7W8*<%4xpAi}X&a{D4V7BAkRUnsE8KXmk-&VD=)K{ya!DDXh+>eFdKIQ!JCPm=&Y z38&(luxm?wxi{Ce&fVsE-==f9^;{SeXS>gMuC_A9$kZk_%~|GD%=nxME3MW>We!!G zwOq0E9i_i$NQcYjQbIY z<5sj&!5?}f;9CUb5b*840MbvWxPJje4nd5tvI@kvvE@!E6RvETAI2fxKM`*y;{Ed@ zUc&h2Zs!xmFCp+vYTOLG)Y321kmcLdkmr%%aS`zSK5Rk+jS9rjq=qOO6)GHEQ%hQv zA-nchHrrl;yYT3LX!8w`d-`=r{y$WKDeC18quc1BY`3$4Y-)V=xp+DJc;WhUF!;Ob z&GsGN8zx7}99MZPx7MzKdCWhAp-DhWag*^vFXzAdixv*Qz#Y8s&LS7y34i+>N47IF zl^(B8RW)kz4vt|?u0KNLpp`aMpN{WsDX?9@=unTuk~rb6tb}d>wMK-#2rSG0)S>rJ zP=biP0iyVE1Qz8*Zme+2r#~oo^$(X#slQbuetL)=kCgqeX;15qFprpRQ+!u1D47b`6N-w3+{( z5p8A*OHAq=n!|ge<6}5`1wCW3++j0&I70-Iz1MC%)fPhLWD*ahKuT_f%4UCIVF+p~ ze_|VUTmf%ZNioW@*V~Z4ujAMGTpeCNJi4~b>unc6y%o!6^RKL__hDBYe7Pr=weGjU z|8CR%_j|T+KZ`+n>EgS(90&AG=2`x??ZzVb%_Gy)NSn@`z1%{7nO#h_z0BNLWR-Qv z^(KbkH8j3?yr7PkC&-b%hl(Dq)W@J0DL?kNq5KHBN|7t58U$S~N>Rah3tPv|#uL_y z45Km8^lG7|cljmS9WM3cT4C9hPH%l!)`=RqhtXntU6BiwKsI4j8PFVe9s z6i)B7M&o5Owuyd?;Qxie70j2BQh4d?x__e1`(YVYI0;cnP4ruY?}TnBrIxW*^97O< z*^*26>k?6L-D$1Jdz^PMk53f6x3n;4Hnpn`sY*p z391Q|Q7MvkV-jX=Gaj-uQ-~Twu-FG6~AyL%}yv8IJgIO<@I;vtc%ff5EK*E4<9+ zY;b=Zr@WoPJWv~~`f#Sx1}`mGf!y$rK5yJ;hENB%1r>xuGD8pZ%G%0u>E}bJSDfXi zb&vA48+s2mvvh0f_Cqm;h07^ghsYKv7>GEHj@{U)&x@eEW4G#L!D7@Nfj5YkvY_Y~ ziq!cESFU}yclm)DDdl%FlTayk6z}K1Vw`fF0nEfB5UqdoQ)2%6RcZdK0y*^mwTPJi zC~`^vkB(+*=NtxgKKoT>z~6pbvYeO!pJR+eKoxActX|&EecP_V9fk~s?-!~&y05hV z^xM#Xo%{$yF{d-mpQx6?w^xSp!*<9!?ZlhbZd$uuo40z$6Jb#YG%+0B0UY{ZH2kEI zdM;KLGBk#v4=38g3eg@GjP|g?0W9?5jJ8w%^dX#UbZ3PRW<^*h2kZD^oty#e7S4#N z5YuTT_{*M{*ob>|dGp$QnAI{RpH5XnP&YM%O;sDf(n*T7++xO$-66LS(;156teF(c zUSpg0o}mkU#IuH{7A=WFf58J@)KUWq2|SYy8tDj?p8F&(yoD}SAevAG;we@jq7pTX zBOjJdMu9l;V`tOw`zrjLHh_J?8I@u`@8J*lg*C_Z=}IA{3!qliLN_8@KEgF3mR1n+ z_mN8t@jNd;2pC+o{R@I$apM`fa0_V$dMpL;mxFqMGt#FF#PID>qA*N*0AkThu`px* z3X2qty@HwLR7Nwv_J)KQUS2B2*FR3J&1PZmXDWJ1YJNyEW@#(}lX&cC#+> zK%+v*a&(Js(1#<~XLEjeDaZwmf!{75KQ!V#(CeRbLQDw%A~nD+WAypA^IUFeti3n` zepSXvdXp%){EXx?rAK5?tO?(kHS#?s8#t}9lBF!dc;BMqWzxpD`9^ZOQI&y00zP52 zFsT%V*3GFVBj$7yHeE$-73iqQgkiBVPt7QYo%VY@yPI1tbhlDwsGy&_!zPAcJS%NF zj2L+~H|1T*C_`&TM78@#eo+HX&KgHh>(>`*m(z*{%I9FyY^cM{N;Loxo-W5AY2O`7L|3>v@zw1j^mrhHsC0VZzeWkL3IhfDqO->rUlg1H_^|UR z9NH$>f0cgUhef}fd~#kq$KicX0=_ZCiqs){EzF_l=Lj+!J$MGP^TqUg9O&n`(axjr zbjWMkiV}LrRr*mMmVVFM!NpVf0gr>crbDn1x%f{k@8mZ?LohXu!ljwlw2$b|Bd*dN z_~pN-4k=XW&*v#8uBi>w>aL>O27bE01X4#`T)n+tvvYCWYhda*7*?&G*VF>)mj#$_ zI|Hl{G4AJB3cpun2&IGJ1jd<_O#7Ir13M!G7&UFe0HgeXtMpR^wvKP%9)PpZ18qiX z!l8%nt|2nz-cR~XhGs3~>r)tRB@uT0=c--*U!ZVc#whoD0iZYwu~=7pj)(q$VL|3p zzRe>lK!^yLN0CiFuW45{=x49R0n^1sH$g5_F0QIZkFDxCqH@(H&+D3=VrbAkx$WQq zv~2K-BesI>1e+egwt-;VK(Nh1Yz5s3whdG8>xgj7 zFVcR>o8ZBXqn6D9^-_W+Zv>*bc@oj&jX*Rv9TCmVbVPG4oj3uxBbvMs1Wo!BHk|wB z<0gX=@YJkYHlYe{`UK5)1kDD5<~xFB7D2O}pxI8)EFfsULp0a66Kc}qpq)7kYLs=N zckLSDlO(Lcu7S!U19giGR2~_qTV$Yak%78S2I>|Ws5~-I*Kwd$aB6qR2;pkIwV(yx z-+f(H%X-4bP+^P+RgHwI0zy?Ip{kKk)j+6fBvcg;su~2U`tS_*Q!r)3HkU@0*0Q!_ z4Y>)OTTkejPUu-r=;=r3(IfQe5qbs?de#$q^ssZcdSNyNF|(INA+xd93;f>eH5H`t zo+`sAxPNk>a!=ntNrF&CF|}UlV^s%gg@5(30-OK-irX(bGoYbP>5YXBND+i1yj$pw zFI}?GY;BF;w_z}ADz*zZB_3S9+>rW*1?I4Z0v#@bxdwC4Bv-)W|C=9<$3KT@PK&^! z-sXB|T?@2p78a%+FOpUzkQ@YwEs%vN2P|s_&JrBIB+=}9+=N@u)$C_B=gxNO^WQKO z{N3?kXoSExE%cFkh(M$7kgZoZ*-%uEWUt8$cEj?+j9HBFgrDvX$VZa}{aAcwD+ec`v)0KfZ z1PJ#M;U0d1lkl}TC4pd$)Qm@mE;H4DwF(Y&qwai^1mG)b4wzDe=1u7K)(qXM=+FQb zMt_K6=;9EH4h08ljtUoiFTO|eT?CPQ7jrS+#TaG2i{<=Y(FWLy4WS>NGMcd#^)fhY z{=^|KcMN(Rz(@-;N*0jMTp@f-(eucstz*!-1+#b^hBm>FO;OoGP1=Fj3i)LO5@OLJ zc$2u}H9-$0vO+{Qw)02m&GO}_oAmbu8}$6!Q$<@4e6EP^a0SvHLLuFJIngv2V9pFQ zN0QGs@pIN)fz^d?N?I`~6t+Ns3JFj%wh)Q?B~1D66*4vDL?%%}YUROZeq{@tMc}R> zvRqjCq2?CF7YqGb;|Gy`TDMzie^|$jW3FiGTZte}hp*B!Tp`leyp$>8Lp14Jz2kP3 zBwN%zAzRd%$jy<;Y*CPghQ=dG4K_M2+JV{t!GH0If++TSvhWmnWfIN}PUafwlM5s9 zZG`J&U64H!>!1+g|1e7f=^Lk1-eSD z{vogw?lo7{oFWu~e$KANc&)8cd&7n*M}7_QvFuTm-9r0(s(gwxHmNg-dCum#9T8Gr zVPju|8jkUGP|Ind8$SUT6JUoIOehuF)$d9?JzD6;pJ32gh1h&&StE>~e*d0Ab8grd zFpY%ZKj3QT6I&KsFs>KqcbM&?6f{}^H?UR{7A~70Lz9T<&cIeNZVPWU3k%YY7fP#7 zs1l)&yeDK65@+^V^KuQvl(7H5R3K{HMJg zU0b1V=MrRRq?t&1?J%mUOepRKRcNs!og;T}KxEjNcxe0VqTc)fHv9_&Hm16s3m8yb z`+?G}pgTXJp#Q{sx$;)NZn>xk@8qO6D6X~d$%2{LyK(FkeW^px^64i2LV-7Nl6&Hv zLX~^sxdH_>IOt%{rU|lGKv<2HFSnp(v!7O8Gh{W>DV!AEF^61t z*;{Gz|Cz5lZl%kCW1h0rnM`ovy3@JZ@Sn;Xt?9`j9`Q0d8hYKuZDi$1vw5NvyJgX) zm>IC|Fn*j~+@cg4x$ztk9i6_a@Pf!CqcE^o3O(LEM4vg|a_1a0S0-bYrHQILXkHr} zy9rybqBz@=1hRKKf1|1C{8SzvKVGamapK|z(2$Mm$&YzC48Cfr%xXF<(@n3jydf15 zL@IBZ_JNjCo!P=o^Q!8m337vb{MUMhmQx*MjgGT&rb&5fAW|pi^iiyBeZ2cTxoMsu zH%*-9AE-sd&>4SzF`fabE}TiVij0D<2kFo(cz z{{a~Oz@#j{!!HzwFxG$LzrYjikc!8UhE9m&iqK0ny)zlH|B2W;5&NGi?6^`8rV-!C z?wH2V_wgQqM|6XlGOq(Ux9MAIy!^vgSoNj?>)uks$~P6N+A6NV)&!;yT02(4Zi3>18jxXjz%dAXVPH25D*ZP|_1wyvoir?ZGmE%D%fi|I1(2&`U;Ar!=kyV{4P zQv@e&*aZH{`#JAK4qs&!1q8OMqCFAZfq;7=xU&FGpWcJpDM{1t(dsGS7X*_Egx^cx zD-iyK0RQUF9g4n$8$m@2%R8Y!qQZ}Y-)}AS9jtJPRJel`>Xi-rk*SnIJ^@4TGIY2{ z_?fVgzNdzDYSc)jdumwgx|*t*Vn61ff{kVTMlnv@i4SkddFg~^ua7;V|G=u%q~;%3 z@tRN%&+jLpHDXZ)eCDp%i*{9QouR7zeA zt)Ao(=+Z)`C=lFLf$%8`Wd%A}t^6TTs$?paD#@r+!D@J6X=wFDWzlLh0brc~tdggy zkpmj9P9X_+eL)}vYz#xSJi-JbOuh;x>ngd?AdGr3!i15_o&P^!GW+8om4?Y3vA;J2 zn?gft9NH8Pw9tiw)L=qtVHc?-3NSmLj#%G9|Gy93^Y$)b1xJVI!Vn}4ajZfVX-cwS z9Jy9?*&awY@7L!eeS!DJ!=~}~y|7hX(yA_LRae!Od^AbE^1|+`@eXJ}hE4hCfPwU4 z<*e62H(1=Q+iyuzynn7;fuJ$WX$)1Tyb|KZAO39v(UZJ{K zHeyrCM7?u7l!RKhJ5?r}m99)k#mR%3Jz_(H>hHC|x=lMh}WFh&cuqT-^K!p%z+UInHd zOSe;Bl$3Y;;jV;1q!qMGg4qA5;b<`0gI*dO>-92 zOvh2oQQ0i;(+fiA3?vl4E#op?Qa)(1z?8wf6ph)n@D{W3Ojmw2u&v<3={ifTTvN&me zytn<*ET43*RFB>~JtuxS^u1PWc6xry_};lr%i{3T(Eaz3{7?MA*CVmFJ#T|LjE0em zL49JgTnI5#YT__BQv-CCGn-mPPG@rb@|D>%G0M>3DgT4X(p642@~Bo41^M5>Et*i% ztt-Az6^y=)-te9JaFx@ zMY_@{%SztMB@UEUQ5)=Qp`T8|qnz706BT;{Daip;4~?sZF|~_o*Z65YX#uMix`BJ4 z3=`$8H0k>nHLDWR3gTlU*T%`{+UScS`u<)o=bbLnpUn(^#;nD!Sg;aOx?x1ACf$HR zrAL$VqA{rSuuKvuV1Mz>5oLuIv{aEG(8d)M6n0)vs?eTh!*a&O)7QoIm``$YJZjmz z;#}mC(6Bm360?fYoLJAah4x*6XAd{9a|`ojhVITkHA(*NI6)&LNe!!YBGpKx>3H^V z7wZ_6kmILJE#9jZlYakXKvIi~_?b7wp8{ZGE@3zor72{n)1-ri9>H`$2>O(&T#}7Z zwLM!kbXfdL@KO_g;DY-$n);$-Pe&MfZG2u-*70qZCrUO&qIU95l(m-QI?}JfZ!MfZ*vN7aQEB#pniBzaW=(m|2y=Jl5LU^Ol{+5oPjj{Q1bXL(s zXO&g~>LqA({D}S_pVI(KJHk|+BiSSjQ42eRO3=$X?6VHd3W|4C`HpBo5A=s?r5&-g zml#iz;5G~eQrYbO3E%~qM#-^+=&-g~5!O$}`sP?ac`z0U zM$!b-CnTd`WV~{-%5UE*$ZDbW3|Vg|oen9O}zPmXYR$`7BxSOw;)c#A0;l~0oGo{TF%aJ&?k5fdyP$~w2~OI`iY(+I1;MHyXcdSTnJtQPCk`me zq?R_A)KY1VC3GlVQT}a+=w!lx$gJo%y8SG*EseOM;ByU3w)p=xLRj^)LF!r&M?o#N z*uRx-ATyChW}*RSg1(`vYzEf^-4GWgIIBbm;<3Q4U|hLPVAq`{BD%p=B_N}DmI%ls z`JG%Xs$0p%)d@_*Y)wvBsf$;$6>Io_^9E4?D)OLa_ zV_!T<733^cC=XM`K=kQVi{&;c*D=Bpy?Id^$~MI<^gV>UE&$#maIxH;k3tSYT4y03 zI$>+H&<_ysh5-0rAXUIQV(>r=T14pwXcMhNn<$d|fK}4^1!xGjfhbd+;Ie+u!Xi%G zk&4=qU?Uoto*~W_0p~Mp{P_UxSTN}ek>!fo4v_89sfE6;i%<=^0@!_BgnOXizvi|o zcgQDXhkSrLB(Y6(SfFjH!-ANMgkOGWFsh+Q0Zf6B;7#!bc<$#CLs2v;KF9~UT4^Xs z=`s{mD-A{HlXyrl6QSJ>%|w`%Q$QmaiLfnHuyt4v6B0UZ`*)$r+J`nGWlS3}*%1JY z3LPrg(v*$8%tABKBs8@NUx|rG3Gh~hf|!Un_!dn>1n35$P<05#eWmU1_0Yc-bs*hf22*@0BQIT+r+;x~)#C2X_O^aj(iw{iuF2_}H{k(uE;+04 zOpKHL!lf(buaNm?hGm@6<_33KF)R1j9VX)0iK&6;37%rCmpaJ^_MKcAm(HgTFe|3=9EdSWodY%=w`Tem&`CC6`{Q zmGy!J%~2G2L;*9JCRD3u-h`buH6RQwF_Y{{TH6ZGUu-U%&40I7KF`L?Yq^v+EY;2ShRB9Vp#!>-l=>Xy_R$wy}mejiRE+L93FQsT#hCID8Y8!*>#gZ!iwuS{y!0)$lnghp!ZekAbO7`RV+U zRM`WECb#k0v&}4ZCod?j#|Knk7U(lm6ZMjBXkR>&RZ*X5W@zDMV`EQp*YD(wn4kZc z2H(K9Ee(%v8|N-c5wh23Bo>y{YCkuq=erGRwnm`KfcnZHO!TjKa}qKcKI zZ|<6?g7cS}3up1)?UB#NiCWP$QAMjR<3tU8#eY9QIZ;<}qDsmVi*TZ>BB$X*5r(&~ zRWdxLPv1ci?*5f<_tr1C`&WUxF}QRQUN`SIX(*Xok1+WF(0=;>)U-ik`gOj$&LaB- z$l{iS#Z%5n8#7Gxhw*Ad_(l9kxnwbG_^1YM+*h*q9?Du^V*@{}Led|U>yOw|hTP^Z z2A;+c4&Ii8z7a#fgmAE)IX_ClNBoV0@v)UT7a_k|J@FPC!YglpBW0`XSqWLn8n9;v zCGguSrA%da21Vyo&( zHLk#Jq%XF}RM?j?RbLYADLtVtl57`ek|dk|(543dp^jWXmIwj(E#&BHG5U^C+|Oga=Y`{FIE2!<@h_ zGTO%3-2)$6;p4gPptaeLRGkJ{%p$R(Q?l_lQLA|4Bdi+B9c4}-JOZ!8s`iKlt0JP) zSXC-C+99sfLWN+Dj3!jljmFlmii0rTbIe)z5tmTq0KFxS=C-nY8_}tx%p+%{RVmgc zefd#~j$ka6FaHa(^0+cnv5d||!klHazq5xxn3OlY%taE~vMUWRH(sEIF;I;ez*Tm&0HwO=dLEABl#hixaEOpw0O&KOu<&g>Aq7h^Cgqd-Fv5w zJ^&gfn8rw3C_V=gUkZN9VDwiwES#vl@Tf~>(vi5-6wjE|8#Zj-v_V#OJhdnVZ6n&M zx`1iz(RaYY9-m7}FGJ~qCGR64?q~sZ5g|*0_hPtyWu5)d;io%gs4O0>EFN9fIa(;@t6*Q(B7y6| zD%lPFAzVEZyfttK>Cap!DY$xdY2p0&OP9@iG&XI_sfju%Y<+8(!`q1rI?Gz_^3w9GVKq{C}3;|K71+Pq#NKcJP@#t~80 zgx~5kPV+;VVlPoEXcyw{sHY8j%V2;GXv<8!L^pZ*G6s@U*EP zV;pk4T3)%Mq)xjkFvVsco+df_qLZuZ!b>W(s}CGMCp(dEC7xvOHb6dow~2u^{n9?b z-e8k#DTW2sZHlqCo3++ty7qw6ZjG|sd>qe@Ex^}TL+{Zq2@Pj7o6-|s%df3HTdR#e zS%**8M#)Mv>6f#j{7;{*+kN($_G^d4i85=8_x4^Wj^{%7z){H+8$ z0JyEEB4mY_Cy#7RpCP#0XN|18-Z8Rndcf9GdhL**D-gsvyL7+9VcrwhaUdFYg_wz+Xcwl z@r8>ddz0gaQu^AUrSoPw?(>NCmD3N+RKh+^f*W4u_~-o@3##344>S!QM>vd*e> zua`cmEpJR!9QQvWr>_;COijN8hI}I07`0Q6o;-gh&CerQCfQ8VUu41Qb8Q;jcN3Ym z4)1Z|(Vf$o6mGh;n3oM$%>T|0c|RNQfiEyrWIrl}#L^d8>V^5QYPcWrH45QI5cR4j z|6TL6mlsYSOHP-$Ws5vlx%%5mXIPZpy;XSrTH3K-j}!8=3{kR+!?DHEUq?;nyCbr> zifr&Gf2F+{YmYSTq&2vua$a$H#nqS5s=WAA^`I#?q z@|rK_+v0+7t6|}4I{cVin_6~C{b=TmtjlL=Gd1wp(5uXw_9l{Qacoon0b?hUM2qbc zU!&S*+}!HNkE&|h+Nx*$HgwLMaq=0JOxBewahkp;Pi)yLI-3@WIcRaXM9fU)dl#a9OjnMli(8i1eXJghWqtzQ4w;1715I{ zQ3;_d=I!`P%mvu};vB!v__GUWvi-d~eaokOSc!+Fk*{ zuFmcUk9x_R9Ypjgx5SKqGg6qcPoPSmiGFc`Rg#362KeEnF!;RrdDveDV@kD(FMzBD zW)^~JIo+l}Llwh^zzF_(Fui=~P+Ganr%>c!wb*~2l%K-?fEu5r5Q>RqhQLgi^B9v5 zjNyCgO)*^Jf4VVNo`Fv)E)gqMV1B=pfYk?`r2JR9{P%t2bctd_iCNv5+>;q8_(&!; zW41Hf4#xG zME4EFMMVg(#V{(rjpe-j2*N|9Fo&SIDL~~zec?HZ%Uq-ce3xHOb$snl@i*WDpu5F~ zVpjMQ6Qt3_R42{pJyy@TuaU!fons~Vb1pbiaFeMxa;mUGyTI>Q5@qk@VHeyTJH)$V zhj{myxaN&tU?=dcUeXEP?j`=I+{kF%fU~@FgmY|CEa_Nb< zHKB(IM)=_zjx}$$jf?^Bo)1?G&Qbk^hw)-%XMGEV*E(IvYn>=s<7=Hg_ON-{7s(r( z#>?l~#(SoE4d( zJV8Eaz2#G!K0X7dkIxVu#A+lDV*L@@N*=^IDq1wY>p`qZhy9hCF~6Dx+mo=t=9g?w!pLDsY!zYSH@8`QH21Gu9EOusMR*t; zLI?|I5DtdBgoAq${tZ*I?`y)nVa0@bVF_Vg^yp?M5!RgqBdA4$an~vNHbY?BO@!?3 z|H!ql6X}MX0@vat(}Kl^%m}@3_$B`NH@2PM^<*bP>`Y?OAn-Zc#!w&m)E-}MMD8Rn zH{#+H{PNRC+d2*@pJxEy(YVd&DFl7jHyLQ!?m@j|_@hIox07Gr31ark^wD=P$NRDjQE26hSeaq635HXKBkP25pvE z`23YYVXu-wp+aC#I864ZAp(Pv{YhX@VSiditzaXlWfYHZsun|7iFye>L0Sd#r~>hh z6x>MNPo#z7o^dm#<_Ol%71aE-+S}m?et#bBV#Y%;`pb`cxbJf%}5cBp%!t$}k1%3-7dI zu-{HcQ4!~4#D6W`x%piU2ehkP+6GOS zIj29bc4gjO*^BhY_{B1 z(`tjrGM7Jo5sudt8sur7J{W)U(7p|kyK$!6;Om?xCFirDXTi!`t;Dl770~;9&;?B8 z*9tC7%-%z>2V{{4qBrlAo)u>vUF+_;V%5S$PKQ(ECTp3+=iHj!R25g2I>b+wVZ@%1 z*fwNu?4ezI_U@LiI~2X~ptQC$`^wQZ@uBU@jMmj&te!fw>3`Mq){)6ePu* z$1SZh1mN;fkTA8!bFRwajS)U*Xt&PSHFW)!t?Oi==A!U}`!*ht((RYHV~9k;dm&ej zQ7?i1REzk0%|kr?FN;y2T7>%ZUKnzYPYR9^MM5QMq$jc(awfh__K-1+b}fkBvvu2U z+1fnO#&8muu_kgOoAM#W&)}iz4q6X(1hH%jPUw3 z?iA)tyMzn%64;1~k0i$=NcZmFuyL1sU#V!@x{$3wQb$)G8&5(&nb4g?*joS*1?p)P zpngH)Fuoh^m7MEWAiah!hhH#_v5b*B9CX~Bs2vv*dnz$j5g0E^$`l=TcZ#-@>Myrh zwxq~AH$a{qaw^PC+r!t-VWsQABdd_to5?N^AgqxpPLr8+%(DJy{Ei(lvd}zHL|E9y zP^nY!kxV&EyjwKt{!-0#Bg{64EDG>qy9oB4Q!ly*1IdGLxKeY{k0qQS%ijvK0yG%m zD}64m?jashGeu&t9F`jKHk!H#rVZHSIyhXUz6K#OYwUcPO317Da*`8+TK z0~Dhzcmp5&>HokQf6hfd*nxc7fbHdI>_RLx;;btvIK<+#B{}+{I&nW3`wT{lW{VwW zyPIO`#mj3jg}`&3JT(xGFPLJ*^XS^MfC)7dMef_b@sPAGt*{nzb@hOUNc2*E@*3AQ zZfjjI8TXnLMbes+hA_F8p%{MTudVkJ*@t<#J4)BBkJ`2tm+4W`Bab4jIM~JqfiK-2 zhXld4Vjfc?T!x9D5T)_HX83$FCj4ECdFY2wFr%Y4nwA$l63r3cUW-Qn1-*ol8>A#0 zRkvi*e46>HQ2kgbOsLdAHNak`rMl+z`vn(=+c*aKyUCBP5FLy^wl`UNA!+%%t#aN? zydii~c!>6_l(Da5n~Io4J~`*)FhM*g(#d6+RI-A_u(NN9UzNbB67|$7(5cjD1PjL7 zM&zBA6Ph7?Tw07C&+W@J!(Bxi#K%2W?H5>o(2%o+?P&?o$4<&OT8lz8Ohu8-jKv#8s-FLvM&1 z8dqL3b(ck+Ng1J8(u~ag$CBiAGtcDCsTLhgI*^g4ofnenog}NSvCcKn7sb1-*l#CY zZWrq1DmS=dZB;c}YVY!iN?lr=NO-B!W=07 zA7$SG7S*+d>o}YIOqG*s$roY+808X2XS zy0jgbnbocn`ri9dYwn^`bSyWvAGS3=p84wpHxG?GFJYSe9MOAgq_Rz zS?Y4s^#>PCC_8f-gIcynzp;Bm_k^xin7YlF;jWgyvJ?6s{-#AFxGpZNDS$>aI$Vl= zg>h|0Jd7rd=!D_`qh^y)i(wRk`IF(z64Y`JhtY*(bPbFyAYVujCZ>@Y%}ykfL!4JT z2RYzu2rgKCKIHsFnB0?IWumjnwIY~PE4q(BG;^Ul@3`DEz+O4l8W{)HXwYzl__8~X zME>xD;!xzFT?f^0xQHBJL2~?3!%xbb)IiVEnxX>cyrf;;7SqL4!+<`PdHa1 zwQhc8;|Vot9P)U-K+h1D?S}ANlC~phZDL?nX-}UdmxTFy4By!FmJnv`w_}J}L3%fj z25!B&Pw5*;>E5DK=hE=A}@24*DuTcQhlt z)@imZWCB?8ZOptMC4pom(>HvT)f{E$+C2x>YSztRHXcvdat2KkvsyrQRFeP^4D_lZ zM(lwqrtbSwl@-eP6Pvai#kPc9a}16R7JjbX91<5|boC*0&h*Zdf8POeg}eN&g9mpV zQXW3IW5*%Q9BoYSp3nnpj`Z?M?p83-B@}54q<&6`L`YRgkirbH*bpExmk1MC4+AUb_hcfV43eE z)WMi5NT0$!x9!yOe&K6L4|4Dr#857Hv*s8ek-z?v-4VHS$NK^P_Wc0A3FC4ra=`qS zsI>-c5Gei?r1MtnwxetFnH&D>ak7oy#@fO-<~&Ora`{Zj&RC{=CmS=583L(Di*SjU zGY%{~a^Z8P!T#A~{|L!&*w2h6`&rYijQcH13I6AHi)^le%|A;Xkj=~k*nA^*S_J~| zp!Q{ZIT)5fhjLNNUDO8kMi@G{$m8xeOEP(*_0kbaNHzGebj8F&8ZrwyuyBiX;ODT= zIc#_y>7+!p!dQ0dR>rnbJMu1U&yj%P<1*-UL{o{GM;2YZ0=p}&7m4Z`!KQ&Skdh)o zSU3bzcz17~wab-rJc^pH<(HIY#D)2$Y8t?wzczg)>1Pl9mQ(PKBrm@c_R7%{%t=Qg zyE^mNg3P$&B;3yTFJUeVQ`kHEnDe+q=o-g}*NE@%zHyW=iob$Q*cGuWJWPSu zQ9C!O$t==|Z-U7ZyWqwC(`mcv3PPP?HDqEHHp>FBSASeNKD8fhQ)hPSHpabio&=lb z(WvdBYufAP+{X!;hU_`)uJ0oc9#kCJd3fg`brm+0F1oX7!L=Ut*UUx$>w*VhTv2;V z9)f1#4|wxeWTGS_)MJgCvajVUT$DyuyhcN*)Ig79O;P^x?8T`I_w|ymqziILKM64j z8jCfUt00S75s1WSty+G*KQ6!_zez6cFN)91GK4s6^C3Fn9$(wuKH++m%I88#IX~*e zV#F80ky`L;Ym6EOYVCPnH=n>|n+@ge!YN6{w$nkUyo(BYdS%HmK!uzbgGra`pRy)N{qSoL~p+c?idq`$wi!LdJ|_Zs6~&%mv-=FnlywEE#H# z+r`g?%rwc+#f&xmjU-6GVH*s%4-*w9cAVH6r=A|l>{}hVAzblA?}guPSIc&*=pQ(N znhx)heEfmb&+u&}Owmc1sF1ix8hH3u+XPhDl7GFMzzDNVVx_hos4Gk_DM4Lfo9vUM z-&Dbr%A5ED(;qBSt%WFasbG(JJiemi&z*NgB^cWBkK5UFub@}3e zj$Bq4dl}vAJ@LGSZ0?c|Z0_h{A*h9Zysjo?tgc>@Uq}hgXvPbsOXN{~5dD0^@0anW zYggnY$6(N2gf%L`y-Hq`kJx8*+7<+0DT3A`sLq7&4+Z~Ta_Z{EY&^^0lh~;Oi#z@bbg6}Za<+5(}mmTQQzn3zhtRrY+5+*U(c_xo?~?NL>uwL7idL;FX(Ez9eYqiOQ%(J!}8^S<*O=b zRpCYx@0?WXU9G%Th50W{bv~?-YqO$~D97=9y<*Z!ow=Mzj6EGq6_Ww(SjoSrPSVLE zz(rq2864FWP;e=^1UxTd6RU*JXelo)P}P!;`kW_|5}Sk?(Y$0IyZ5RkSW4=!0-0EW zPmeA17$NkPl~H~9MospV~C#P-Ci?YmToRZ4h zUQ4kd1+cQDuqa3Wtu|LJu11O|J8W`H+Q&*TZA{k5kF{XfDdh8ZO)cuez+B5=+y25D z{B_}^3g3~DSlV9~XmM6q(`j+!^N-5Am3yzu2#!?KO9-j_ovE%cROSAMx=f$1{9mTJ ztlx!W*8eiqW&JMvqpbgBidk>b_l^U85Aij`3&MQ=z*`g4iajG|aFDhMJ!uDF7Hzs5 zbY0P2H|z=vD6K?x72Feje#cud8#H1ev%zLIu_3ePz-(MSXaveLeHKc2kRuu%7zqPK z#X@iKFL=U7RHzX!gp4?!hZs!X;?r>FJTioQOP`#bU?>?*hT?UK%;MKSf319mScuk$ zdM#Z`9|F;v$VrbJj)2 z46f7c2h;4`r-IU%X0LQ6?o;*I>l47%_ni)M?DgsTUSBX9ZIpDqPG*yGeP;`gZ;L8~ zF5(KvK;x1cFe`>$D8&|$UNyvwxxtb_f(bJfugjOJuGZikb`!`Mh^j;}{0YMMf~N9I zU63U^naCLuH3wBI-;hBJ(ad>6zwM#Q*h-^xVWNCVGo->=mHc5@&gi?!-28;9bdBR# zX3466P+z5d$wHS06O>CF{l7!ClLdTT8CO|{|8yyBn}wb<qzRf3*^x<}$)It{( z2anLZRzGAo6kah|y+l6Li|Ed!~$NMlFailw%+!sc{Y;u{Ml(6`E?1?=Gj;q6~ znC%gpcWhP$g+--kp!#N=c9sN>c^0j>CI>+OJM*f*^6uhlqpWJ7p+@ci3t=4Ja;YjS zO|zGkpD?W`cX+6L*?0@s*V7um8Z~FWg#+q{@ltzB};%Fd-;EXhToO=G*<$#s!Z7P09X z+Mhx|v$&Z!pu0?8cI#utGcI}4Ib~UXN@=EMH+x_*Q->fi=+(Etae089^1GEf@4vAU znKyPoMlIOaiL&lM4qAt;DdR0|itqkZaP8&!f{=xI8qzb^V)96(sj!7lIdd*5N7;ID zIvF1xiQJr;yk!d$t&~JLb};ElxYnt^!tg)Qz9a}-$Gjr^9IF5q7gRf}Cc|smu2dUA zm!{>nWdd-V+x}E|9w5CXb z1uOpQk46;4{N3(t!P|ni1*1&3HD+t<<`_d+3R=8Hwu+L4WO1^IkX+1?mBOFQK$iGw z|73oN;s1cL8obg)<9_1s2Ps2Uh!NTXo^CYCg^grYD++NN`?ty;<(j}o6m%OWUa@=% zy%jLv)^BJ;)~%^O!TsNI$i#Vg8?_KN){$N)AUBqmRsIY;6<~|U;%>wg|FB4_WJ`Kh z4lQ4Z7gTu1DO*T7Ul+93jbeWv@<#qJb|!Bv1YXy2IM)N<31!S)czj)JVJ$)K zjJsGhMyPBQJ!%1zY#))%d`sIDxc_d-!?vB;&8W~A7}g;CS|$4PK6G!uB}_QVKR=V3 zo*M5zYly?hi4)X_+3muw3iJzhRoX92d#Xv3fb2~p3I*L2zgbvYgG8Yw__&?a<6e+z|tF~chEF9}ROgVC5 zW~G&88wB$^cI@7(ftix;_kO>3zq+EVDYI4C+~hI8OtXK>-c6en#6q%d$Bu1k*%k1u z6D0`6;sn^kLjpOOlTRGMk`cbE(|*UI*Sn=lKEYr{b|pY462WOSZmJLvq4^|<&v(HK z5=Tb+U7hfq1T2YTK@N$6c#KLjJtq{2g`eO6PvYU^5=U?(mW+1x3}H4)@Yh^Nz~GN_ ztq$N(@0Z|^gT~U1c*vZgoh>1lzoQGBBnhb8JAl%cv*;q&i!V~|W_xfZs2IlJu8=A^ z0%xgKvn!7#5}yFIu_e0=-^Jv;G(`q8=N3O~y;^*&?yB9$QFHBP;PkWrSvrip zA-b3e!*7UxhT%NYfDK1oF|qaFVI^CHmp0zSO)}3O$-6Rz&7wFVRvecJ8tLK8%en`U z|H|W@TMHvdEu$SjpT3F`VnyY`W^s8GXjJ+qq-8Ti{XXD9zY4cvEklmecgeygeJ&Zv zDB{8oLIks08@odyJ1ltU^A{Ef9y}RAu90uy8q=o?DMz&%adu+djWjMsrNy1Z;!dKR zENmo4ncYI{4pzI7{D76FF9rJwG1@Pu@kkc%EkkZdDui)-dyH)oeG=TgHbvwLS8s}L z<_gKT#Lx*dyDB7WuS&FyOL*ZKd*Le6)X;cE!x-QC??Jsl0T`&i8M zom6-x!9oO(BqS%EPK-B{m9DEoT2ieTA|gPBZwj`onI9D$!6TTLM ze*}Mv#ZmH<;6G~bGnPDMa7vuwEuhzIP}hK}3KaN-Dv6?osAd!O9MTJiZ?#|!2SxXP zZ$Se|h5mO)ZBfBs#Gby$rolJIenZa6|7GB*9U`1d2PR$gOMy69ILF`EaW3PsqI_A# zv>j>>N&d-IUduyQIcj9uFWTcpqfu3lHgDc+_fq!-iuqaY*LSPaC61wSXH!qc0(?$H$=DOir5O83|Y4vC=;s#CA9rBZ}^`a3W}Xt*SOEJYk9?E)bg zz7xe)i%$#5=oYpgEmfvtE7FA*0nU7V z9%lR&G;(QRw_rB1P@xIEZ=k2nmD&$MuAAO_QfKHqsr`Oeg$fVRr~5PN(+zWkhvP5+ z%SF@b9b)*JmK-YFC=o$l1ePvA4`|^Airvz^8e0S}4HeE&@COl?BlZJ*caFc9g${#D zD=-mS{fW>VIhWGv*1d;#2t^(R^ub<%Ue*}B1zp8MDcgeVf(X)3LiRP~-vg^8TwttN z8Aam}feT&?e2l>p_EL(SfzWwo;@!0M;G{y|u-W3!HfzLc@1dGa`$bH<3E$Y_3+V9> z0oySN4~NBwv)F(qOx^dODL;dFv3Z;Id#_ntj}c8i%*~hk5e+`7qzDW6p}*P|qf;&E zOL6e!85M1ddGu`8@eO65Kds+;f7*-;741gS6?TeASK$TXPn1*qiMACO*bT`-k!om# zm6UcZG17IdaKqq3$F|uP=##eDRwF?Kc9|9Sn9yRdLE7f@r)U9^__aA1pliWHFvlPK zd8uzm@Jc{ z8R)$|E2M3fl)qs}-m`pho29{f@`m?Jq)6VN`?z1@xBVKKJT4(_bss#t-_{|H(H<4S zMX`OGHDz>opr=iG-}lS)qaM-a+B?3!?Ml0+ur5!s2s1s6un<$(pGY6(5+140+<031 zgN&wHgqee=&6=O3%eo~3)d*m~PhuZLV0khj=YhyN2lMdb7x)J{IVhY?2ByZIJeHgg z{6olgRI6@R?@m5(D)XeFtWDV>I+QJ5A!PIA38&5%DDpy2c?Ydt=j$J{A$rfA$X$EX zJ641Sx`!Id1oLdstvc~ev?y)4|I_kz=38pN`M zG%*rz;49lUgbr4HLl3QCAEofb6bQM#r$$yDE*{9ZOQ2Bi%9c@ z=<3@Z&r`>^`}_;0h+Q_A#uIK7p!cunK!q6BuDvSi>05|U^Lh{HHrrf4Hr>Nl#H-q} zAsDfk<65MFThyt@{i{o>_y2w00L-Bsb^c>lUu=eL?lWvgo2|ie=`c_yNww$D<BlBu`%xNK$moGV)$@m@!I-ID8PyeCxfO=ClW4hVgZ@xkv zJXsifL09qg<`|8i}1CFoc(DZ%1cbtVYAVq4}hjn%HQ~*hzS& zcbiNHcL~Pn_qrN-{=D$Qz+*T)k*M)TK|8bK-&C#MTY`NYl}^EDQnqMp*@Xu(tnMn2 zl}yJDs^`jUQ&yuM*-DB+J2JPY;Wfdpd~SYjT(> z)q(7$QIOqSJ;<&v1=+2Y$kPrKGJ9CJ+>)R?3M}#zPcvW6d`gV0tbCW@tuzAIib_P= zOU^c@;nv?zmGelq_rqE#8U~+}B7h*p8h?0{?q5eA%HJRw<-btkX#M+yAk_VyoM%Kg zydIwnQTdY0WWFh_pm;CRiTZ90UWMi_!Es4j@yTv)nnROPhT}KsJe_$5d+5iod`Wr| ze>?O1g##GLXH#&{VkCTyJ+ld)tPf;5-&V>_BjsQ%?5YH>T4WyC13ULOJ0mhNs8OvM zL)D1^hhlA{Zf)wApV6q^6W1l9nq1eV*y@MmN@Wv z?+!S96b~=3&Z8WgflxAJzXNo9cYt(sfc>mZ+eQA}0p~V!^1;e{jU~ewGql(?T#!-53SFC<>Yz(qQ=w|I^#lCQ z78mX|-MTOVopQgk9&M@t7lYKqQ#m<)r@WT?1-iH-2BMzBBCJYCt-_RWs7Va3kvx0B zDo=kGCCy=O(cbL+X_}Lj{KdHR_#EY}3**UL`)#gUJdr9#u;+>KB-~QHh}Ug2oHqva zisiryye5H!$Tc!_69#9j*8+4EzIzj7H}4im$67x`&)HcQ?lw1Ly=IY_)}zL1z}X=6 zG}de7DKD>;Sg+H8sWi2&UYD96sYxt!!FnwWbn|mmj$45BD&Cv(eY)o4W&TopW_+IV zemU05Zkx*{4-GLwjv>-(9A2e+5cm6d*zEwd!*A;fOkvZz%ss% zYI$TO%qoLnm6RFC<+dGih{0f-T4^|kelA`)Z^lCZk?6f0Bo&oD94?h@jjR!R)KaqN z?X6-nmCTZoRf`9p^w$Y58Uw3gbe)F^0%2)2S&DuM+v^aRNS3X_#1PjcMl`;&7%dF> zrF4X`yIRCM(C)7|S4wjML?t4!u45v_qtF7j zzaX!{kEJ-3JB`dDT{Y;I-9nD>VB0GB`Fz0i87^K!HL@f!=o)GR1~iCDba|ou;87mB zUA^_|vr1DuG8xaAFlgZ1yI`yq)Z{V0b?xeHfyz0HV=e`tDOc3}-(a8umPyILd;OvF zYW3*U>+_(4GVRR1gC`M_2`ja%0xWcu@ zK-^C%8-mW;)~MEA)FM8pl9lNg#3F}a-!PH)gxMjePgsbum&vazOcRcw-OLygv)Xcl zU5F*>NLN>^FJ4_S3SxSqGhwX?dAhpGGk#Rb>j$f3pJOi{6UK{=nf%1w1mmNLM-z^v z^xDgw@IK~$)USyc_xzb9Bk{^)0DRAU%g)5_vnp)WIv>n-&6%*c4RO;!))P;218}vH z!Iub|XhOP3C4h@*C+?tM+hYZR|PM;<*fY-n@m<6~EQdj*9C_ywO#O^Jz0 z)DVpUjFnE*a=Pg4El-4wDmPsthUp-)=V4FHq$2l*uO`y@xUfJ3`;l12Rk+7DOP6Yg z=@Y+oL0+{zf*W4id$b)uD+l>ovj}M^OZx8QL8cn=1yjv#c;9;;MIP1m1#gDJ*fjP@ z1R??x#Xm*AkS!AAc&>fjCWpbQ*a&|`a7Y9mW_ySHL*8kTQnVp7=CMearXs9%9oF!D zTd-pp>)QQ3 zZUTbOO~F$zo^XHs-*MqvJh$(_hIq71xr<0XtN&-N&#(~(kQ4Bx%8C6@vNqh{@0Q%e z@1XlG|2+V@zRQ^?9Y&$BrqZw1gcqB*gl;bN}OV9$l@DU?_o>ZDto^;W0581~) zASxa;H4Cc90yNjg$rn;faH~0odAH)NTWytSPJ7V8G-15eg*#v ztS<4l!6=IuH9nU7T)bk=^o1)&YK94e`1^QDZq8Y?aFM(BFwI1INM0CdqDJSqm+a(ij7Jk9rdiN4a<`uf-&}V%HwDebmg9l$?+qgYcKXmQqm6DEf8mzV z_F>DwTK6Nnv@+83mc>!>uolxzyB2pPp|GPOvuXZC0lS*zcC3? zVIEQyynjT{z}B&qpdhI5z!bX5OWumx5|<(dHSsp zhBa1x@_Yp>u&N)$_@iC6hlLfVb^GrAjST&&n~(8&9+X z2E8qLW`$uma&V>XG^fRlhP>&7GQ*X*zCtGh)agsHB7t5Bj{f0nLuQ& z4+!${iuaX{!iM_N?K}(DC5$rtohO37S?bm%>=$u04eVdTgG3b&=8ac%mWbDatmiG( zx&`?Ud>eM>xk@Sj-QBm;8Y#XVZs5Zo8MN)XrRi~t{4GX`LdYl-+Mhqh^@%QM@Yx;-^keaQaT5Uk23g zGO;5@(V0J3*FnEj<0%66vhIQIj*HqgJQwl{^Y?4^)S_|t6mYE~t~hD8)snj`cGI(V z8H9c@Empc4o>w=c1f-WCvQ<~9n9+Vf!W%0(aQNj9a*zfXTp^^;9^00ea-w)pG{96#*`!v>^pqDMnm zsvCo6bp$u<=SKXbJE(NKqeb4f1MP2gaXzTh8t`DXspek3BPfiZV+-tRLCDKFP|lNG z_W)UFpTn?xehNA`|AbUy&%Y(Rkm^SNt7Iajx^cauHEw}TNG`ppMKHdJ{v*;;jeI>j z9M2+yS$sl=VLE$vN>?^UOZ8`z3G|GjJH@`h?%9xcx#e=6yb({c@|Umg@CCY#abmr; zV8`5dz<$~CcfY*MP|?%x>la4bUTmW%k56f`w@%G?TtSS%(=pLW;HdJA4oRZgiCig2 z%IPe}NMmr)(+~t1GrEQFnuw@PlfKHn2MQHdvm;ovFJQWK9tGHMK~-qn-B)_F22F{P zCJZ8_b_w629?O9#+YUojIHgH30?!{q!*dV~{E*{2&q6E;yrsgi{rDCsY-yIi=++y| zE*saI_OVIV8>%TuIYTuiiwX`5&bpF-Y8 zjS@Y3Ach(BJoJ&k&=#gvLWYiJV9RKdA{pz*%$79gGh`|>)=OkRu28*~etrkh@2KZo zPrpulWS$Cp#^~{FDhWBEB;<>dP}EE*Jkxd4|9+pU-)V4Tq;cr@eS90qW$g3(Zp-aW zF(WTi%;}ivOsU*198Tf-u4ApG(;JZ6%E~l#-|;BquC)u#P{r%|n2KYcRhQhBpT*QU zn79tBLBH>(iw`Z1j@`!yf5ukamOEnX6&O1jV|(0Nt%}F~#;g!nyXMoZ+;B;lpo+&% z#n%U6=eECJ*J3Tx;34hVBzi7r7Xd?s>@WQCHH5OTlV_W6dF~Pq^3g^x~U8z*` zMD<#!mGt9M?C~}ccT#2&J8QEF?|g$lsaAbk&-Oz~5`sxK(FVMM4sUc>oiLc7N|7Rh z3T>5H^-UVMQi#2WbsjFILV~Wb^5j^Vo=|r z+hFN-OgC74vo(TX*7zKlnG@fNy8t%TSV;a( z`WEF4`EUBo)rD@ezFT#hD-yxjsPt{RO1HWX&C>Nce1`k$1XU7sL=aY9Gb(L{n=SG@ zVXDxbKkj{S>0$+uTTB?R#QpebKlRFU{F>B_*+mL4s%miiI?)PC*69*e72?|7~hdUw>EU_QTZKQ#lt;Y5vTwXok-f zWE*k*=lWr<(^FFWG#Abo=+C`>pONT<)a!8H&q>?1!TKvNo%$BkQehbFdLk#9|IokS zJGg~XyZL{;LGA+N`FgLt=~R`D`kRd-`J~Np;rqvWy~W)!$BR>jp%}sJBZylI+F^0GqlH$VC!u-nT+@1 zm+8GYRY1|{`d$YGrNUiYHUBgCrQnS#=YNJm1bPqYC9aWF0vuT*45`Jeo>ph!Ubh*c z{j6iWqp}tG8Hra)&IhkZQ|De}Qr+e!PgZ_mx?rT~m1WocG&TNAVMxXrJB5Rr_l&uV z60)4t&I`^jtMI+CrB{{e9P|26<<+~2AFYxmC#hv4bqC*CEXD|H+@U)DfqYdzdUX8~ zF&T8ka0%zUFI2iRwBk-AyaiiJ-~(#%d^{=b^D%zLK3IeOr7Vd*uaClBEKL;30_CJ&&N{jIq8 zL0Q^L&nPw8d9nK)aRq}eYf|0q6^nhATe&U&;f%L>i5;{2>_xv?<*UkT_ix)45pk@B z+J`ZBd@U{wP?Fx`#u1sOU2#Zd8olli6>M-!&p(hq7lAxsX|kU)6~*$Or3V< z3>c%eM(mJdteYuPz-0SJc^y{E{o;!m*${eo)2Bgj)>jAdG;>6|Rkyv5lg>D#mJPu( zBz-?ae~82guX5gf=`0DlSfZT#Nx&ntI9w(DBrsY|xGR5yk)MM!74yYI z8;0+IUAvHR2!o&A$3t})J=wO`$mJ$~7mv0F@Gz?vrO{nu0mgWUIzUW$I`3IQ%3V3Z zr2hsNl#Itp5sW(s^?@Zkh73{L=`yiNQd_+zCXUn;;t zBG3$A*OFZ)Q)2MBI(F6-z{=Tk4 zj^gfQ!~ckiLX@=G53jp7w2zE`%x@gj^TXQj?d5-_k*<6~R8&IZ>XZKdt3&<#qwva} zGNVLeSjb0VvN%+D{@5Ta3Bg{y2BPcurCr{6I@A95(Diihs$2}4UPGyisZ4TQs@E^X zwQm}_l$UBiepf7P7LM@~NEu5wYd149n@r%;P&S5Kl8|xD^Pw{=Qze}Jfm&naF&lM= z(5nKEok>m1DUH|MN-xbvn_gK)l1le|@8;Brg_t&Wm2G9n22jtg1)NV45xr zetm{C9r!z@_`9k!8Js{h?WeVcxP7{apN!0$IwaTn*8NMF5diUYgDp!OHp+I~ox^CcZgMpzMK zGgbyVnq0&cS|C;B<6@{w*KPyTX{>b3CYa}{c*Y>-VBZw-`kl)v>i6?B2rT~@%O zw%%Cn{|rrR>)kF+>)%ji8akXX);O4jd=$Bp}PPW{33xaKOxTybQ*CE*XqIOT+lj3(n8So*7~93ao(!w)0g<* zO;jx2B#uLm$U4#G7C`<-VLlRr^bVhEIYv2pUghswG)ECl;B;!&$)4JI9f{S60&+>Ji%6X1y7ZIbn5)W(HiD$CXkNW#MyRNYFRj*BsNJ><|Yw{bv z;(L!{?y=`Dp1B%ZXK2cj`enYRyE|dGC zN_gV!KG0cHYcO+hE#BpSQF!%QUBO(mneFW`i<&+=;XT>Jry}^K8MX5!&B8GYc6q4# z2CI#R)_+K3pGP(b>RJ(8zDqHF4H`&)*28_rc3%z1LHgp^3&qbfD?gvUz}MDZo$th? zq+}-+DeKR=&mT8%2o~L6BkPBE%@!3f0bL)ygwLZ}EKsExSII9uSGD{nC3I*l`{lY- zp7}A&9*JDI8k>_pUi8gIRQ*eYW$IGWnF>mtQj^gGiNSIN?xv!O$)1{huAN# zi7IbHFd|S#m+)pz`7a_g`I&hq)07SAE_3EMyI5(E;b$D5vfMHLJIcX1hPV>bpT>dV zulKIKh7PkYer0DJu*^dPL-*ERxU0-eUmJJ|zZ&0uyZHrv_AhX990sR&oEAzLVpv4} zJp-L)iJ0_WO1KEJz))ruc14(Q#pvR##W!KWb*o#5I*C^Gd|_tV`BUl#zSjchC~Ta( zW}4fayGW6$zkz=I^f=4Jaz$Zg@`cI_cYDtuPd8tRRK1oAUt<{U7 z5_I_2kipw#TTN8Dc^r?U;B0BIsR~gnZ4m%=6JAJH5nHsZ=m*;nEEZZYa2pRT<)j4- z+vU1I;k7PMcwMf2jWIvA$F>vHMc`5_+9`AtgB1A`qbiRT94$Cn)N40;)ZysjV~eBa z^t?!>^Ve9?Uob=Ao%Gk5;f-Pz7&Gt<<~9MMir||(P!t-KSHY;O?pNh+%PGRhm+bTU zoQGFD&VF}Tvm3{H$4~l9@O=^g=L6Fkwe(DUY9T=CRXZV@F4S8SEG zI}Z=?CC`f&5fSNNKW`wWbAzZ0@Kq_uOKDO}ckBXLjG$a&O3`vv4pyb)AU1!Eu=oO~ z+oMz=pVrt5XdbTy>r!$EUw=&-U{VU-UcfehPdPRt7@P5M3`njN#hp%8!yMAj=236S zy0yL=S17-+tNr86rP_zNiEDylH0fDPf}d-`Jmi8MF-q4KBf;YWt&I(>P!)Q%*bv7m z!OQ{y8EwGa0zr?A5!%E|Ut#(JtFVbe=74h*dPy|%jtS=i%9W2YDsOAxq6I0E%w84X zv?B0W>T1+qPWdP;e8%2*07k@*;wue<7zBYDgEmKGDsf|WfE&#?3_Ga3YxZ6s^MtM# zI0dfWgY~yX<(J{$6|CcB2x2q0UfiCENRsITnu!mS%H9W`wC8BRw%u*3m79VDT@lQt zO2(5_D@G!;i%;tqSVdh5(daws9wgkQSvg+TW#z->Z7wf>esODBv(d<5b>}O2IuRl#NFNQI?Q8T?#*Vz-A*k^UQPoK?79e^ou0DIwi zq+W6(ef7L~o_wq9+SQ0~&KJbh~4z8^5}$-?|%7_6($WW+w|-1ZsT z-`1vuSXq1e&(ch1Q3(*rBTj)OQ+_-%>zd;6tQ4GQy|rdlFr$fmMP{HQ#u7MuiFQgp zDp#t|S*nS5&AJ$PRryPKS!2cW#6_nx7Kx14QTOBL6zNH)3bN0v4Lq$*rBJquV{MgV zE$wDnN%zvezW9cU3G~;kU@yDJs<)2hWl=MX3nB!n%Ehv%ga4hQppT*+387 zr^F#xRte~hQ-;=SAS>x;R2VG*J{{D5wg7?s!Fs2-XL-@ zW_5!_0An)*Rhmgc*4b@zS!>s8JG-_xB4=H(IfV4Yue}_iY9RfA=m%jtaz;e)P3%?J zb0GCV%7Ii|#twMx_x|3iitOomi+zk4S+dS#^+w0d4x1c%?O?<6Hx`8F&x6%H7qaun z>TrjRjvF1ZfKBUih}BISW!$uE@w{U4Fo$^8^laz6ybmpa(=D zx{@{Nw83k=?>a9`w=Q)<()!dz&x+XpuZYDq~AN69YOFRy=ZJuZK! zzsHn?9TCON_>(0oj!4uouFjo1MRw-uq|IDi=g!T0J9iPv`8>I3X~zzt z4#PSu?QpO|Zii-3KhY{tzUW=YZXNq~T-edSV@b!djyJ{K#FpZ1;@=Ir8}J678B8&7 zGFWQhW3buas6mB6t-%`u!Z3`K>Bo#`W-vZX0JDYpfk|XinM|gPsby|5&1f!R&Msz` zvfk`g_9z?8CQ1w>#*)t@rV=yBT#2>BLlP|6FG-g)NghdlH5_kfW$0|U%+T9#ya70(Bk90K>fNhoTlvZ+v+*jN0IBrx%0Emueum?>E1=zWpJ0tUCg@#blK8n zPnTm|61${#$>~zirK-!VE|0oA?eeAz$fUAvvQaW~*&>;v%tPiQ^OuFnqGj2#JF+LT z7hPptzv()v>#VLeU0u4mb@lGLvFo<3iCr&ut?b&|wYBT>u5Y^j)vZ^ze%%Ik8`Eui zw*}qox-IGE)-9sjj&5 zzP9_p?kU}KyBBu9)V;EMefOsBE!`h=*BTicDU7}_>TfjEXr$3hBS#~5qX45YqeDh< zMrV!A8%!^@*4RA`5R-#xT`U5tTyg%Jji&Y@dV>(# zs_{AF3&vH(jm9m;PmEt0|7lG44m`_u=8gCs{Ac_?ehfd6H{%!Zwmi}c@~ilD{1$!> ze~>@M$MA`K7Jr^E=NtHY`~&_8|AK$Z6O)c6olImV3X{Gj!%QZc%raSM;$Y%#;%gFY zvcY7l$sUt~CdW)-OcG4an53H&m|QlgH@Ro>#N@S!wnxVvk{+FVbjQnaJe7$nZ{5kt zSnr;#CI=)=OP2*XDM#5ifT3p8PM(aq3t_6#l#EOyUFG0A=^sOICDGB)e@s)ZerWQK zyyP5z=C@OgF*l-{&@wM(a?G?-Q_uA8*+QauROJS=eM!xZ0^WVeJY=iT#~C)UvIFy( zIw)bGi``wqO`NgZ*GZkafJw+KPAFI2jj^1g;eG`4k@a{z4dJ5|ukhMkE%4*DJtSoK z47(8{XBNY7wa{aXgxlqLBRH!cj1%=Wu+j?Zf2cHJDqN3z^qabFd83%}ea#K0W% zM{;HC-LVg<(<(~U4ke6(i=)4Vl60G(>(=Ji(EUR#a&1 z->^>Ms8eWpX?w7rjwvmVSQ;OVJ9sU*@TLx=*=^Y#pb3%vCfgd3rlnQA74Wa20iiZvVtpWPY89|ADIr20pv< z`2K=4!l2S-R!Hob#G}Vg9MgoyCT=;U)NqyAU z`+ygfjEA86!AQCcXt+nQmn&Z@;In~+NVP#+-hJ5u$-uGbv7O9tTf;1*+;^%b7^PYf z%hhjb*jlUJ%U&l+*r*-Gw6=XYf&7evOY#N3Vm`CHq-u4A64ZBYppJxFBz><8oCpX&u86aeq39AMX0UENI+;1r&T@Cd$#hYy=K1<@yZ zUYQKvs@|p*mzJd2ebL9$+E&A{%eLC8xP=F1?X^MVRTSJ2ll2OkJ97s@1NZqUzZyNW z_xv*sDgKCg%jq$p7V0sfxEZP{b|`0u#IoF$n7AEL$_H#!+BzrOxr>KrI7+-b`63Ld z;b5vNLR!yq!O*V~wq4_@98?^o5Zhh_e%Fl9CI0J_2Xj&BlW>Q3$gNrOS_z$=)&uj? z+_Fh0HHZlz)F%`a-B!FAe}#xm=Ph@%SD&|GGBfiMFDUDBmd%;zWJ5mFpi$*p7*uLI z*=&*HBvZTeEMyGg$1H#)((i-mOI zO9tWCX24+yN!Rw(FBvs#b81m?wlezg_N~Y1_b*dvxO$IZVM;wmyb;zDB1%LVS3!*j z`Ok3i%TA3sm57)o2i%!ruw@^57LB)A92D%Oj&os7B%V8wrYtz>vt$>NR&1E-IbE?J z%k7H#WHG-y=vZ1tTEd$nno$xzU;hn$O4-Z1HNR)C$ygPu`K^jf#PK*4jVG}iwaNc{ zb1Q#~7s~?PE5F^NicLAgIjZ#fYhURGYT>z!Hn}7Fy4+{vs0A*4H3(|V1*}==?W%B# z@;|i>F^suig*E(Z6*3Pa?Qm>L{z;@AKB-13-%~2?0zc0F8gz@$ROA+)%0iYdn=zvo zFSI~*bs>T0mPzsY2MOhjUbiANBJ@C?8nMj+AN!>maN2vT{xQOPuJ(!7$aWH+S{Paf zLOl+d-@_V(GmRYHyo`1)d;C*LMQv+|8Bu+&nd58|=tOsvgSZg8~{`u&EO2;0GW z6p90%_Z~ii7?EDrOhH<9CAm0TLu@yj%^IRy;&D6~*^X~#mg41-&K7yG&I;NIjixef zZYw$e)#wFDuT;1#syY={>lG|at>fO)O;N5Xom~ zmJ4f=a_Boey3K+&|CHRx|D<0#xl{bvl2kQ^(C+7uc_1Y@;joT*!0~V9f&YefFTZtD z$2_p!f2HQ-f&2o>JP=Nq2Xp}J1<9$|MQO_>?bmp(@DE>st1+3%uZ=ssK2Q1U%?2HJ zz<)urZ*h1orTsFNef$g;<{#)Kx*c3c8xaR)D7r+Go!Bcou~$-Jouomy+AV>vi3yq^ zPer$V6Kdm)>LNL6Sf-M%(bxbTxaiC7$eb_`|8z&&?x{G4x+A&EK>X7k>0YK`n_)*e z*}=+gO074m55iC>r(4kDe0)}|dZUVx_PMMBXY*A>s5oN4a9UqPH$O(v&9f-FdHBcZ z=EryK{{hj>A0oQ>ETm=Bqnjg@{P$MDrD0nEZZe1w`4Z9Kve=if zKMy+LI=yZ2R&xghIe1GrHbl~&oN)Vclgj-~UpT=GVY!w?{Jb!a#cS5=-5aJ}Gl$uH zB7RG<@_BmIOO22@R>DzZ#-!lrl`Dfoe0^g=PHQ;SYaMO}jECvy{4g8Wq~?aIKmMFv zId+WsoX>mLTeN6O3>GafY`A{5;L@d32eav3ix+8R$Bsv%`9z^I|8#cgJ`LBX!W&hc z6{c?NhM|NS2FPjQfr6?BeiLf0Nbi~TmXjQ{3x2J$3I=FuLt{unjex;d>T0u9lf$Oq z;?tT2_R@f5wo03TbJ<(aIbq(u^ck&6?i&^L!0h~o(KWoBYDQC^ZitwW5|8ZV0Wsb% z9W8rYv@M9(G*5-7=j`{Oiv9H&$PCj+f)zNT9!%stbQ4h;a>#Z)4A2`2uQ&$pgeDuy4?=nhy5343FS(_ywIzIeGRt_3GKNe7g-&ZaV8J zH;3cEP0&tc79o+&ggY<+sW(mLs@mm}$6odJ=kZjfvzBTOyylXx;ew=S4}zToU#o1{ zWn0kWROuK9A<}&uH6z{Rz+Bo6&bX7;v)`ie8Jf$UrXYYHvy*U$F={d&HlwP!9cYl_ zuhlX3Dh}OrFV`qQGBi);ri=bqsXTbSlDsZmVK&uqDSG)1Kn5b%1+0X71okRCB$y%~ ze6K5}k8y}_=#IS!&ETY*l`HZu_@51;dxZC@yv0h#l}oL+YPhLP8B58iIrdi^EV3}@ zffY^K2d30q)JH1MipzMbQg55mY`9pLxog zXI6NiIg0UxpMlW`OGj%LOZs~*o$lZsTk5Okytf4Tpbx+Y@8xu>drE}9i^ZY$iDTfW zPJ@~{1CDPuQNlyW8c~>Yt7X@oU?+39>v?YpTw$lQ3rt48YV;W9jPgE!Fg|+Aq3yymbab&~ zxws@1hgQmq87`V#xzb~qm11Gmb=8Kjt?QHll<%3t+ul2>46Bd&`#mH2-~IhYzuQl% zB^^K7?H?(#&aL)Atbt9cnH;)JTr8uu9_aAhDBYid9VLU6QdyOhtcpq-z8qjKvql?LBvCp4D7sGUtu&8}8`Gzhg zGM+@v2Ly%CffE!f3S8nSIDxAUoPhd7aLGt6tlRH=R``eM_PZ(kn)dyUoAd{axrhHmSKdL^R+KF`~Mi3Y}}aVkzaK(a0mjKOiauPbAP+HIL<%E?YtAg*c;IEr?Xd z%|wKJ4nf$CG;oUgbA>nZ&II|ys|yR5Tu=KHGZc%7^ODcT+#hQ1sen#meaGua5_STx}fT13C1023kQ9Of(if)D?&8gYS+@s)adr>&IU z>BHi}z2^cy7oUN+8}nJO05>Nqg>3oOur;f_d`j$;92iNxIkzAkgOHuSqvaNj%z1_1 zGFJt+UFS{0(cR*)3772;kt&X27p$V#1sUzw1(S8y1snx$?6Y+r!u_MmHsV?J*+7|9Sl2E=BhuT_akXsoxBL=7<+c#krPp8VJWT#WAMt#b20Us|96Mc z)R%lrcn7WoOc4-Ngn*#pG!7i4)$EWz@Pdy!OQA}F5vqhs+8hfbrQ9PGCPW1jH5-ZZ z;e;ubh@!|D0d54DFhR3tv9DEu74r64sKx_`7DL9?s;Bdwf{hcz`JJ|ojV-b=^B zDnq9tCuzG+kvIAj#l*lGX)zd3hn?6KG51jXQkcdUQ}WL}KcheCo}moK=d)+`A3hO% zHp#X`S(KPxfjjyK|5$35foai2mg9xk-7G7eb3Tr9&}f~*RRt9vRWP8IdwCkUcnqjH(A9gn z*Tfu>ADk>g#+c%qU)niiIR4bh6R~lj#{&aH*RBdWx#kqr@W6M7_^0=Zn|c)GKCUFq zwvSFkl`Um%omO!|E_#<%iqCQAPlzm+;Kso$)mtvC22NMPLKMg3Nd4%+QG-#B4Y;;v zfn6|Hwyn&FONz#0Qb@G#O7KwO8RnAWcQ3UW(Wi#V+>VML@*@2#CFx7-MWP#;CFP*kaUJVvRj^ zjWLS7cWhuG?*BV;@1=QBllSu8`~7!6b7ppWIp@ronccIyGbdVV-eNb;U6YD$Cp3X$ zifiynW3E@OE@(hggP_f1|JS=~SZZ`XKW-|1?QLOZBNpKM#q_A@os`WA*aQva>X7soSS9EW5(sX0ER0fr2<)Wj5jTTZhjJ`)TgVSefgcMV>m z2DU83TY#D{%dy2l)n7`g{(Sy$LDhO@C_k&Ui5rvJSCcuW_?&t3H6z3-)&Jz(?Hw{b z3v0jwGHY1s^z%T2l2FAnFg0^js^(yqgPHaRIv&(ywkY1kwA(mM!y?;eZvAeLvj(5k ztdX=f#q>xc6AhjGYAx3+AJ)$~37cE^g|Vja)l7}5E*eQr*f-TIE?!Nuvh5C+9ZRIUlbi70&-yGNA?`QbE6c#jaL8VIh@|Qvfk>)LaK(V)- zMt%&Ms!13>bnpNd&EC)U7S`ZfvP`|)p}`l-ijYgev!Iw|?-J;h%ACp#Vu_G8fl9Bi zne*c-v7myQ#U@g?(iq-Ev#A~A5*;&tRX?m;wtuw+nrAfYH;flzg68eyH$&;2{Tlq$ zO=x+>hQ&(kQXJPHFlM}F>&47jXEZJyQ`T?Lpyv}cm+{?>=GwXw2Y~$`_{{#7?9(*n zJF`4%W$rV3Yo`(FZ`x#<7Jh3kd;@D`g0U6WJfWGD@ghxS$4eR)9E+Pj#y4hBnu?he zE0g_LnP@Uig#jvOI`c@WMbNqbhAgt8v6ZAp9j76>uh2MzlM5u1l)~bd~=Os3o(}YjHP_ON365QSd6nVBgX#k zn_%8VrVm3N#!M&^_+-oo94pAoAsrI*^VdSecHw}Poe zGSs&)=`b(wOm)wsvg8LD#2dCS%?-Rk&mU@03-E$oI$k081q^`+pr#lT1Md+0!-(N# zq`KrQg17ul!|Q%Ht>jf5NGZKt3pR}Ur{rIPhZ!;8r_BX#Gh!^zZw>!310E{)sKH2H zD)?zZ27FfVT7zMpq@3XGVvO{>y%Y;1!K@l_V}39tV48#1x5fChC1v$?N!TthrS#7t zO!x^~8Ut?rBetmD2aLqI3{pEA&vbZL8~y}1s#1#iO|&fvJoqW`gJ}X&62=*(5KJ)` zEsO{&3sZ(Ulk&7538pX6X2fG=#0z#YW=*Qn2gDC{d6*FR6_j6)K1}52#!N}5%ukoU zGoD46#b8&Y_mH0%34+_3ye2hZ0u46bNIFwb(n^|@#2e$NMOah1iZq2?5vDra6=ACD z-PNfr=-QTq(KWEwz%GwA33HW{uD;Bz4I4@7x^z?VR@SJ<72 zC3#9Z!nTq2BJijK$Wxf7;E!5Tmfc0&?~ow69Q`~DbNVpif_Wo^+sOVYK@*5DZD7ji z-9CETA9gT|uuGFiX!|4BKM-FSPko&K{dDbsBdMrwU(k)t9ZG}Y7Jf~MD>+Q;X&XGp zlTfmZ_>h(AZQ2a(wU}E2C0>New5f0-4M~UXLhQ+1Vn>tEKQ)Lsy#sd$?CLOHq=?8@ zZ;Hus1`#jh9ZDO@@fCO-3R4coNpGscE({}V;je+QgsG*s17VA>dN59;wc5^Lcm+~I zSw%{4Yf_z;fpH~Xyd>;$q>SD!0e1=Ri8el!bRuXaSh_RF&$;}Be{NGn|14-x7%vt? ziUM!SK!$A2?0_$k=p%pNSX0o@TF6DOh$CA_+R<-G5#VwF>kZoM4Oyc%DJ^XDdl-xr z{Tcl*5Hd?;;H1t}ge{EWxiH*?xjShf42ywmhHXe@LMnhRnt`60!ItzzW)e5Dh&W*W zSpah!W{NN*i8#_C#Ex7e0Wd^7!+$Ky1emX3ron80Sp)M2%pRCynEa-}41?JPBc4aV z420OmlHsDGlL0uWc!X{229V9t{38mu{(Soc8ok?|3ajt75QkNGKwcjP@^tG?R2Sb1B`@FU2_k6}$|7tO&#W%t$%- zH6)RM-EmXW7dInAaZ@snEC5`Fn}U=53U~uIMN3{2h?>ZZQ3vV(cTrjtZWqkujFzQk z0ez@1{I!s}7;OR>fYLUQ3@Gi6`Y}3`4ug9Jodx(UW;jOY(z$@&(eL210x^8e%!SHaWYZuq1e-Y$R;x~AOJdU}DkYxOB8uocRV9wF zOdv1X5(iQYbEY@(g|u1@E63`HRi88_El69^iF6}9NFT)JHQLwqAoU`exAY)GTQ+a# zfsxkbLy0NTU}h~soQXRrP5kg?a~M{d;iNWcK$?)2*b(bYqDfDTi%8*wdYfSk3n5n* z;z3G~GQ^(*gSS_KOj!qG*_5;*?MW9BL*huhJ`KlQV@dv?d)$R}xEl5iu)^aui|#N!XqgCB-3el>)Xvf&-3L!=6|@(g-W7Hl!no0@m~< ziKJgtRG$>KLc;YDZjo@egomPolcU*53C~M-Rl>UxrbkC5$Ff%vz7vou5?V@V7aiR< zkvmFQQo>*f!zFAS6Q9tRca*T3ggqsUmoTL}eiX+COE^}-$r8?za8aMQ9#MR?gc~H> zBH>O6_w`AL?!%8rcv8Z1@%{TI@iYmqOL$kp#}d9sfW_Yks1ONFCA5;Ta6(c{yi!y` zHwjBh=p&&vQKSl!u!@8=C9Ef5<7D)$(o({%684dBpoC+SI8^?v(I=gvXPUwL!``3DYFJF5z7X9|Hy}FC=^;pb3%CR6;Aj5R<|Z7M0LV z!jcmD0EU`qB@C0Wii9;KtOr=mq_Ko8C2TKYR|&f(_wSZ$(nrE12?t6zT*9%*{S%W- zCQ3L{!bK9Um2lf&{BhpofP_aSJT2jQ2`__g8I0hAAGa+);UeCLZ3+$`ax@N2Ku0E^ zam@0F^>?2rs8^I>9CGjj8}K4*aDSqUf@g{R3WB=6$qmJ{ zu!syb4i#`k7x1j&i1Sz76ueo~$~a^gTMfcLXj_OcO`OfMBozCA&gSV7-WO1Yy2wx$ za}nwyLtV^8sEdUMpsR(mgqS1Ywvo_WLN~zT7DXj2ETNTzrUIJx0dz7K^Rbh8R|(ro z*iyg`v`W`n1@lQEaC>{%Yk$p6!S6+{8H1jf+afU|b;R5fPX>~aWCEE=W7IooAxnJ+N`V`3 z8|z)Iv7ahtU5fnyoqbb=P_{~!mTlD8N>jbvOJ|#kenvV|FTGtwrsJlSOe0M@>-|Iz zi#YT2_FTQaS#Lvfkm2X__St;T=k?DQ^mdxwex|d{y!Cb^UER%^>TH{dI)9rPgxWmh zp#p+GI0DnXFrNoto~=Z}(I=+tm4sP9J*3-5x_#i5eQL7}xgC)C^8$RB z%}^Oj*K_XrSgVn4flTKiU4oZ{L5eYfT^RV_MoRLMgh6KV0?fev2xD(}HNbb=n=r1R zZI-}1w1WG|c#tm<4-z2a1>}q2A!E487|wuM+zl}-QL+|!cte`11Z-=J^1DHTN(HV> zCvzc*t|!~bKGafyq{FzQbU~ujyCA!=H_~rtw%@XB*O6@3YlBN*o+y1%Kc2*sc?$2(Q~3ZskPqU6 z`4B#o597o62tJaJ;-mQ(K9-N;U8C_;$$DJNYiYhwtUT@O^wgKfn+2L;Ns50$s01`7wT+pWr9?DSn!t;b-}8{2c$C zpXYz@3;ZHaS3DF?#Y-unlvGM7-b!hu44=q%@O%6VzMC)O_X)GAL~N9@ijU%} z_$mHMfD))^l^`Wp2~k3oa!MFt1dx;eXGhU6hB>3S599dn8^uQ$$N%~$@-2i}ULZEC zJ?p?avQDfs>%zLSDAtWdv+k@1i(#>du>~VXE+1yO(-J(@a#gk;v)q84*50fS>&xO<0!zgAsYxuErLg`i zl?`A6*&sHU4PissFgBcxU?bTmHkyrLW7#-19y>kMa)Q7%%fhIomIbk37Q#YVITpss zvkI&ttHP?XO4!|HmY5}#=1L2trP7Kpi|dGAja6sitOl#eB3La}o7G`;Sp(LP)x*va zwX6ePO)Z-W=}7QExEOE6!P5}JcuU?Ip|wO17W&L`AXdYN=wW(<{z{M1WAr#ZK~J)Y z2xSOO#0k$zx{7{JSJO3gEnP>~(;w&t`Xk+lRs3f96WxL@bhpv%^k=#QKcU&h;@AYF z<+5B0x|{Byd+9G& zDv^NkN+ZAor7>Wl(gd&{)*Xx|Db2**BkPTwOVp3`0qnpajq;8x9~x}zYye<)HW07}8wA*s4F-&3LjZd*A#L`? z88qt1h6DCxBLL&sNWcU(3NVq42JFYi04A}qfE%zM&G?UWKHx^W0B{ps2)LOp0{jVY zfH1y=E&<$1mjZ61%K*3I#GCP-!FL%?#)%>0DfD~5{&Y29D$d>+A3)av4#b``$R7qk#MAF~9@#IN(8g0uWR|m{JBau$kfm2_h1+Z#8;}-odjk zuSi*zY$}{6G_pK_%hz3ikcY6o1GXO)yW_pjYXAJO@DXXo^|8CcTFDDa@2W z$RW)zhey!s^dX+LtSh9BFjkA+ppWnz1R13T=J(p5$;WsO2F0}m4c4Kz@Sc&G5(4?9 z73TiB^ft~0705DeAqO;os|RG3stni)DYXS)Ii)3F7$gD((oSng3iaTMWo=kxAp_tP zSInSd?c;+sW9_4~CH_2&`WTgnAPq^W=s5wBe5eIR+!mi^~|tu z=Zez-LT;j`ov|C@Poiibtwy53t9y}T+K0{{^XND98*-3W#+zb?cnw|ywTs{ps9kMd z8?~#;>yqQ(7i|eJ6y=-|<@F~@W+PcU)apAn zA3KG*7(Ea}xFT_4hKzs#VZ1zixUR0)y)i*uMV(wlJQ&e~0$YTx711)}tFOf!V4|gn zh3DJ4+~B%|*u|OuztWo+#nLD=kcOeAsVo(Hu{gIuja*U6O>qu|*{CN@_Il%;h@uGN z7<(_ID1tRSg|yvI%7|i@PweF;$#X4%hn|QV2z=-V-(kRtD&!61(Z#?(2eJlxRz7%} zLyXg}v^>V?m>j3y#5f`GY20PO4bpMS^(XFXXrn)^E^0!0{ui_s zFe-!A23EbIb%0rKXkB1e7OltLv3In-*s7rofN6|21hy$O5*TMn8v*OgX=7lXC2a!i zv!YFbfey48u+Wh<2PQhx7QjYV+7cM)Mq6U zAKfJu^pLpNPhx(u#E%q-m#OG&e_%#gqbo72!sKe~?@?SRXbx)>jO{?2tL8qd^8l9M z!bz5}b!T;kbGVZ794=U%!-ebP7|!8zDGX<9x+lZwneNGOF6PiXHYuJAmT;tm<0YIV z;q<;yNxjJ|371K@QNq0vp6uJZZ*Ov0!kZG_moQzzjO4h%u_Q}CN+eVyG?!4f6EF5j zMV*a76X`2xLDzN>=dV9e^qNR%40c9HdzjWR&0!kDn1K@)1@A3`y}Jt7y%c3r?BPip z(v!|!rL)c4^mbQbiUFkNf_s1;SyWu=3u3RrXG-p=V%~u9NA{LBhC8 zA7jPx2CUkYS%E5xGB;KdWdtxE$TU7Ij3z>QsEL)qGVBc0qiL)$Rs(6QCEyHDY*$cc zAM9Bq!8H(OINgHXiHU3~o5|*~MQjCI%QmuYY&Sc=jlm0<1yWXr%EY$SA-u)c($5*C-xO~NP%YYRxmNOwmG%S)ee z(%oCax)Mf87${+B2^}TWNLW)sD&gk>lE>0rR6=W6x8V#s`&eC}p7e9+HkbYv#XAUC zdx`oF5&nRi0f$LASjJo|QJ*E4KgwG|sCH?J0 ztsq6B6xu|(9b`QlN*EzwR{_aT8Gnm})-*%ZO1hl|B+sPVO}f9AsjTo;ET!(!-O?Ye`;#-m8e7QSYN?Y$Obju#JR468Z>8 zK9lZ_64sVJVFkSjMOXw=0 zzl5d&k~gX|YU?K5LnN%M7K4wibPpDgu9VPG`t(=5;j>CWaz*-_m7!kJ{Xn{VO7|gE zoXFmkJ`E*|me57Q!fFYGu95C7GPnEE?JZ$32{jUy6_A{gZeIx%2_qydEn#s9xr8MJ zB-f<7wRAs{@PvRByH(WTo;VdI*q=3p$-!^`arvu3m5?jwEXKnADS8+{IV zf)zqe0TsiLhk;f?ky|M8(n9L3g7<#vVb*SmS-dOW;AxLDwj`YB4ku#~HW8<~GiB+5 zf&}JMI#xi$67EO|Yf3mz!f^uPBv^!oOSoG4q)RwM`e0WVp+h9BCm|$z_>`1T(qLFd zh4r$=a<&Iu5l|NSkJzHD|3rDZGPoR5;59lxaAm@lNth<#PlT3VFXf{!l8UqSz2p`4 z_q4PDctAI3yBtqvVORVRy^UGj4fNfMjl?e83hch6;iR=F)^Sa7E;tJ(cpGs}cNC{= z={WD|qfAszD(94|%5CMLl40U%QpqIJq`65?lT?!hCYw!80#n3WU&T~><)A(!A$WJ+ z3-2P9ASE$IC21+F(-Q3Vw#~GJH`MzOPbWqb?$y2ziPSZyCZ7_c@;I@nnj1a0zt_^F^H%_#a@N zvXs3#A6?lvbN5tlGavO5R=Stf40=UGA)rZJKgk~W070P&s&}TB;Eq%x{ zeY(3MM5YtDK0)X+qy2o)`VhI$y%>(X9F=;Q2AL++v$ zBJE{_ihfB)f99mk9hxP+070(L&==29_6wMo>H(yOzJJvC75rbTkdkE$Z)fL|g_s$L zC1Tt~Xcl@)mxt&DL&$Z|tdn{b@`#gq062*E-r>3p*KJ_(LtyL;)Uza7RtD!}Wl1sY z;1rW_ewB3A53RPsC>X|D;K^&z=NOF#C@&3leuDBIpe7GclLM&96VT;3^$k4_qr=5? zjP^^6<4cV8kI3OAM*ALed5F<|j+`>k1CNp0b+q^{a=D2XKNBrRy{=&V1bzZ9bM?Gv z^<%tad>OU7g6|ft!dyds*J0m4%$rDg3z+g0?q|sVId+R)5F30)<^ZYF2IXYoJ!wl> z1_k|EV}~hGeW`@1n4tjgN%#`Gj=t&}B?!J2iVs}A>TAVM%~1Sd2dEDet@;F^FO^_5 zQwc%Ku>%Vqe>DrCH|-I24XzNDX1^viBK(!;3gD47&*X~$Ttfq3}Md+hp#C6 z4RU@%EK&Y5>Ej0 ziue34R>5e|sMl#VL%oc#`k%Rg@Bbs$f3{cD-J;pxzeX?hF769PgZ}NF>Pq!I?&Zk1 z^81;qdm&d4^{jdct_Saj|EGM^ZU3o~K32~EP)&|~tgin=IA&n+=6JqKJ+JeC%t_R1 z>UzYnfGqKkT)LR4NtFBj%>impC z2dr{zkgpwPItTT(dQ?52E5&GRk+WzmY9PYFSz)Vx!f6M|U0x_TOXoreIGwE3b=c^c z5B82JYG5a3_+06q5mQ5p40(Romi5U({j%#&VEm8H-6D@q$Oi?ek43B1*RqYWPx6+E zQOFQqn~F>J2V^nnK1yuR{~x*Z^$_0<;6e+{0L2RAlP=WjrA+q;GazKM0xq=g6;?yK z%c6itdAwy`ygv%oI+@9Mzp6K77UuFhi9EUGdJu2SYtVXO=ZvA)F)ZMM41oUD;Ue4* zAu&56s)bnHiSdv)b6+IZwNUh}to>3dy-zIWM*)iAV=pg%D77=7TuLr_t=igl(g z_D4rafff_pWrV}zEzx+Ni8!L(VlJ0hIq}%MUY~HVHlc}z+4C(UOw!jcO zq}O0gq34o_!F9287^1_xeChtqqp3JU|0vddAm_YTrt1wsKiNqXw80v^BFX{n$bLa6 z+>do}^gbV;NW>HUV2XNLBX&-oU?x&8h*1+4+#lp|pfm6*l=~^1?E`U)rpJgEbm{xV zzzs!Bv91KJiajpzl&jVTx9A)7mB6D9T&@T+aJ3xH_E8$hog-#_iK9l_lslqu=k$C2 z5Q**Yd4ALbBlZ*8d0EBD4LHnW^%3q1>P*NXe}Mk)sz1SRr_{^vSQXrrsJk)$dBGO4 zxRFcUr|uW40_5{heWZ(^UQzcTzx7g=#A$?YGEk$D4B(|s(Wkqit~4Ga$5&UYoaY=D zW(9E`mG1&?`^crE5M3nXAl`Aohyr&X>u5?xZ=x;vFZEh}AN{i_Mo!2@!erx#kUtFZ z^U|=v7p3OH%p6~XD>vsu+&A)VC}&f(C1FEegIYeuAWlQpug`JOE3I{P8VrERM+WT1;c{p zclC)e%ro$L<2eexj@kla(SC^!GMO>qF-}xxWMATw+aeF&2Njayx1bwQUxT@ue`AS(p|ZF#o+axt(WKC z^MBvNkeg24dp|t4kA9B9ss_G-8yUSsXx{x3jOGW%#*j%qToJjO=jBa?mC`T-|qxre}^C5VDka=2%qq*LmN_xDa92jCKG9W^y~hQR9A!0YRv&@|iz zt_3WC{}%PQF0Q&jT`l&f3ce(sWPoRg988FbAtyr${piWLK)5B1;gn0z1|-yvT-kV{ zn{7-)?Q&s2-cbN|0*49!9qU?ynci?2+Jp3>4u;lZmxEM;kI;8wY`(HFq=y{_BX*pf z@jjcE;Bw&g`WY_A1zjDu^t2{IOCby`HFk-%8FGM2%tx=VLKm0TSp58cI%yz(?%6rY zoW#ls`Mw1Il5N)2OrKMB>qMANo)$b%j?itf!pvV{LC-loAiaQRQj$-u2Y-Y40(^$Bekdd*Oi(-Mk(B*~+7 z)iLCQa6Ojk{P8Sl)bLcWEoTlvWmr>VRCV+w_?x`)&IAVEY&$PyWqapy2>$Av&+kKz z3N$QW{{r>NMHAU>{R}BHurMnBuF>yA67@H<$cTh&ym0kbRlH@Qzy2y#$~B)gvCo}O zJt%uu(9Io~3`4z8gf%d$nkdSEGx}mbWO?cK9w3iNnln(VA&DMiv*}T{$7TpMZh!i` zW5BdLxeDpl$fd(YV5;OM`6A@-lgFY@bfG#tL%Vd`I6F?hw0R!$(7|oPN?#vEpM$=q z^sDzg$qRhY^<#m-xdQUjT&|!GISa`Zmwt~tZ$$J*5$R(CO&sD9Gev#r`ZQpHwUM7( zbr_2uEIjpif*n{x@8?8?^sT2k5rz@e_nb~Xz?(bhSG_wYQ687%Ao+MvPK3O3xqfuO z1C7)qTb>ZHP?PgHxxnQw=hgzt5piWra&eG6>Gi!}@YCTEN|Ea%LmwDI4YrWy4K>x- z=!;@G>s>><58Jxj3z}KfJ@2J9gXASv7k~cMl5*!H_>&w{L2)^B`$?2$$Ok!Kck5rj zjLs@KbuwN6<{E*yx|Nq$bBYW6eGB$wAIi0tkd2-R`4w&b#CbapH`8T_HK@$_p^$Av z&U)_xEbJ1A)duzq)y)M&`6Tb$^M)aTZvAL@`nWAtY6ao$$5R_(h}}k^z3A^;|71<zN*V5v#FB^V3t-G6qq2j(ss`B!b=X%>?LY31+8dD`KGY`$E-vzxJ@6VQ?qUZ@ zclyR9rx$0x>5wUKwhmiz{g2i~o~q=;f_y4y8S@VIo4);yh+6q z>TRsXACuX188v-Bzq~#lqyN0I|LT)mduItP?gd@{O8Ii1<+dSbiLd&RG58s`C7v8A zAk44^GlGZ4Q{?sqcI{A4=Jt8tEoMN>FlXKm`FHpTi6rk_Q*aNi^UD>MGEcg)umqcaOkJ-#h-74{`Cl{f4z>>yj~aIh|ePR zrMC6PQrmhHscpTP)V7Yl;X(UQOQ~nQmDID|T545qBekmclUmi2q*nE0sZ~8iYE|zq zwW_D$TNvoQ%PzyUmcp{c9U>f z{~D-sPf`mc{h2fmH5LUOvu+tX;ts)!Abs7sDA(x>Q z=qfb-T!(g_o6z8M+nB~MM)5(sBXeh->`OM8O~H5bouLIZ9y+Fs>Yzjo{bAhDa~`Aw zaKsz8Cr+vovG1Bhek8rgCQ6{kM4|5Fwdh6Y?C{4|!;V5DKeY9ir_*UM(U-J8`tn+<40@=t^h~aKv~2#aJ==3v*#EbRR3uiqrk5u{*_A zbj%Z4`!2I9^bjV5YnTnbRoughKojL5Rt&mBuQGRF)+-hWJz%yh9GX16S!<;Xv@-R8UQS=u6B;># zSe($w$$FtTcEbp*B|?>oc&kpq`;|DM#25?ds|v=)4EpZPaTfw^T99yzu_bioYj8&( zozQYCc02ISGE#Nsd)y+pUE$}5QEZ-x_j<~gm>jr%`9=LrlUY_`CfY4UshcPUH{a!JO{usrwaQnzV3iu%`41WH= zDV%kJE&_3vLr&r=-XPp<@XfpU>OBN^TZ9V@{pE01LU=>8DH3-T)TkNS)Es{XaD>i| z?(pe>{|OX=7Ux8?RA_jq0WCPg&=13L7bYWcJCKpMYm-rAJlvm=$%r`xT*r~j$6W=q zx)kjee}`}+%gJiAeho0snQS6k(dKR7Np7IzlhDU>3g5|lkl#oe+IopxMW0;5?MSZU zt}iLwQR2khl0}UTLAE2Y}Hg!A!*o=R4i2q9j0Gq4B zKb$rJoi?RS5x*I2jlXY*KTc@z&1@%pbqY;*Boq`Gi$5N9r@cuzd^J53yk!_24c;<_ zjt6h~j7|n`nL?+7w+KF?1#Qek9H9eAi*Ii6XGr*Luh6y3++Jf@V%=_Rs4wq=!tK(apOBwT;Q=#gh9-h!c0gj=;tuS-`~ve zf3()nz-JD(1+#$Lidm87_|n^&w18ed8@O%pU!WGyvr~jL1=j$63(6!-1Z4t(G66xE z&_8vVT}D1v@K2Z4pv(%ynpfl%Ne$@Ut3({3X{s`~A7~XYoQES+Xr0nZomhpX?kRt% z8LNuaK;wDaR9ZpRq$Q}j9jOdm#_fp>ID7|U2c51Ry zQj16PXkrg7e=+!$w+HWmI6c9i>p|0T9NfKlFMJo-oA<{5)cWu~q&WC%U;M8sp2w3& zXh2RNp3s7vNE$;EazFfkD~TtOQqb`^0i{pmU!e3!d@4$x#%CZma1)fflkY^iyZCOD zyNB;Vx!^2-;4Fx97kYl{K;v*a%6-aTq1-q89m-V|Thai$rWo;r&R|dc56nv`MTDMU zZ&F8aA3$&)d;tjVgD(a{ln{J#7^;MV>o77KM$Bk}`#4Bm;~@D=U93|H<1s#<{T+|MnO>m8BpdBB? z@x@&YoWl=p!8@u+-T@lH?JRkRi{u>@B=0bnyrYuj9Tt*zgiGF0NOBDa@QhXkhB_3zouU!2SKY& zl1iOGrE~GeGC`k0J~#;fQ}{oRBWB~v`17Bj(z4Ly`3!%v6SP_edOY9Y3wJ@Wc9LQv zB*ofEiuIKg>nAC;oTONPNwHy)V#`a4wUiWFUQ(>3q}VEwVrxi>ts*J5hNRfal49MU zUDKJ=Vy?^;(2cnP3X1g-b1A-!FM+>Px%)y|NR1eFFr2YFYx1+8j8tKH!i zR2m?uw5Fue07<1aC6xwBDz%bSs+Ck4EUDC5Qfa89QX5I7wvtLK3LU1%Q&4FDsPrqi zzvjyT1+4}^Q^9(;1;ye=;QS!mhxtjsQ=rlSNu@O7^6QYeWwe&T`ls39NqsoF7+Gbk6Tt2Rg+(x=$Vik82sJ&0duXy_4mpmyj)x@p! z%$1qqu(FMV*YT_KIu`n7*l@2pC2IAsNwQin+Qn8onxRH?DYHx5cC)zMA7w)~S2!|+ zAKkV~Yn@$7iaAHyMOKfuQcUexs}?~{+9IZSu(Y>n9h(%_BCbcgpGW=p=zyT|+HxX5 zV;>OFCn`DFBgCU=|89NaqCJ`>#X+ChAdiUHq?EYsanVsJaS8DrHTtLYOh}4L8KiY{ zvaT4W4GONPl~;Qw>);C73h)RiSFv2h_WyhZM$OONW@t3zqrN2CQJ=F>qsZZo?dCmm znMfTr+Fen?FWzXgu2=2wDPyfPr$YYtqtJ=RtgU;gOrI6COjbSQ?gK~6`)ccKvZ}9{*pcMhBVu4L_ywA3PxY!~&5iHr>x)wA|;#(_?`tA`=ssMq$$!oDZ`yh#%W`%BB- zW?2>*JL!2D*B;XYhi=~g=1ThAuYWE+rH|i=W=E6HFWKE9z41Bk-Kn(AsOgrsD?Xftg8?{{L7OPe9^NwkAiEZmI*|(1tO|2bybGzM=s_DVp=IQZQcMmt4bi3R9 z+w*r1`zdMe;jl`*=Qm!V##qN_NAt%pZ5BWoA!ByKzk2X?=z+%V?l+u0;H+s@<=izk z0TPY+A{Q35uMt#4YcG(++}^59Y;p>8w0CGRsBct!N^G=8L_$(xLXyN}WD=k&u5@;=DA1#Y zp~M!kNvUzsvB@af!{4KBFzC)JcLxcK8%=Eq{4LpNO34qaf2`lK;Ww^@Ezg%4G|j7x zPeR%j?|l);z4z`4Xxjd*!`{@%5wujq#)a2wzqtF;kY7@cdi}m}24R_v9_`xrQ>~J{ zk9DbC`Bbgr5rvbTMt>2v(f8MH-Bu^LcsJ_j{zK5Ex6PnCcG;?z_5Dl+)?OO;`SCm7 z-g!6adYkH14@^&M@M=iN%|VuL)B8`TF<0Hsn|-_L_dfH#iu)|K?3i(TyE^PUbhxs^ zh25jl-K|qDPxt!%Naov=p`~wUHgFlS{FizDYbV}cc6(K6$6-;Kv-%bK`FhiZ4R3XN zbIWGA-~3gv9%s(aynATq(#G{_sl~3>GMldXz314Goq7$7seP<#o#8F_*bm)5=;`4- z{Up*a9`!~$DpL++aT~C4hc2^U#&#;NYYGdpwzfKku(-QYK^vwG zT@buLJ3c_4I6A3MuC#$VjLMBr5j6r3N8)qwQi_$<(oh3#uC)=l+KQ4C(21$GjCd}j zcxv630I7nCX`OVKV<$3{_~IX|4XxlGlp8%jKZ4@9#hfXFo{VUxUG=2rrZ+b%if?Z+ z+O$*oF3XzFcl`3c>vW4+@h|&6XggGU_jTNtC6YCT6Y8#9Td~k9pC9I|cm8GagLX5? zn&VcDHk=GvX5P_faMty~#oI)#h%I_=P_b>g?rh4%K^*{4* zH0`{sLNBkvi<=c2Gkmjlv@#VG|5{J+E*6yscAa^l{PrcyX4E+}b6~z2|MOfMM63-9 z3c^g0J#7TxvAltZM;*ya#RX1WdUm0)cQnjs9xaplC#QHcj!hYmkkmV1JNFrTv5YN7}U< z=Y7j}ip%^5FBeYR8&dy#M0Bs_4Np(Go7k+;sn6qv98ApkF|BaQ#UY&e)Ki={<_xdSR+OnY#5Rxp}G5reZ4F_M*z;t6w}Q|HZ=>zps9lkzRG(rT)`G ziWPSa|23s#G0(65aCo=cr}@DtzbW-^ei>bNLY25NzrL%x!*_U-{a>%O`R?qgh}}Js zZ#b9_zg2yH@|FDuel~OB;}&;I7142w(X<14s*ToGkeMWK6DI|xl56H}M?MM{JZbTHG7$mo2>R&04g2_V7fvA17C?ePjIBK^OW)z71_Ua^|s;&%&=L)vw1M z5A}*Fa=&|G%;~4`&yN&s*Q-XI;iE4XTb~%zI?meacJc4}wM{#Ex!cQYgYDS)!D*G> zwApd^-jq6?73VjLjhtL*XPFv_#le#ngC~8V=SemvUQ{^rZdbW@<$SMMF3wH!)mZya z&+9t5LK~EeB|)wTu4rIM-STpzkH{4Q(WDsT`!TsfNa3+bf>VTklv6B<)>N#uWqXO` zwd!xTQ5U91S+@9U{j7^?{A?TSk5|W6Y0=8I$Z@5*@1HAY&irF%)F4fV!;#}tZ(WUO z==JsEy}l89=AZAmadLQ*$Kxt&EwsPHvzWH&MS>F=w^_J$!V>nokK3_^*Dgi>=Ja`R zhxMJmZNK8XGEHrq9?!fORk?Pv;wK8X)=aOP_5Iq6?p5oqPE5Kp{Z5x-c3bz2iJ4Js zN2!t5?wZ}J5?QY0qmW#LJUg)R#%VqzGJQ%nZTW$V$CfrrD7xWtsk8-WXYf_y8<(0tJDj^- zI(}o&ubw?kFKiCp*mu_pKkw*}oAqP*THpSqhfSu*l5%~9e(reS-i9k1?p^XY(9ibR z*C}b6J6_&V-aTUA?SY$)l~FtvuX@^W--NQ$Y(}0cly#|NYJ8K2h__yUzrySv zDqXPXXP4zVXyeEstK(k$Id`*_qwmuZ9W1KO>2Tfgi2bO(B%p%zin3Guu5EbHekEO3 zWUgOeeV2<~+kbgCa7MFV#{V#SLZ|eq8=Ea06yh5&WNVs-g?+yVy^3`>ad)Y zt8YCq;_$9&UOl5*%-#`~vU-2f=$rR<`uz@6jkOIw>JJp?iu)3xEMp zNwFTSQIQzk{zPi9pSSBZ!2=M+oWE} zmzsXRqV>E6os)LiAG^2v%=9^vw)VE%TDr-WW^+0_#uY#FxW{j0GH+TR`$GeJ zzf8R!9C0P7`s}2*FG7eiT@=@O>9i$TgY*3KLghW$B)%Uf16u{DN8o zexIAsp7?g<{UP2j8XlfJ<@arGb?FvV>*Aa>6+?E7o1yk0ueZ&Z zv0zSzJ5AjEdAqAO7F~)y_wy~^6gtFz2}udN*m?T5b6yQ`+Pdpfg~;1}W8XCPxnTG0 zZ!f<5dQ`}x7~47ZYI%irF^leZvFFiK&D084F5I>GanJoy>&$<&`tFGKt0Pv!FI66S zzQiKS-yBP&SzWkzDVT4X4$GzY6Prwr-2FeEzO?`M|WJ z!!qLBuFNQYcz^2B>zSdxsb^jURCBm~zgLZCS00V92~2yuHp8TkWqA10CY}?=j9IdI zvRRKJ$!ATwrtP~>?2CqF%5C0rO*`7u5;#c4PZpVt7Pr4E}V|n?-bBBz)`t7yH+_3Ab{@;A>5E`L0|F}CtVpC;ovOr=c@FHf}_QJN3kxpw%l zJ(pga{OnS1Zrq*SOR7|tcu+d1nFakp0IO!gA8_*ZOM9E-1aA)Of@4 z`Ms$|Yz+AKC?_YHzqfoAo6?wA9JLOHX@RqB7cW>sH%MQNnl`NOAM9TtmxOL~UdTOh z7~O0zBB8hTx*fV?U(~Plw$e4NSH#%WIW?l6^U#Nh zD}P9Da?{qT#hW6X-=)l|Uvk_iZ`WxKb=OBmPujjP^z4D!cdf^HC-ajlC&lzl>o@&& zZIiA=+BK_~)z+c+yR%Ck4eD)fRU_$6c`s9ooh9y7uQl84UetF-f0)`atLo`5SJ$i> z8+LYM)$lS?=GdJm;eE8B$FEb}J57oVJyPZTt@7s*mU`?6ec=7aTI)OeXJ;k3;p z{j88n)t1d?PV}2wb-J_pY?FY4UoEXS?M%>UWe#S8Zy2T8QHQnvHzjap_uk4P=Uj2Y zs98Wf3;oez85(59u{y&6rM6i1d7lLjvdSevC|cKCPnsYbESGcSiz3)-&v~*EXEzJ& zM%swouP7m>i`A}&wnR?mN)R^j4<5ndIcaM1(Yqd5U+ryQ$gbDhA-U&ToP{W(DT%NB zeCUol+JQ|goin$#pKf9LWcrTveS8-+Jvw|K=TpjT_-2JuSoHHZqkfz`&i3B2xvz>paI>>1bY*&+|LD_) zV^4lLWo?fo)hAha-(Q=Q)abyC@vUb)|2ClL>u(m%>*pTYrF8cuKBieel)bXw$)Q#0 z2PY~$iuopTSM?T?+Ftv8^0m93{jPoW)7@$(Q|?WO-xYcwImLBnLfnNS=@}ir{>Cdd zufOK*jv?!2R4bp6+S6&vr0)WE#O!?0Zk?t3@0DZwoY0J$a_E<) zE2jFEu`n-Rp<|KNgHlg_-f-b)roj=dSx)bn292h#z_?!s6ixc4x3ZYsdwXfQP^pu) zXimj=kS6=Vi~?m0XWSMhLADSyLbRd5I9bE_T2TA<(Bb=P4{AT^QPQEi#j9gw$Js9* zSGb9v5p;-d|H>(RPwHi-u6{i)9oUd^uGD8c_I%$WdeE8n{;c7XMi(0VdCPj@@V*D8 z&9}4je7>UB{OR30PAs~xWa;4-AO3#Kv2yuFF(GMpYJD@MeU*l4_5Nc=zpJ{cZ`P^u zn|t4LuDi#np{Mtko0@K5^>**wG<55gnpvr~YZqjcx|OPJvNNvO{%*r2PNgF){hF+7 z_=1pr#L}oudt1!We%Yhw zgc`4>y`Hgc@v}*lHXS$HRJwdhoBBi6t==(nW!bMCj`qF(Mda3S_m*wkTg3G0wQcG* fkFJgTBIZ}p>9R8Rm)TQ!nRln!+CE&De&zoG=!%UI literal 0 HcmV?d00001 diff --git a/Chocolatey.Gui/Utilities/Converters/BooleanToVisibility.cs b/Chocolatey.Gui/Utilities/Converters/BooleanToVisibility.cs new file mode 100644 index 000000000..65be7a9b7 --- /dev/null +++ b/Chocolatey.Gui/Utilities/Converters/BooleanToVisibility.cs @@ -0,0 +1,20 @@ +using System; +using System.Windows; +using System.Windows.Data; + +namespace Chocolatey.Gui.Utilities.Converters +{ + public class BooleanToVisibility : DependencyObject, IValueConverter + { + + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + return ((value == null || (bool)value == false) ^ (parameter != null && bool.Parse((string)parameter))) ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Chocolatey.Gui/Utilities/Converters/LongSizeToFileSizeString.cs b/Chocolatey.Gui/Utilities/Converters/LongSizeToFileSizeString.cs new file mode 100644 index 000000000..678ec0170 --- /dev/null +++ b/Chocolatey.Gui/Utilities/Converters/LongSizeToFileSizeString.cs @@ -0,0 +1,33 @@ +using System; +using System.Text; +using System.Windows.Data; + +namespace Chocolatey.Gui.Utilities.Converters +{ + public sealed class LongSizeToFileSizeString : IValueConverter + { + + /// + /// Converts a numeric value into a string that represents the number expressed as a size value in bytes, kilobytes, megabytes, or gigabytes, depending on the size. + /// + /// The numeric value to be converted. + /// the converted string + public static string StrFormatByteSize (long filesize) { + var sb = new StringBuilder(16); + NativeMethods.StrFormatByteSize(filesize, sb, sb.Capacity); + return sb.ToString(); + } + + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (!(value is long)) + return ""; + return StrFormatByteSize((long)value); + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Chocolatey.Gui/Utilities/Converters/NullToVisibility.cs b/Chocolatey.Gui/Utilities/Converters/NullToVisibility.cs new file mode 100644 index 000000000..c87dc1132 --- /dev/null +++ b/Chocolatey.Gui/Utilities/Converters/NullToVisibility.cs @@ -0,0 +1,22 @@ +using System; +using System.Windows; +using System.Windows.Data; + +namespace Chocolatey.Gui.Utilities.Converters +{ + public class NullToVisibility : IValueConverter + { + + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (value is string) + return string.IsNullOrWhiteSpace((string)value) ? Visibility.Collapsed : Visibility.Visible; + return value == null ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Chocolatey.Gui/Utilities/Converters/PackageDependenciesToString.cs b/Chocolatey.Gui/Utilities/Converters/PackageDependenciesToString.cs new file mode 100644 index 000000000..610a275be --- /dev/null +++ b/Chocolatey.Gui/Utilities/Converters/PackageDependenciesToString.cs @@ -0,0 +1,46 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Data; + +namespace Chocolatey.Gui.Utilities.Converters +{ + public class PackageDependenciesToString : IValueConverter + { + private static readonly Regex PackageNameVersionRegex = new Regex(@"(?[\w\.]*):{1,2}(?[\w\.]*)"); + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (string.IsNullOrWhiteSpace(value as string)) + return ""; + + var dependenciesString = (string)value; + var dependencyStrings = dependenciesString.Split(new[] { '|' }); + var items = dependencyStrings.Select((dependency) => + { + var result = ""; + + var match = PackageNameVersionRegex.Match(dependency); + var id = match.Groups["Id"]; + if (id == null || string.IsNullOrWhiteSpace(id.Value)) + return result; + + result += id.Value; + + var version = match.Groups["Version"]; + if (version != null && !string.IsNullOrWhiteSpace(version.Value)) + { + result += " (" + version + ")"; + } + return result; + + }).Where(dependecy => dependecy != ""); + + return string.Join(", ", items); + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Chocolatey.Gui/Utilities/Converters/UriToVisibility.cs b/Chocolatey.Gui/Utilities/Converters/UriToVisibility.cs new file mode 100644 index 000000000..1e7035fc1 --- /dev/null +++ b/Chocolatey.Gui/Utilities/Converters/UriToVisibility.cs @@ -0,0 +1,23 @@ +using System; +using System.Windows; +using System.Windows.Data; + +namespace Chocolatey.Gui.Utilities.Converters +{ + public class UriToVisibility : IValueConverter + { + + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (value == null || (value is string && string.IsNullOrWhiteSpace((string)value))) + return Visibility.Collapsed; + + return Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Chocolatey.Gui/Utilities/NativeMethods.cs b/Chocolatey.Gui/Utilities/NativeMethods.cs new file mode 100644 index 000000000..400c36f73 --- /dev/null +++ b/Chocolatey.Gui/Utilities/NativeMethods.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; +using System.Text; + +namespace Chocolatey.Gui.Utilities +{ + internal class NativeMethods + { + [DllImport("Shlwapi.dll", CharSet = CharSet.Auto)] + internal static extern long StrFormatByteSize(long fileSize, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder buffer, int bufferSize); + } +} diff --git a/Chocolatey.Gui/ViewModels/Items/IPackageViewModel.cs b/Chocolatey.Gui/ViewModels/Items/IPackageViewModel.cs new file mode 100644 index 000000000..3d72158a4 --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Items/IPackageViewModel.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Chocolatey.Gui.ViewModels.Items +{ + public interface IPackageViewModel + { + } +} diff --git a/Chocolatey.Gui/ViewModels/Items/PackageViewModel.cs b/Chocolatey.Gui/ViewModels/Items/PackageViewModel.cs new file mode 100644 index 000000000..3f7fbf162 --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Items/PackageViewModel.cs @@ -0,0 +1,229 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Chocolatey.Gui.Base; +using Chocolatey.Gui.Models; + +namespace Chocolatey.Gui.ViewModels.Items +{ + public class PackageViewModel : ObservableBase, IPackageViewModel + { + #region Properties + private string _authors; + public string Authors + { + get { return _authors; } + set { SetPropertyValue(ref _authors, value); } + } + + public bool CanUpdate + { + get { return IsInstalled && !IsLatestVersion; } + } + + private string _copyright; + public string Copyright + { + get { return _copyright; } + set { SetPropertyValue(ref _copyright, value); } + } + + private DateTime _created; + public DateTime Created + { + get { return _created; } + set { SetPropertyValue(ref _created, value); } + } + + private string _dependencies; + public string Dependencies + { + get { return _dependencies; } + set { SetPropertyValue(ref _dependencies, value); } + } + + private string _description; + public string Description + { + get { return _description; } + set { SetPropertyValue(ref _description, value); } + } + + private int _downloadCount; + public int DownloadCount + { + get { return _downloadCount; } + set { SetPropertyValue(ref _downloadCount, value); } + } + + private string _galleryDetailsUrl; + public string GalleryDetailsUrl + { + get { return _galleryDetailsUrl; } + set { SetPropertyValue(ref _galleryDetailsUrl, value); } + } + + private string _iconUrl; + public string IconUrl + { + get { return _iconUrl; } + set { SetPropertyValue(ref _iconUrl, value); } + } + + private string _id; + public string Id + { + get { return _id; } + set { SetPropertyValue(ref _id, value); } + } + + private bool _isAbsoluteLatestVersion; + public bool IsAbsoluteLatestVersion + { + get { return _isAbsoluteLatestVersion; } + set { SetPropertyValue(ref _isAbsoluteLatestVersion, value); } + } + + public bool IsInstalled + { + get { return false; } + } + + private bool _isLatestVersion; + public bool IsLatestVersion + { + get { return _isLatestVersion; } + set { SetPropertyValue(ref _isLatestVersion, value); } + } + + private bool _isPrerelease; + public bool IsPrerelease + { + get { return _isPrerelease; } + set { SetPropertyValue(ref _isPrerelease, value); } + } + + private string _language; + public string Language + { + get { return _language; } + set { SetPropertyValue(ref _language, value); } + } + + private DateTime _lastUpdated; + public DateTime LastUpdated + { + get { return _lastUpdated; } + set { SetPropertyValue(ref _lastUpdated, value); } + } + + private string _licenseUrl; + public string LicenseUrl + { + get { return _licenseUrl; } + set { SetPropertyValue(ref _licenseUrl, value); } + } + + private string _packageHash; + public string PackageHash + { + get { return _packageHash; } + set { SetPropertyValue(ref _packageHash, value); } + } + + private string _packageHashAlgorithm; + public string PackageHashAlgorithm + { + get { return _packageHashAlgorithm; } + set { SetPropertyValue(ref _packageHashAlgorithm, value); } + } + + private long _packageSize; + public long PackageSize + { + get { return _packageSize; } + set { SetPropertyValue(ref _packageSize, value); } + } + + private string _projectUrl; + public string ProjectUrl + { + get { return _projectUrl; } + set { SetPropertyValue(ref _projectUrl, value); } + } + + private DateTime _published; + public DateTime Published + { + get { return _published; } + set { SetPropertyValue(ref _published, value); } + } + + private string _releaseNotes; + public string ReleaseNotes + { + get { return _releaseNotes; } + set { SetPropertyValue(ref _releaseNotes, value); } + } + + private string _reportAbuseUrl; + public string ReportAbuseUrl + { + get { return _reportAbuseUrl; } + set { SetPropertyValue(ref _reportAbuseUrl, value); } + } + + private string _requireLicenseAcceptance; + public string RequireLicenseAcceptance + { + get { return _requireLicenseAcceptance; } + set { SetPropertyValue(ref _requireLicenseAcceptance, value); } + } + + private string _summary; + public string Summary + { + get { return _summary; } + set { SetPropertyValue(ref _summary, value); } + } + + private string _tags; + public string Tags + { + get { return _tags; } + set { SetPropertyValue(ref _tags, value); } + } + + private string _title; + public string Title + { + get { return string.IsNullOrWhiteSpace(_title) ? Id : _title; } + set { SetPropertyValue(ref _title, value); } + } + + private SemanticVersion _version; + public SemanticVersion Version + { + get { return _version; } + set { SetPropertyValue(ref _version, value); } + } + + //public SemanticVersion LatestVersion + //{ + // get + // { + // var latest = _remoteService.GetLatest(Id); + // return latest != null ? new SemanticVersion(latest.Version) : Version; + // } + //} + + private int _versionDownloadCount; + public int VersionDownloadCount + { + get { return _versionDownloadCount; } + set { SetPropertyValue(ref _versionDownloadCount, value); } + } +#endregion + } +} diff --git a/Chocolatey.Gui/ViewModels/Pages/ILocalSourcePageViewModel.cs b/Chocolatey.Gui/ViewModels/Pages/ILocalSourcePageViewModel.cs new file mode 100644 index 000000000..25ff0e60e --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Pages/ILocalSourcePageViewModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Chocolatey.Gui.ViewModels.Items; + +namespace Chocolatey.Gui.ViewModels.Pages +{ + public interface ILocalSourcePageViewModel + { + ObservableCollection Packages { get; set; } + } +} diff --git a/Chocolatey.Gui/ViewModels/Pages/IRemoteSourcePageViewModel.cs b/Chocolatey.Gui/ViewModels/Pages/IRemoteSourcePageViewModel.cs new file mode 100644 index 000000000..b2123ffd6 --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Pages/IRemoteSourcePageViewModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Chocolatey.Gui.ViewModels.Items; + +namespace Chocolatey.Gui.ViewModels.Pages +{ + public interface IRemoteSourcePageViewModel + { + ObservableCollection Packages { get; set; } + } +} diff --git a/Chocolatey.Gui/ViewModels/Pages/LocalSourcePageViewModel.cs b/Chocolatey.Gui/ViewModels/Pages/LocalSourcePageViewModel.cs new file mode 100644 index 000000000..5d90cad42 --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Pages/LocalSourcePageViewModel.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Chocolatey.Gui.Base; +using Chocolatey.Gui.Models; +using Chocolatey.Gui.ViewModels.Items; + +namespace Chocolatey.Gui.ViewModels.Pages +{ + public class LocalSourcePageViewModel : ObservableBase, ILocalSourcePageViewModel + { + private ObservableCollection _packageViewModels; + public ObservableCollection Packages + { + get { return _packageViewModels; } + set { SetPropertyValue(ref _packageViewModels, value); } + } + + public LocalSourcePageViewModel() + { + Packages = new ObservableCollection + { + new PackageViewModel + { + Title = "Test 1", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + new PackageViewModel + { + Title = "Test 2", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + new PackageViewModel + { + Title = "Test 3", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + new PackageViewModel + { + Title = "Test 4", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + }; + } + } +} diff --git a/Chocolatey.Gui/ViewModels/Pages/RemoteSourcePageViewModel.cs b/Chocolatey.Gui/ViewModels/Pages/RemoteSourcePageViewModel.cs new file mode 100644 index 000000000..70fbbcda9 --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Pages/RemoteSourcePageViewModel.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Chocolatey.Gui.Base; +using Chocolatey.Gui.Models; +using Chocolatey.Gui.ViewModels.Items; + +namespace Chocolatey.Gui.ViewModels.Pages +{ + public class RemoteSourcePageViewModel : ObservableBase, IRemoteSourcePageViewModel + { + private ObservableCollection _packageViewModels; + public ObservableCollection Packages + { + get { return _packageViewModels; } + set { SetPropertyValue(ref _packageViewModels, value); } + } + + public RemoteSourcePageViewModel() + { + Packages = new ObservableCollection + { + new PackageViewModel + { + Title = "Test 1", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + new PackageViewModel + { + Title = "Test 2", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + new PackageViewModel + { + Title = "Test 3", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + new PackageViewModel + { + Title = "Test 4", + Version = new SemanticVersion(0,1,0,1337), + Authors = "Richard Simpson", + Summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ipsum risus, sodales vel neque eget, porta egestas lorem. Nam id dui quam. Nam at ligula ultricies, dignissim dolor ut, consectetur nisl. In semper elit non nunc porttitor faucibus. Quisque vestibulum varius ante, et ultrices orci feugiat vel. Nulla aliquam augue vel lacus tincidunt, ultricies pharetra nibh porttitor. Praesent porttitor malesuada velit, a molestie nisl faucibus aliquet. Curabitur pellentesque nisi ut magna vestibulum aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam feugiat dolor at lectus dignissim, at faucibus leo molestie.", + DownloadCount = 1337, + Tags = "yolo awesome that stuff" + }, + }; + } + } +} diff --git a/Chocolatey.Gui/ViewModels/Windows/IMainWindowViewModel.cs b/Chocolatey.Gui/ViewModels/Windows/IMainWindowViewModel.cs new file mode 100644 index 000000000..dee0eb20a --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Windows/IMainWindowViewModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Chocolatey.Gui.Models; + +namespace Chocolatey.Gui.ViewModels.Windows +{ + public interface IMainWindowViewModel + { + ObservableCollection Sources { get; set; } + } +} diff --git a/Chocolatey.Gui/ViewModels/Windows/MainWindowViewModel.cs b/Chocolatey.Gui/ViewModels/Windows/MainWindowViewModel.cs new file mode 100644 index 000000000..336274755 --- /dev/null +++ b/Chocolatey.Gui/ViewModels/Windows/MainWindowViewModel.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Windows; +using Chocolatey.Gui.Base; +using Chocolatey.Gui.Models; + +namespace Chocolatey.Gui.ViewModels.Windows +{ + public class MainWindowViewModel : ObservableBase, IMainWindowViewModel + { + public ObservableCollection Sources { get; set; } + + public MainWindowViewModel() + { + Sources = new ObservableCollection(); + var config = (ChocoConfigurationSection) System.Configuration.ConfigurationManager.GetSection("packageSources"); + foreach (SourceElement source in config.Sources) + { + Sources.Add(new SourceModel {Name = source.Name, Url = source.Url}); + } + } + } +} diff --git a/Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml b/Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml new file mode 100644 index 000000000..9a702ad4a --- /dev/null +++ b/Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml.cs b/Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml.cs new file mode 100644 index 000000000..255ac09de --- /dev/null +++ b/Chocolatey.Gui/Views/Pages/LocalSourcePage.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Chocolatey.Gui.ViewModels.Pages; + +namespace Chocolatey.Gui.Views.Pages +{ + /// + /// Interaction logic for LocalSourcePage.xaml + /// + public partial class LocalSourcePage : Page + { + public LocalSourcePage(ILocalSourcePageViewModel vm) + { + InitializeComponent(); + DataContext = vm; + } + } +} diff --git a/Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml b/Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml new file mode 100644 index 000000000..5570d08af --- /dev/null +++ b/Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml.cs b/Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml.cs new file mode 100644 index 000000000..bc5a2d1f9 --- /dev/null +++ b/Chocolatey.Gui/Views/Pages/RemoteSourcePage.xaml.cs @@ -0,0 +1,17 @@ +using System.Windows.Controls; +using Chocolatey.Gui.ViewModels.Pages; + +namespace Chocolatey.Gui.Views.Pages +{ + /// + /// Interaction logic for LocalSourcePage.xaml + /// + public partial class RemoteSourcePage : Page + { + public RemoteSourcePage(IRemoteSourcePageViewModel vm) + { + InitializeComponent(); + DataContext = vm; + } + } +} diff --git a/Chocolatey.Gui/Views/Windows/MainWindow.xaml b/Chocolatey.Gui/Views/Windows/MainWindow.xaml new file mode 100644 index 000000000..5b2b0822e --- /dev/null +++ b/Chocolatey.Gui/Views/Windows/MainWindow.xaml @@ -0,0 +1,27 @@ + + + +