From f238b52f95b6f12133cd7e205ba0fb3fd147aee7 Mon Sep 17 00:00:00 2001 From: zznty <94796179+zznty@users.noreply.github.com> Date: Mon, 7 Jul 2025 02:44:02 +0700 Subject: [PATCH] add support for userdev launch in ide add template for user plugins --- CringeBootstrap/Program.cs | 16 +- .../Properties/launchSettings.json | 13 + CringeLauncher.slnx | 32 +- CringeLauncher/Launcher.cs | 27 +- .../UserDev/Networking/UserDevGameService.cs | 429 ++++++++++++++++++ CringeLauncher/UserDev/UserDevLauncher.cs | 23 + .../CringePlugins.MSBuild.csproj | 33 ++ CringePlugins.MSBuild/GenerateRunConfig.cs | 86 ++++ .../build/CringePlugins.MSBuild.props | 14 + .../build/CringePlugins.MSBuild.targets | 9 + .../CringePlugins.Templates.csproj | 27 ++ .../templates/Plugin/$projectName$.csproj | 32 ++ .../Plugin/.template.config/template.json | 29 ++ .../content/templates/Plugin/Plugin.cs | 18 + .../content/templates/Plugin/icon.png | Bin 0 -> 126291 bytes CringePlugins/Loader/PluginsLifetime.cs | 29 +- 16 files changed, 782 insertions(+), 35 deletions(-) create mode 100644 CringeBootstrap/Properties/launchSettings.json create mode 100644 CringeLauncher/UserDev/Networking/UserDevGameService.cs create mode 100644 CringeLauncher/UserDev/UserDevLauncher.cs create mode 100644 CringePlugins.MSBuild/CringePlugins.MSBuild.csproj create mode 100644 CringePlugins.MSBuild/GenerateRunConfig.cs create mode 100644 CringePlugins.MSBuild/build/CringePlugins.MSBuild.props create mode 100644 CringePlugins.MSBuild/build/CringePlugins.MSBuild.targets create mode 100644 CringePlugins.Templates/CringePlugins.Templates.csproj create mode 100644 CringePlugins.Templates/content/templates/Plugin/$projectName$.csproj create mode 100644 CringePlugins.Templates/content/templates/Plugin/.template.config/template.json create mode 100644 CringePlugins.Templates/content/templates/Plugin/Plugin.cs create mode 100644 CringePlugins.Templates/content/templates/Plugin/icon.png diff --git a/CringeBootstrap/Program.cs b/CringeBootstrap/Program.cs index a1a8ef9..c3fabbe 100644 --- a/CringeBootstrap/Program.cs +++ b/CringeBootstrap/Program.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Reflection; +using System.Reflection.Metadata; using System.Runtime.Loader; using CringeBootstrap; using CringeBootstrap.Abstractions; @@ -47,9 +48,20 @@ context.AddDependencyOverride("CringeLauncher"); context.AddDependencyOverride("CringePlugins"); context.AddDependencyOverride("EOSSDK"); -var launcher = context.LoadFromAssemblyName(new AssemblyName("CringeLauncher")); +var entrypoint = Environment.GetEnvironmentVariable("DOTNET_BOOTSTRAP_ENTRYPOINT") ?? + "CringeLauncher.Launcher, CringeLauncher"; +if (!TypeName.TryParse(entrypoint, out var entrypointName) || + entrypointName.AssemblyName is null) +{ + Console.Error.WriteLine($"Invalid entrypoint name: {entrypoint}"); + Console.Error.WriteLine("Bootstrap encountered a fatal error and will shutdown."); + Console.Read(); + return; +} -using var corePlugin = (ICorePlugin) launcher.CreateInstance("CringeLauncher.Launcher")!; +var launcher = context.LoadFromAssemblyName(entrypointName.AssemblyName.ToAssemblyName()); + +using var corePlugin = (ICorePlugin) launcher.CreateInstance(entrypointName.FullName)!; corePlugin.Initialize(args); corePlugin.Run(); \ No newline at end of file diff --git a/CringeBootstrap/Properties/launchSettings.json b/CringeBootstrap/Properties/launchSettings.json new file mode 100644 index 0000000..64e60c1 --- /dev/null +++ b/CringeBootstrap/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "CringeBootstrap": { + "commandName": "Project", + "commandLineArgs": "\"C:\\Program Files (x86)\\Steam\\steamapps\\common\\SpaceEngineers\\Bin64\\SpaceEngineers.exe\"", + "environmentVariables": { + "DOTNET_BOOTSTRAP_ENTRYPOINT": "CringeLauncher.UserDev.UserDevLauncher, CringeLauncher", + "DOTNET_USERDEV_RUNDIR": "data" + } + } + } +} diff --git a/CringeLauncher.slnx b/CringeLauncher.slnx index a5b95ea..3c7e623 100644 --- a/CringeLauncher.slnx +++ b/CringeLauncher.slnx @@ -1,16 +1,18 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CringeLauncher/Launcher.cs b/CringeLauncher/Launcher.cs index b5a3465..17fc9c5 100644 --- a/CringeLauncher/Launcher.cs +++ b/CringeLauncher/Launcher.cs @@ -45,15 +45,27 @@ namespace CringeLauncher; public class Launcher : ICorePlugin { - private const uint AppId = 244850U; + private readonly string? _gameDataDirectoryPathOverride; + protected const uint AppId = 244850U; private SpaceEngineersGame? _game; private readonly Harmony _harmony = new("CringeBootstrap"); private IPluginsLifetime? _lifetime; private MyGameRenderComponent? _renderComponent; - private readonly DirectoryInfo _configDir = Directory.CreateDirectory( - Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CringeLauncher", "config")); + private readonly DirectoryInfo _configDir; + private readonly DirectoryInfo _dir; + + public Launcher() : this(null) { } + + protected Launcher(string? gameDataDirectoryPathOverride) + { + _gameDataDirectoryPathOverride = gameDataDirectoryPathOverride; + _dir = Directory.CreateDirectory(Path.Join( + gameDataDirectoryPathOverride ?? Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "CringeLauncher")); + _configDir = _dir.CreateSubdirectory("config"); + } public void Initialize(string[] args) { @@ -107,7 +119,7 @@ public class Launcher : ICorePlugin MyFinalBuildConstants.APP_VERSION = MyPerGameSettings.BasicGameInfo.GameVersion.GetValueOrDefault(); MyShaderCompiler.Init(MyShaderCompiler.TargetPlatform.PC, false); MyVRageWindows.Init(MyPerGameSettings.BasicGameInfo.ApplicationName, MySandboxGame.Log, - Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + Path.Join(_gameDataDirectoryPathOverride ?? Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), MyPerGameSettings.BasicGameInfo.ApplicationName), false, false); @@ -168,7 +180,8 @@ public class Launcher : ICorePlugin var retryPolicy = HttpPolicyExtensions.HandleTransientHttpError() .WaitAndRetryAsync(5, _ => TimeSpan.FromSeconds(1)); - services.AddHttpClient() + services.AddHttpClient((client, provider) => + new PluginsLifetime(provider.GetRequiredService(), client, _dir)) .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All @@ -225,7 +238,7 @@ public class Launcher : ICorePlugin return MyVRage.Platform.Windows.Window; } - private async Task CheckUpdatesDisabledAsync(Logger logger) + protected virtual async Task CheckUpdatesDisabledAsync(Logger logger) { var path = Path.Join(_configDir.FullName, "launcher.json"); @@ -319,7 +332,7 @@ public class Launcher : ICorePlugin MyTexts.LoadTexts(textsPath, description.CultureName, description.SubcultureName); } - public static void InitUgc() + protected virtual void InitUgc() { var steamGameService = MySteamGameService.Create(false, AppId); MyServiceManager.Instance.AddService(steamGameService); diff --git a/CringeLauncher/UserDev/Networking/UserDevGameService.cs b/CringeLauncher/UserDev/Networking/UserDevGameService.cs new file mode 100644 index 0000000..444bc20 --- /dev/null +++ b/CringeLauncher/UserDev/Networking/UserDevGameService.cs @@ -0,0 +1,429 @@ +using VRage.GameServices; + +namespace CringeLauncher.UserDev.Networking; + +public class UserDevGameService(uint appId) : IMyGameService +{ + private readonly List m_packageIds = []; + + public uint AppId { get; } = appId; + + public bool IsActive => true; + + public bool IsOnline { get; } + + public bool IsOverlayEnabled { get; } + + public bool IsOverlayBrowserAvailable { get; } + + public bool OwnsGame { get; } + + public ulong UserId + { + get => 1234567891011; + set + { + } + } + + public ulong OnlineUserId => UserId; + + public char PlatformIcon => VRage.GameServices.PlatformIcon.PC; + + public string UserName => "Dev"; + + public string OnlineName => UserName; + + public bool CanQuickLaunch { get; } + + public void QuickLaunch() + { + } + + public MyGameServiceUniverse UserUniverse => MyGameServiceUniverse.Dev; + + public string BranchName => "userdev"; + + public string BranchNameFriendly => "UserDev"; + + public event Action? OnOverlayActivated; + + public event Action? OnDLCInstalled; + + public event Action? OnUserChanged; + + public event Action? OnSignInStateChanged; + + public event Action? OnActivityLaunch; + + public event Action? OnUpdate; + + public event Action? OnUpdateNetworkThread; + + public event Action? OnLobbyStart; + + public event Action? OnSessionUnload; + + public void OpenOverlayUrl(string url, bool predetermined = true) + { + } + + public void SetNotificationPosition(NotificationPosition notificationPosition) + { + } + + public void ShutDown() + { + } + + public bool IsAppInstalled(uint appId) => true; + + public void OpenDlcInShop(uint dlcId) + { + } + + public void OpenInventoryItemInShop(int itemId) + { + } + + public bool IsDlcSupported(uint dlcId) => true; + + public bool IsDlcInstalled(uint dlcId) => true; + + public void AddDlcPackages(List packages) + { + m_packageIds.Clear(); + foreach (var package in packages) + { + if (!string.IsNullOrEmpty(package.XboxPackageId) && !string.IsNullOrEmpty(package.XboxStoreId)) + m_packageIds.Add(new MyPackage + { + DlcId = package.AppId, + PackageId = package.XboxPackageId, + StoreId = package.XboxStoreId + }); + } + } + + public int GetDLCCount() => m_packageIds.Count; + + public bool GetDLCDataByIndex( + int index, + out uint dlcId, + out bool available, + out string name, + int nameBufferSize) + { + if (index >= m_packageIds.Count) + { + dlcId = 0U; + available = false; + name = string.Empty; + return false; + } + available = true; + dlcId = m_packageIds[index].DlcId; + name = "Dev" + index; + return true; + } + + public void OpenOverlayUser(ulong id) + { + } + + public bool GetAuthSessionTicket(out uint ticketHandle, byte[] buffer, out uint length) + { + ticketHandle = 0U; + length = 0U; + return false; + } + + public void LoadStats() + { + } + + public IMyAchievement? GetAchievement(string achievementName, string statName, float maxValue) + { + return null; + } + + public IMyAchievement? GetAchievement(string achievementName) => null; + + public void RegisterAchievement(string achievementName, string xblId) + { + } + + public void ResetAllStats(bool achievementsToo) + { + } + + public void StoreStats() + { + } + + public string GetPersonaName(ulong userId) => string.Empty; + + public bool HasFriend(ulong userId) => false; + + public string GetClanName(ulong groupId) => string.Empty; + + public void Update() + { + OnUpdate?.Invoke(); + } + + public void UpdateNetworkThread(bool sessionEnabled) + { + OnUpdateNetworkThread?.Invoke(sessionEnabled); + } + + public bool IsUserInGroup(ulong groupId) => false; + + public bool GetRemoteStorageQuota(out ulong totalBytes, out ulong availableBytes) + { + totalBytes = 0UL; + availableBytes = 0UL; + return false; + } + + public int GetRemoteStorageFileCount() => 0; + + public string GetRemoteStorageFileNameAndSize(int fileIndex, out int fileSizeInBytes) + { + fileSizeInBytes = 0; + return string.Empty; + } + + public bool IsRemoteStorageFilePersisted(string file) => false; + + public bool RemoteStorageFileForget(string file) => false; + + public ulong CreatePublishedFileUpdateRequest(ulong publishedFileId) => 0; + + public void UpdatePublishedFileTags(ulong updateHandle, string[] tags) + { + } + + public void UpdatePublishedFileFile(ulong updateHandle, string steamItemFileName) + { + } + + public void UpdatePublishedFilePreviewFile(ulong updateHandle, string steamPreviewFileName) + { + } + + public void FileDelete(string steamItemFileName) + { + } + + public bool FileExists(string fileName) => false; + + public int GetFileSize(string fileName) => 0; + + public ulong FileWriteStreamOpen(string fileName) => 0; + + public void FileWriteStreamWriteChunk(ulong handle, byte[] buffer, int size) + { + } + + public void FileWriteStreamClose(ulong handle) + { + } + + public void CommitPublishedFileUpdate( + ulong updateHandle, + Action onCallResult) + { + } + + public void PublishWorkshopFile( + string file, + string previewFile, + string title, + string description, + string longDescription, + MyPublishedFileVisibility visibility, + string[] tags, + Action onCallResult) + { + } + + public void SubscribePublishedFile( + ulong publishedFileId, + Action onCallResult) + { + } + + public void FileShare( + string file, + Action onCallResult) + { + } + + public string ServiceName => nameof (UserDevGameService); + + public string ServiceDisplayName => "UserDev Game Service"; + + public bool OpenProfileForMute { get; } + + public int GetFriendsCount() => 0; + + public ulong GetFriendIdByIndex(int index) => 0; + + public string GetFriendNameByIndex(int index) => string.Empty; + + public void SaveToCloudAsync( + string storageName, + byte[] buffer, + Action? completedAction) + { + completedAction?.Invoke(CloudResult.Failed); + } + + public CloudResult SaveToCloud(string fileName, byte[] buffer) => CloudResult.Failed; + + public CloudResult SaveToCloud(string containerName, List fileNames) + { + return CloudResult.Failed; + } + + public bool LoadFromCloudAsync(string fileName, Action completedAction) => false; + + public List? GetCloudFiles(string directoryFilter) + { + return null; + } + + public byte[]? LoadFromCloud(string fileName) => null; + + public bool DeleteFromCloud(string fileName) => false; + + public bool IsProductOwned(uint productId, out DateTime? purchaseTime) + { + purchaseTime = null; + return false; + } + + public void RequestEncryptedAppTicket(string url, Action onDone) + { + } + + public void RequestAuthToken(string clientId, Action onDone) + { + } + + public void RequestPermissions( + Permissions permission, + bool attemptResolution, + Action? onDone) + { + onDone?.Invoke(permission == Permissions.UGC ? PermissionResult.Error : PermissionResult.Granted); + } + + public void RequestPermissionsWithTargetUser( + Permissions permission, + ulong userId, + Action? onDone) + { + onDone?.Invoke(PermissionResult.Granted); + } + + public void OnThreadpoolInitialized() + { + } + + public bool GetInstallStatus(out int percentage) + { + percentage = 100; + return true; + } + + public void Trace(bool enable) + { + } + + public void SetPlayerMuted(ulong playerId, bool muted) + { + } + + public ulong[]? GetBlockListRaw() => null; + + HashSet? IMyGameService.GetBlockList() => null; + + public ulong[]? GetBlockList() => null; + + public bool IsPlayerMuted(ulong playerId) => false; + + public void UpdateMutedPlayers(Action onDone) => onDone.InvokeIfNotNull(); + + public MyGameServiceAccountType GetServerAccountType(ulong steamId) + { + return MyGameServiceAccountType.Invalid; + } + + public void DeleteUnnecessaryFilesFromTempFolder() + { + } + + public void OnSessionLoaded(string campaignName, string currentMissionName) + { + } + + public void OnSessionReady(bool multiplayer, bool dedicated) + { + } + + public void OnLoadingScreenCompleted() + { + } + + public void OnGameSaved(bool success, string savePath) + { + } + + public void OnCampaignFinishing() + { + } + + public void LobbyStarts() => OnLobbyStart.InvokeIfNotNull(); + + public void OnMissionFinished(string missionName) + { + } + + public void OnSessionUnloaded() => OnSessionUnload.InvokeIfNotNull(); + + public void OnSessionUnloading() + { + } + + public bool ActivityInProgress { get; } + + public LoadActivityResult GetActivityLoadInformation(string activityId) + { + return new LoadActivityResult(); + } + + public void OnPlayersChanged(int playersCount) + { + } + + public ulong GetModsCacheFreeSpace() => ulong.MaxValue; + + public void FormatModsCache() + { + } + + public void PrintStats() + { + } + + public bool IsPlayerBlocked(ulong playerId) => false; + + private struct MyPackage + { + public uint DlcId; + public string PackageId; + public string StoreId; + } +} \ No newline at end of file diff --git a/CringeLauncher/UserDev/UserDevLauncher.cs b/CringeLauncher/UserDev/UserDevLauncher.cs new file mode 100644 index 0000000..534020a --- /dev/null +++ b/CringeLauncher/UserDev/UserDevLauncher.cs @@ -0,0 +1,23 @@ +using CringeLauncher.UserDev.Networking; +using NLog; +using VRage; +using VRage.GameServices; + +namespace CringeLauncher.UserDev; + +public class UserDevLauncher() : Launcher(Environment.GetEnvironmentVariable("DOTNET_USERDEV_RUNDIR")) +{ + protected override void InitUgc() + { + var gameService = new UserDevGameService(AppId); + MyServiceManager.Instance.AddService(gameService); + MyServiceManager.Instance.AddService(new MyNullNetworking(gameService)); + MyServiceManager.Instance.AddService(new MyNullLobbyDiscovery()); + MyServiceManager.Instance.AddService(new MyNullServerDiscovery()); + } + + protected override Task CheckUpdatesDisabledAsync(Logger logger) + { + return Task.FromResult(true); + } +} \ No newline at end of file diff --git a/CringePlugins.MSBuild/CringePlugins.MSBuild.csproj b/CringePlugins.MSBuild/CringePlugins.MSBuild.csproj new file mode 100644 index 0000000..74f04fd --- /dev/null +++ b/CringePlugins.MSBuild/CringePlugins.MSBuild.csproj @@ -0,0 +1,33 @@ + + + + netstandard2.0 + latest + enable + + tasks + + NU5100 + embedded + true + 1.0.0 + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + build\ + + + build\ + + + + diff --git a/CringePlugins.MSBuild/GenerateRunConfig.cs b/CringePlugins.MSBuild/GenerateRunConfig.cs new file mode 100644 index 0000000..c2e6aaa --- /dev/null +++ b/CringePlugins.MSBuild/GenerateRunConfig.cs @@ -0,0 +1,86 @@ +using System; +using System.IO; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.Win32; + +namespace CringePlugins.MSBuild; + +public class GenerateRunConfig : Task +{ + [Required] public required string RunConfigPath { get; set; } + + [Required] public required string ProjectName { get; set; } + + private const string RunConfigTemplate = """ + { + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "$projectName$ Dev Client": { + "commandName": "Executable", + "executablePath": "BootstrapExecutablePathPlaceholder", + "commandLineArgs": "\"GameExecutablePathPlaceholder\"", + "environmentVariables": { + "DOTNET_BOOTSTRAP_ENTRYPOINT": "CringeLauncher.UserDev.UserDevLauncher, CringeLauncher", + "DOTNET_USERDEV_RUNDIR": "data", + "DOTNET_USERDEV_PLUGINDIR": "." + } + } + } + } + """; + + public override bool Execute() + { + if (Environment.OSVersion.Platform != PlatformID.Win32NT) + { + Log.LogError("Only windows is supported"); + return false; + } + + // branch off so jit wont notice in case Win32 package is missing from sdk distribution on non-windows platforms + // too lazy to test if it actually is missing + return ExecuteInternal(); + } + + private bool ExecuteInternal() + { + string? GetInstallLocation(RegistryKey baseKey, string subKey) + { + using var key = baseKey.OpenSubKey(subKey); + return key?.GetValue("InstallLocation") as string; + } + + var gamePath = GetInstallLocation(Registry.LocalMachine, + @"Software\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 244850"); + var bootstrapPath = GetInstallLocation(Registry.CurrentUser, + @"Software\Microsoft\Windows\CurrentVersion\Uninstall\CringeLauncher"); + + if (string.IsNullOrEmpty(gamePath)) + { + Log.LogError("Failed to find Space Engineers install location"); + return false; + } + + if (string.IsNullOrEmpty(bootstrapPath)) + { + Log.LogError("Failed to find CringeLauncher install location"); + return false; + } + + gamePath = Path.Combine(gamePath, @"Bin64\SpaceEngineers.exe").Replace(@"\", @"\\"); + bootstrapPath = Path.Combine(bootstrapPath, @"current\CringeBootstrap.exe").Replace(@"\", @"\\"); + + var runConfigText = RunConfigTemplate + .Replace("BootstrapExecutablePathPlaceholder", bootstrapPath) + .Replace("GameExecutablePathPlaceholder", gamePath) + .Replace("$projectName$", ProjectName); + + var runConfigDir = Path.GetDirectoryName(RunConfigPath); + if (runConfigDir is not null && !Directory.Exists(runConfigDir)) + Directory.CreateDirectory(runConfigDir); + + File.WriteAllText(RunConfigPath, runConfigText); + return true; + } +} \ No newline at end of file diff --git a/CringePlugins.MSBuild/build/CringePlugins.MSBuild.props b/CringePlugins.MSBuild/build/CringePlugins.MSBuild.props new file mode 100644 index 0000000..84ac82b --- /dev/null +++ b/CringePlugins.MSBuild/build/CringePlugins.MSBuild.props @@ -0,0 +1,14 @@ + + + + $(MSBuildThisFileDirectory)..\tasks\netstandard2.0 + + $(CustomTasksFolder)\$(MSBuildThisFileName).dll + + + + + + $(ProjectDir)Properties\launchSettings.json + + \ No newline at end of file diff --git a/CringePlugins.MSBuild/build/CringePlugins.MSBuild.targets b/CringePlugins.MSBuild/build/CringePlugins.MSBuild.targets new file mode 100644 index 0000000..e5499ea --- /dev/null +++ b/CringePlugins.MSBuild/build/CringePlugins.MSBuild.targets @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/CringePlugins.Templates/CringePlugins.Templates.csproj b/CringePlugins.Templates/CringePlugins.Templates.csproj new file mode 100644 index 0000000..105f732 --- /dev/null +++ b/CringePlugins.Templates/CringePlugins.Templates.csproj @@ -0,0 +1,27 @@ + + + + net9.0 + False + False + False + $(ArtifactsTmpDir) + False + true + true + true + 2008;NU5105 + true + Template + True + 1.0.0 + + + + + + content + + + + diff --git a/CringePlugins.Templates/content/templates/Plugin/$projectName$.csproj b/CringePlugins.Templates/content/templates/Plugin/$projectName$.csproj new file mode 100644 index 0000000..2eed091 --- /dev/null +++ b/CringePlugins.Templates/content/templates/Plugin/$projectName$.csproj @@ -0,0 +1,32 @@ + + + + net9.0-windows + enable + enable + win-x64 + true + true + true + https://ng.zznty.ru/v3/index.json + true + CringePlugin + CringeLauncher + Plugin.$projectName$ + Plugin.$projectName$ + TitlePlaceholder + DescriptionPlaceholder + preview + icon.png + + + + + + + + + + + + \ No newline at end of file diff --git a/CringePlugins.Templates/content/templates/Plugin/.template.config/template.json b/CringePlugins.Templates/content/templates/Plugin/.template.config/template.json new file mode 100644 index 0000000..6616028 --- /dev/null +++ b/CringePlugins.Templates/content/templates/Plugin/.template.config/template.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "zznty", + "classifications": [ "CringeLauncher", "SpaceEngineers", "Plugin" ], + "identity": "CringePlugins.PluginTemplate.Plugin", + "name": "SpaceEngineers Plugin Template", + "shortName": "cringeplugin", + "tags": { + "language": "C#", + "type": "project" + }, + "defaultName": "Plugin", + "sourceName": "$projectName$", + "postActions": [], + "symbols": { + "title": { + "type": "parameter", + "defaultValue": "Test Plugin", + "description": "The title of the plugin", + "replaces": "TitlePlaceholder" + }, + "description": { + "type": "parameter", + "defaultValue": "This is a test plugin", + "description": "The description of the plugin", + "replaces": "DescriptionPlaceholder" + } + } +} \ No newline at end of file diff --git a/CringePlugins.Templates/content/templates/Plugin/Plugin.cs b/CringePlugins.Templates/content/templates/Plugin/Plugin.cs new file mode 100644 index 0000000..ac7bd9d --- /dev/null +++ b/CringePlugins.Templates/content/templates/Plugin/Plugin.cs @@ -0,0 +1,18 @@ +using VRage.Plugins; + +namespace $projectName$; + +public class Plugin : IPlugin +{ + public void Init(object gameInstance) + { + } + + public void Update() + { + } + + public void Dispose() + { + } +} \ No newline at end of file diff --git a/CringePlugins.Templates/content/templates/Plugin/icon.png b/CringePlugins.Templates/content/templates/Plugin/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0fde5f791cf037ad5a3cb58cf913c389eda24364 GIT binary patch literal 126291 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

V02ftnd1VNk7oqIdqxHJnfbLV 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≷1&% z*W2E{>`dt1Rc-S>a5O9x6-|bSA*-ordHM3?2i$P^7jFXA9}Z&OGw&9djpYtguqiMa zCI!x$B!m=n-t^VK3vA~nhRh=?!Ctw*-QVFWYm)P{;0fBRmAoxA?}Co+)JYXycuFH$ zAMA^j5h{)$5fL`%?hqZoBfSqs5@*q8`%A7~y;V&6%Bv^*ns*_>qorg5?W%aN0H@L- zFz=$x0@nsdvd4($xQr>TpaF8!M2xIIsoe5@rI2&qr(vSdHY=;!FfAYv*)Gw<{qgFaW*nB?^ci8Cc*{ls4H>Mwbu?S02L)nZKqn_hSO*sqr z57jp$DzCudgf2PCKT-)7qxvzNo(XrEz?rM{=r@OmxB*L3hw=gFE^}FR7@&&@%m&Yb z%0>isxE!ucFlzA*4GB5a$G^0vq8@I*MyE>r1n;P#&LxPS{s@OC_v#`qZY zr!IC35>3*XRSAYmAeuFY8ox);Z2hO^a7!ak&pdx0?S00^@zBv_0JCeWVzm6wnZ5&Q z7^2y}ty_IO`)-N86PlCZO1>WCEIM?MfLp~`_yN}dhvwW0j)HvqvSVSPp>iQrx&|9R za5YrroOJ{MwF?OUDyTTIeJQ+_Ze4xbIN4&eeZ6<0H*NR6eX%gSX)6%@ZvX)#6p}Qy z%*O>eJ(?|e^5wPlIyyQ`h!^l$Cqy|OOK)W!ga3)aNpl9JZS2S}4mXl||Ne#*tFI`J z)ou68uhYh@8tuGy%a73(q-=c48t8>yarOU&!tPtTygegPswztwvO#COE{xYESWcN-oVy1@cMbL zA&pgKIiC1doBP3NOVx|#|0C?n1F2lM|6ddugfvJ(hT=3xNl4n2G8CB_Nuj}5gp$Zs zDh(285+!Lsp+eF?6pcb;NZC;tnvhCLexLR3U8i&I{obFy?me;h`##Tl*6{g!)_U%i zz+w*KU}1$eDQ@XJNs~x|zP&z-+`>|`Su^Sb7D>#rk5blz*47~>l*O0`-Nrd{YsR?h zHVp8;fFWox2AeJc1iR0!PhIjaCl@k``ovpGPHsc@kvn}lLcjtXo8!ShH)XDUUh|Zb zeP{0d=nT*Z>Enc$mjy8B{D*p#5A=raj~>^o3nPm@a^xJ?_LQ8Qr6_bW$*r|Yf^>*L zKkHg&rDV_QOS8A+E{9XKTD9u*1tFz367ssRx&;(S5e+D8`j|@UH~tmp)9u-Z(cOR) zX=JL4kkcNY4+Bj#P0TXkV7$G(b6)NkZo7E#-Q~rwqt@oUecAxzBpRF}3PB9f9?t&Gz)pVYX- z!)kt4M)0<0WN4$0#SSB=cVECOaDy+S?C|?gdo*Q<)TD_MCw6o^ng4e5^l!WHuThYq zpA-@ib%E#ZyM1Ps==F5#GKnp@!8gV++S4fi9XyWlijMU$ExsyjdTiLn_>qZc&bVRx z{$Cmz2rc;dg7v&Sq0h}vc6y6B-N*FV@{_Z~9v#stfL}B9tjVxKeuP67edy3?_q={1 z)Pi2ej@eM0iL`>(iYMo)yo%l9Q~cVbhEk-{Y>MQt>Gfc^Eo$LGa)K3#qjB!zmfx%` z8+zWD365JuCFE33L@0&}=WVP;A%t)a13b54f(tffxZ3Bh-@6s7 zggL$lCgTi;^k?ew^(u??7L9e)Xc(X!3X8h1JlEmQojZG{;!C{d?T}O~&KBt$P*G8V zy|oSq$N^-F2gncGa@q^w@d56vycU!+F+Go?j( zhgCHem6`A5l}KUFI>-wl%u+Vb?5iR(Iy+x+xJc&^d|&`5)5&h->ZwJ&xQgk4-_}15 z{Pd^`nTMyqDQ$tlUKuB3q+~D>%(j;`>xbD+h;E)F0Kd zc^ff9o%nIUB2GUkBg1yx^|l><7?W9}eX7sC6O|%)BLipklKK?u zvr)fsgK5t4-^Mg%^k`!gGA+-qUAaK#;uL!>kSAi1vV>bj3_E!ue($QRs;jG$)6$SM z@lMcXA$@xZlL^E)YKQhR-KO?_L$SnVHRiT54!6{z3?}lCUZqXh<((hCh!`B)zdwFU zcb6+F1~U_rbUGSd^DrB?t_hSzmKIl~9J3RVZKoiQ!a~a4T44z!u>94%1K@GovC&i2 zBw$lMu&MQ4v-b!Jbg84UK8+@SMU|KSZBpB}Z+Cm1lgYk^v(Dx(9;;Tatdh;Maw|>P zt`N{Pl5(oHwl=JnEEENc7A`#0w_m@({Y5>I{meDZ#g~ln5Q=Zp!glZ-l=2>*)C-A? zYM)Qdt6T9L03D>XNLs<02ZAhMotE=n%$B#*R3OAm2<=nY*mSD^> zT}qXa`YcgSx`OI_Wj`i-CyKXv4~8)h_etIElgcR@V%ofSDlaoSdeFF~875;Eo@a{% z=5hJcr+-bFgv(WUk!o`fHNmTtS6y`WYvrNZWcF@&U*n2a(WO})N3Csa@B$;v%S0RP zFZ!gO9w!v9f$BEi^mhrjiEmBCu}Sa-YoF&-Q_>@zBCRrqGAA8TsW~W<5e?W(d%oef z+fNzpx>5u{a%bpAu;Bv$d!}~WDuzYv^V#3NXz}1Giv^E4`)W<8=QE>>A6EKKEZ{Sq%6`z-aieEM#yq5 zA$!|}BrO@Hl&QvO54N}Ajm)iEr@|<}dHmmrG-GfPtgv58xhXiQjKN&d5_mvLrqNeH zv7&CIY=1Y%Bq##Axw~VjPR=YFhocuVj`4q>w?-vY8YkOjV64xYsf}i;<5vII;*Be6 zV`rBFGuHaR$dzIe6&Y>#h^Y(7@8M9`-M({214jwZV7q$tnfiMFX}uq39_U!qXrJWs zLD){1lOd?!c+(o~hnr4P{rqaP9Gg+2E$|dZzdfV-cw1|sxIG0YSXRi$-GgN0G@LiT z{^EXY!x%S|c5BP{iOs5Af^3=**CY=jW6D_F(>u(IeGr*3+gcxq$2c{$*+@NYUCAHf z)3tYR`t+t5Ey|a)xN|ZPUYBipeGs0o3?&aDQs)3l2eB0yNZ3!GIa4FoIx{Ab>yw(N zSDAl^ks61rDNMikYH8FL6S?skx4v+6)kcqg3!#;@l9c7w56=M{;Y-4h@w)KxLMSi` zm)zZYE55zGozmGRkXDzmR-1jB%Vwk6USFI9;EBSLgY}ujmRX8Qy}9RP)`^5lo@f=# zf1tNFQ8rny;2@H?45+BEWacQezDP59 z8(r#d-k1|Ecly5;a0w{jl3}V3-ia{#9F{CO8ZI@*-c?|D#wbiixyGm#w`^;yZ)m8< z4GxB%`c$Bc*E9-6&h-{*lFQ*jM(HQI->nHiW#Ws;#0b5uA}uW~+PHQI+_FvoX(g7( ze=0tH&2{d_7#Fi9$M-M$!hJr>Gu2ec87|ox{kYNQ%G&4J=*7XRqC!K#J*ZgkIc5pk zKN2w}5QC!!Xh znE2({x|EEJXm2sRfwCF!lCIBhi?T&rgfX-CJi5SVAQLSuj=Mfun5*IkZBsIGAT>1< zaIc4~^DiEqbS=@7QXu)S{vu)OsB?{a5nOOhP2zC$3b>f1nQo_Hr%OXP-0%Alv7{mk z_YOM+Syf3PlRzQZ7c$aj92I~bya|b?Pg7U~ZB-Jnr9;I|}5+>#;8&%ui_eia&Zh=sGud`)AM#2zCTY2Gn> zt)-*mNq{FT#--%cOIQf*Ygft=u53x_vZ?0B4VGXKY8E{{g0O2-$w@?(ML|I~06cj_ zM>l`{KD1gmujlU~{m0bC+UBUfYNx9Qw9Z_*G=@A1nq2Qujm|MjN=dQ7;RFm2riFn7 zHvp0PK`sP;<8|bZJUVvkjveh+$)yAz9micvHsq}Xd<#{Weq&$N3(mD6JNC!KBxA-a zb__TcK0F~GA!*n~M#}{=UdXO+(ovu3&J$$NH#_V5oj%>xutqz~*7S7oRi{RKcROM3 zBHddBRN|QwU)430QR|+=W+Q|I!Q0&wqg78HG<4`&TyNGWbC$Cg0>rn`$Bw1gSm@os zs;jhC=KfrOZt0yE|Ku_zuixjWpUTYxa_fRi4sp)E1e!%a*<(~-W;H6mD=?BsEm*ST z9$SG~sY!{Gk3wSD1RWSpTappq=AL?W4$wrxfOd^O?gG@ZUTu|G&HLERcj5gkVgcMc zOi*43K>C380_)uXjpxprSB`KqnV&1$Ay?-3V!59LcUK0xVx~`)uvA09mv>3Pyak}I z{K-Btqg-mUy-|f7oXC^FjWa!} z%bwDf+R9FLiymbW>*CDpS0(g309CKxkOu%sYD}!pd(|6bldipIG;vN`As($Y?T;Mr+(LW%^VH9nvV{3T34;c3 zD~xPC1g~K10)`_8b0H_ABlxHMjvbeNRbJdPVZZ5<82v{3s6>0yDW>&n`}=>ubyy`} zd=mO;UN2#d(zZI=`;@+4OCn&Fs=mxkVAfI81{W?jdG{DIA*KF=G#UnVxj^-agC!NE zz1(^_YWQb|I5zq82Ifqjm3Q$pmfg5{IM4mwy?YQtA3{zFbASD{&3&+SJkw5J#`JeoTL+?DRm&e4oD)q6$U&W>z^36?Loh6n}^JOa00e$lR zeY4LWo%^^RvANFI^Yp^ion4VP> z^pVN0zw}_d4ZteO`*7CG(6YD)mDA${#l*HB>e4y;x)XAGY@OqSR2E? zz4`R5{PLRl82oL6zD^eZ=AO&K#V&jw#Dp#YCZN6gp)4-53UYh8w_u@=l02pbrXl(a z9x~)F+5X52@(;7{@oRjIgoxxiWXw_`l17sn?d?n-&uzK)wJ%$J4IVtW8CMX%5yMS? zMo1*Y4SWjo*cTNA0q|!n;>cf^;Wu;MXFbz~OovvL8tvwP2;Obk^{ zEtomW^cUN4#GUEc0g@)zi^vWQRPvJljqGrl_#*I=IU?_^LPlzXAXNsOcRphJ&nl$K zrwA)Ts_X_QXl819k%b`@^PYc*ec)Z(c2hKOdaHyG7m4yzlwS7_mFH99q^9Ote|s0o zcw2-NwqhBz3Z6%9!U|^N6%iN96G2~&0#?)B@NV%4U9UX)8sF!Bl^XC{DE8edk`Ds= zo*S)gU$(Zf_IXw>sbkpzw^;m-W8_`DOhse)zyr?y;|&cRVEvUH%}-Eth1P6beKxwn*QY{TJmhjnj>gw6QhWC!<1 z8-GJenjjarfU$A*1WCb;*3ph&H*72{_MwV7{qW(uJ9padOB|njs3X}YwOnsw$T*?f zqVR^OxRuHPKeKel@*Wp)!elWDz^}&jERrnbM`Z*RFT-d#DoqD7+A$arU<1md<;9I_ z^d{#3=_9$TARxE5KN98_$X^bO;}+iT10vQ!{5Hd;FN>_V{|28yvM17XG1jUcR_FMo z&_E4v6Ur8VD0BMJkGC@rz95mct>r~NUG603`)gZQgd_2sQY?TO7s?~Y1j>XVD6uc6rYd>gt{a! z4s0G7HjGqsn)8H=wx`|fGMg6AVTsxo?%o-Dp@rP$Fql}l5I<;_2;DX^Er|2k9P2a7 zqfdM@FGiG4q8=Ew>tG*BARa0K8RP=!6( zlG`)Fj&blQt`>K^&9WLL`%#C@jqz?Oo}6d%pQMJ;8(Ujjs)b*<4PmUtfwKnp_xfWO z!;3`9ZBI|-I<~juoP{~GmD7;W2Cu+(H@Ic6CmS%g6oZgBw zk{J-B{E6n@)(R=LKu$MzguZVHj17Atz74pL8-`ggy|&>(8E&pKlru_BoDTrJ`04?V zK1y8^TA76CziAAMS0QX745BF+xhGK2RCcS6OkP{7d*jo9(TXB2a!`*b=hmem#+|!# z31OW(fdT4}MROnGtkkGwIlfk|u1P49z+`ma z#h0+~^7j(4Fd?InhHW3&lACu#w{fD{G>u);n{WA0>9v34tmp#;Cq7}Fxa(}JtWE-M za)pFBOPD)K4ZA?n1PqEgLEkY)X4JeAjEhKIck^4}Lheu$i?6?a_wf`0VHJz=ieH($ ztdD)G?AmqmS{XC{PEk<`Vl`#CPRgS*X*cRd;aEVqxBbPI@1D>L94OE7v?HVd4w8$b z?Pv?01{Z+5MKw!sGn*P~=b^@0(~svuC_I}==jin)oZZaZaDU{&y~P8L8mk%<%aj-z)ZsPpB{9Ef^4z;e~}ZJl`|G1nxg z;Nw@t47JuEXcfj3ixLe7lI%v*j!CHEfGQwo z8VLXE0%Wlm7t}5QIN5k2*a4Mz7Q$a!)I@>=r+LgJz)P&;ZmiFZSRWzN>ZpCB6G3Gz zXBe0b2Xt!WtR1YNAnz;PB%Oi#ZHJ3+=B1>jf?YjS_T)(>upQ)U`5s8tlarGvv0@7+ zrP`Re0q}awv2WMSWh5fTEHywO*J)UMb*}0SKF<7itu->ZiK>--`T5)XRh%-Gtf;J{ z>c`~oq|?mXJ1|R%xxNrqh2pOTFrE!*40zkaqt<@;-W`0ocWW>tDS{oZE7YsBD0>i< z^Ne3`5h=uHIFjqsHlNAPy-0E9YfRRs13S}ePez4d;v#Qv}bkR ztm3QZXBF&w85L6vKZRy}2jGf{kak>Ereh(#4VTR|L#TUEi{Xg}!a(81WX^74I3hW3 zV%$L{MxQv5CdilXD0XpuGJV#DjuQ$!{8&_6(ILHXynwM#?)O-2)F?O9$Rr)9udjMf z_WF{>;u9nYQkCjxb)ZdD!?3QHVHAj3fav&aOpF}R*(#0Z@ws)=9}EeTDAog!$|}H& z-?2s5|4CW!w*nLhD#QWuw5(|!X*UYfh*26mAxV;D#1{vcs_O}JO-xF{q*Zhui7;|AfQSLUIg6y4JcmhHplLTm0&DFO zT&d1(n<=MjR(#c1?LBnRl>=EZ2k0o&yRj@jz>5S^{}zxX6fulMVrr@dXoQy9tCt}? za&u?6J8Q12OCyyTYH-W{P?g@*RR^%C>{Pzk|X;|`58XppJH(GcB$fe2(%kX=A~ljr<@ z(iS02U?T;xKl5!qALLDEN9orL5T61>55jL63wQoBtd=XMZyz}>vdmn>QG*VwVPd$h|eY?eeD7mEQ1|7S6FVe!SS?6#M10s0a}j%O!{&xQ;SCGL~dX;5|800xU`N(qsD$cuU$jf~7Y9&>xfMyoidvB*y zit+dO(b*P&9$k_<5s3WoYK473)>T+}2KYcoQ z6zkkMAKm{eW3cR|uUyCgP&e(Sj zX1S!$$hN<&>#^GBPv5&w;9Eif?f|IJx}#TF2#U42pCCSwGRE6mizOJ8gjcRv19>TT z6iLPO(Yn-u$)#jc9Lg!+tnefjuCCWN%-CjfFr!RwQGM*xd%$#x`Y0&W_lmgtGIs8M z?HOgyqXv3NhT4(-4DF|WA74CY^Bg&_RdY$3wQs*Dca%EvPE3T`Ta)4Hj5J523)44K zA(J;h5&RRXJxuIOvNLmO5lQVO#aHcOeSp6F zO@xss14I~lzYefQtDRt}o=6V}i9V{;_&!M>2~qtAd~P`nLxm?R;nFoX$RA0%ir$`B zevMzNcjcMh#>3-6&V+`D#mG0>$M~e$BH^5V3CR@9>Hfoq<=}!39w^Wqgk26Zq70mB zm;Q`P0_0w2k&UWrYCeW{7u5kP0bPq7hG{LDDZKN1fzJi>qZjv%^;uLs(4}vn4yUsd zlF3^L;FHvDsB1jp)2l?NpySsHQc(6?jKXqzx<7WIUvqxyY9X$yAFv53MJOY{tA)J( z#Z6f7MbL(a%b$JxdbmdTh4PZ;GiR2Gxp@Vyq4fic0)qjh(<>=C zxeQI`i8yvOcy!saf8@^ETie^$uUfs@4MxF2gdI~%r*w7yjLR~@4EWX|i!zkl^cq3y z=|v^0c1L-OT|X2Rm4J>yJ0t^w4IkQfyYDm4D->XX5iJvl0#FR&9VOmD(PC?Ax(mq{ zTiZj#8kIA*<_*>scR#maONBFT}Z^fu|_!nd#~p8m7oR z?oR`dcP^C8&2Q{HT38bE%8^iMctYu%>EZ;~lvNHt$(7Q5h-oY08@Q|6A5< z_1EapI~7%hAkp}@^p-oPeGlBt!s03E95LmFt@1d7z5xO1IMMU%guZ`kJTeen4@|W_NZAm1-a8#(l7@|gP&l>H_wU1u*ZMA1jDb7a{=XxHI z7Z$C$2E|w3s+u2+cABbGJ5WYuvTu{6d8{tPP9C+`1+EJnh=%Yf?R`cvoGOxi{0-8& ztR%03YT4Gt#+e10CEC7sYd#b1*_V4_Ghb8}IK9z+jcM61|EM2IvOORL zEI6TL_WIQ;m)l{|2&YP80ob2Gm-LkYRDKY#Arx{{NSqiyW7~gG`Skpq-mGi4q zx|5P4mCC$?K=yI>bFJ>!0TX z-U~8{#AQ(vzxj!!5s41vrxox;YI?(AQOUTeV|xBG^NuED>u#Vlhhvik1b!JVrU0SMgo&>? zzUd53NX3n*Q>;Zei2=M2v1l||)YL3xi!zM|AHP1%ntk5uSHQTa+sg77pGuzFaL+<^ zN>7EB-d|C7jYX~FjIiO5kI z8|&j4=W{2@j8zSS7Q<-fzs8RTE{Jcq9fn?$ZAfyJ>O*IagwC!RE$}7RKHj7w*vrJs z%o-wL;<=$p_!bx_s&IVjtg_L+gk<{wO3BLz>U-#ZV*84uL6*?e{k3ip0*%GAgLRTr z2rSleEmM7TbW#!a!)Wh+K(?G-e-IkKbsC?EUX?$wxKPWP7jo(i@|+}V>ruIf*gOaP z3Ydc?Oo`;X^ii0Dyh?7;>b>DYOqg!Z#+V|ELP*14BP7pKBmX0LezdV^Tl+J9@|;qC zu5FK)@k70h*QhA-Fdc_f%?3~k2+4CG#z=ET;suV(70h9xjssR2$S~6GSV^kxNh9~Z z_UaRWp5osBi_;h&R_V&-&+5q_T_dA4cWI~?4CPDd-T#o2ab-)dZCrN)5GeT-H@as% zX5y;dluP00D4R@>Eyt~llQ*@mta$pA*eeUujYx9V>~VQxf1oQ(#v5CIE~&o(Dary~ zmW;6aZCzkcSrsnchjF@VGk@A?$ATTzvY<$#BO^~zf?hQJCnWof^h$`VDSrU7kKzY# zB=i{Q$m%H{QYxTD)oa8Qim&QGjnQ&1ZLoGI=0&)nA@1n51_HoR!|1U| zfgmyf<0CN3wHrVmSDb)XNOd4*n~jX;k`dc+bZX20DtB ze-~v86xhc6&I-n5Jym#EGYDXf(I5|5pVHP0_eu*Asv9c?CH`&;x}`Uzh}1t^xUKbI z$uf+~R%{7k`Bo|tP)|d%0%wE}J_lR5Z0Y6I;jk%}iKJab+UWvu27peZBWNQxLgE#G zp*4g{61lG0ZEcoaegWHRz+_#iwVj)m+O zsK-*$(@V%r>A}lBL1_v^iNDj^NCSAQxN)w9C$Gga^C5cucM8oxV{--3h?+M$^HJa2-V3Jzm*S0t z$Y|I9MQ4N!;>(-0073qv4udY{Aa(1q`i8uXutfr0!ZrbgKl7{kYmhK!kW2NY(*%K| z3*oPE;gxG$q>`cx{fZCjHdYez5NOzoKQlhu(Oc2VR!xs#_N%F5%%xn?K!qBaT2 zo8$BsP~PmY2@-YeHg9<#OkYmRDU`lq6K>NuFUX>Mz2%o;3oI?;sT2B_fb98B!=?z? zJdFYDCc9Y{U!7+<->iP4lz%EXF}aB=!;m(2Q*h0DS$$*k6%sU~Rp2R>o>NBC4qR|0 ztQ%GbFJZL;X)|S49RNV9`nKjPn4bEvB{+4QT$E4o9Pv~BkWK@;T6aqHW$atLcoqk} zi$w%=qPvWAz9gEW(JO3#&D%&VQOI<1;W`+3@D&u~mVvjVqY*;nsB_`oQh+0ncuYj| z&v$XOE2%A8zHs4&HPFEAhCDFXQ_)2n)T7Q!S?{eocgl73l5DI!8s%W%+c=Od^~W#E zaru=}(|Kg-+)uEy9%{b=dC;Khi_SYm`^&~-O!$~zgc)^& zS=;&Vk^$!qHcnzP#oK7@Sy3l?P9%_mKKa}^6Yyf`MCd~qf=!tRLh0oZC!pR>paV=s zUJBTqg%&V&AcZ9Q|52WG2m_~TJ9|t04PQc^9Mv(GI)A8%;7{!s_Y_Ts<4g2`eDh94 z7?!~R*PxIZq>n3Ui7UfI+qV#xq=R!XG<~k-=~FxyUhut0*!cbipyc?J2EXqISW`LL z`z`>1Xh}{v9T)E4yvCoK!b0Fe9D`26UWn#>gN8=s-pPQkhTZDPe&cY5w> zx|OGLU$-$puTdDSizC)Rlt#I9V5b+k*jYRJU*vywWNoee4NT)lP=c5)IoS-d<_s-H z>Hh!fzu0xR=%4~?!TN5+SI0*=MERb9(r6C|b3~ZW7>>}kvkyJGBlVjv!%aezOyy|> zpfOf&)lhV_0n~mD%C8GEk`nkz`PY07V`6}@XC@%b_&t%aUnt?`V z{8B0$ilF)8xvHmM@pJcnMnh1Gm6RUmy^M7q>3TA8e3nT5d(4NX#w}!mu6RP!U8~7c zh)OCzZOnM}Cp|K->lS_^Cu2@b9&QQW=z{oy5Zb!Yv4R9b>Vy=+lg=cWTa1dviwzuIXpre+ zh$n-%qQ1VfooFv!97wh%)InFYK)jsl`K~mSQOeq@Fl{O6{-2zc{J5ESTGv!_L_kEi z_^m~Oy+{qyk*#_HhG8;y?h|MRFQD;m2@7xH^SJ4R6>B>e_Q$((Cp?2h;zMrF7W^M4 z4$?q}E#FrCrX>6yiO=s;o%SJibKVda`ThoSM}5{FN%S}-^0M{Qi5~kCf$apZ__idS zWgGFB{I&4GIiP8P>oNutp++TU6mYw2DfnM1)5(WHb?XBqXZzigUu#^@?k*SUlX^CB z`ZIamg}-!Q_wSRkmG!>d(QuzRmqGc z)&bRw(Q@8_;Kvc!gvtnT!zlXPa=~F1XC?=F}iGhV`qmmYQ2Hl9 zi4Em9(8Pm+&1ch=5+3!{-Du74M?N{+1qDf0gJKVKl+4eQf}VA1;sGRNC$cl;(aEoM zE*#ibn9q2i`o~13CsHN>G!4C%sV{C^eNN|#vl90sg<~2uA_po=ltFj<*nvBx{Mxhb z<}#?nvZJD+JS61z)#*bQB=y3PSL!v&)NSo7-Zcu#P_t$d@{apd@A4nhh5FGcH)k8I zfd(*u_iT}0k)LIl&MAl_wtjw@TfjYz89DOS)4Z>y(H)@@FGq+fNUVvM;I3=<^bMU% zsYJig^vEgJwENO)?(QE+d@@;8uW!h&I}qUDcDd`QNeA`#9BK=E_|Vo~J}uI_YAr@R z^g9#Ms+l9C+xX$2Z|ozXx0r-aZM|S9(Ix55-~3bG5o_`vC_@l@`<&IO4A4t3)z-K_ zFn_kQIb_|FnFBXw>qy}#8x)2!J!AO|3gu;|=lUV6uv{LaoR4_JZ*@Wj7KClo%s0u1N(Kd{1 zPiZS0$un`tx1XXF1>&mvdS?;%YvekopPky+*}Du3l>fT(swX6*pHYiD3L;y$O17<@ z&8(ywA?{xfa&#(TmBGzDE6#DADNmS@2ZJ^pq#J6{OjXx1QXp!6;lIc0&){ zTTC)wOB%+A2wZ6I9>Kzu`U3vmDU*%R?t?K7bbS!1B+xMH5ni<+PC{x6GXITdB&0S2 z`oJ+trT7~k&*AquV0*(%(27<8Ju+~ACcy-nkZ=S0E zNe7v*2wg77@SVooKE6jS$YWNhBwB0V=Hfjg{{^!%MyCOg93y7XoI$G%bKUn()j!&{ zo%($&nnuE8R~^n1%#d)O1}cw4O-R((+LEz)3GK>Le)h*mZAT}qn+n6^kH=sZDk?Ey zgtbN$9j}!~im-ccr+aYEprErNngeexIzXP!w1vsh8ey~&yGDcPapcNSMv|j^_s#?T zTKP|1YW$~v&_V{&by1?E<91Qe7|dj#8t2|Uer9KM5IGhh8@T5U@&YEz8f^+pxMN3C zY0c#|5oj|^1$}IH%C){bo1SLOJy92ZY+7ng%U_-^t}p4`yZ2ZrDsr^@6zq_A(*F7Z z`!up>oMYtXVkiaZZSwcTnnJYnMOu5@b;Yl;MDNaaPk_QG6aDr#Fk95^Sr(>I;DeO@ zBCRdJ$V?oQu=UW^GcF#mj|xD}7f@f$1gwxX=gF<_-Vwx&^lUkH1bUU()Ore1%MZ;t zEM~(bJOwE0+ZeYI+l+x0^f_UJfcj-2N_XHUx#nmai;I&J6luS5SFH0cw3I0oAk_f2 z%b_ZTq!2%0Zs>?WZV>^a0y)Q&^zwovU#X0)0j`1c8%fm}2p*rwmG1f4py13C3XBkB zMp$QJIM}y}H_e8aEfX_t;7-6PB7WDPaD(@9@xAhV!!aZ}1QWbcOee>;S-EL1HSNj2cDUc zdQW#mKOg_?IpolQ@2$XlI*}osIOsrz=bgAiDyATiMyx;D^DnRYgc4_sQV=o0}s0rT#PA zNsrMl4;nvJ8*@kP0%MzjwDLyJ&+lkHFNIza$`|~E4Wp4#5G*@88(oCb$!eRJuQ>$PiBN#~7aV0tiwXeMY`#2oED=wDq3K`61rZ1QU^iVxO6uK%x5JWQA# za9rwXU9fDK=NO|%{KXhNX1^h0OCWwYk2xxDDbI}%Lf{`DubX#*{QV1oJR-^FEW+i& zEYSo7e0(21XH6N*oV~Jw=UzhdN$^P?&PKb)H#HQ7+W=m)vWmn62}eaxAnD%b{TQW% zE1|yzSxd2zZxwD@tsGm-Z-P}+A~~fo6w3-|iCgEBFb`l}O<|Z9v@|WHr*^^|IzCq} ze|vJLLK*HhmH7@wXM8>(As=?3y#&7mFJFo{7k%_-Qns!`xJp-BimVmQ9Rk0WW(!`2 z^;`7uPBoB5Au(9xY?S_M1M!w5VuV?@&Jbldi>VVyX$aK*6se&`TgbLa8Vwdz2-62; zgY+Vj7#z~(u&JNaC-kURq%EIL0Qtf&4s8#%jwl7736%2~qloKAMsfSnAL{eY%|jEw zE*OPF)IePtQsU>J-pmrE=air5bX%OQqr#M+Ggt)40d;kg_y#t&5LO$6lsX+f!wlCK z*UqD!u}!=2C5G)IH`2zV`s2?kF?x=YF&bIJJ}Ni39SvIU?XT|X%n2p&^5iW){5@;4 zt)NED!NA`4h|vB!#w6rY2OdEORiqMO63j}j6j{98wxX=Q@mc1 z5bG`n8#)A@(eL@jZ1p`EJ{ZVV(3xjF!E(!)z3pD&;2en^W|&Mp?W=?(^-;D@V@W>sGZ zzWxGO+1IfwVRk>#`w=yZ^!p5XpX`Qxm*IV+{Lr5A=QHjm=_EWAPHNUn*^G5{4)|t@ z3OkG%=cwevBeXI`}cT=UTXTe^>#95E?o~Q_WC;`_}IoT?5bW zGVottW_BIF6o7yA*n0{z)ad3AF@+M;hU63gZOk=1@z@Z4;Q$RL`ePlD>IB*s+trs);9-69O5GY665HixL?9}k%gQkZ6$(W~V!sn&Oxt+--pgwOLvN3aCGTf-G)#P#B~La@=TPC zW5$nviaEEVhc|3SYD_(vmAC=7138K-s!MtX@+L<}pHIzwaIcINHw3`|KhkcnMZ&_V zj%^*c1=Oq?Op82g2R+c-drmtAt(!%}anC{g5?Q!r^q^;D43M{RTzHJLz&M-!!e;Lhw^a8t~ z35B+C_YxFlNc2juI=0|WHh;KkO!+8Glv{9{-G2RF$7p6bzgw{ep!@|Vm`z-w;3!eQ zHlh}a2l9FHG?oX4)#BHwl>#wyf}HvAqCrSc(0#KMba65iOtdNp==5s3qW^j|A&1~@ zKWe7X**EOhk`R_pQf9!RC{)+MXc))5K6DsLk;1S`8Sa5Bgc=EGU|7W~QjikZicXdU z#3oz~vWZTT)arkJTS*vk?%*~spr~e{`9dJC2N7G*ux&~3A0>HkAk{cbTw~J4!=#a3 zLlGocoOo&C6}wRRd)BI=sc8BWy01eW0S*zBD%7A}ofb6uK^i)5a3_FVp0lpaORz{T zs>D@+mk&P{ot>>qvu7x}0p6dC=DKcNKXNfbsO~M&M~uKgNx+l!LY~2JIvfQiuhL1% zLa6zkW#2Oaz5sD_2Z9kh8WV1A(9oiYkzT$uF^fh*QD(diBts335F@?s#Cdk@O7h@X zlVH8g_@1oY0fM-WjUw6{m*PG!6qb*~foYNq?%alix+sitN`^$e><7pZ>1aOXIbRKD zl>#72U|bpCj3~!O&h|x%cg_H6)#TJv_C+ZB_~S)HNMb={T($0Br1_PbzU4YvsL>^- zj24vwJi!5oR%m*VEF&c_8Z?OTUw}g?BErct-DJXYBx+XIg+AyXHS(|d5 znhdy`*~AqE^=hq!iBl6QJ@{(aV>x0HMQE;gA>V;95x75L9(6&6tC&G&NAd(}q9Dqg zMi`(3EBc}pf6D*|lWIvAf#Z z;9n_@Bs;$n9rC}_Y_oUT=tzn?<|`x!a| zP4Z*{m=4?V@pd&l@4?G{pYs;qSIiv>g*W;Vsy-+ zRJNBlBuocNlM72O7gC!*9ww3f@z_O8@EqkVkoB0HnGKSA!|(4VpeCN?m;5_z0 z*?f@nUg#dETX?(^cPu1OW{5H$No6`9M(lSvEW9#W!v>4x!lB|A3xv;tf?wbQyapj` z)8uP*@?GC+SYn!e0e?YCB5KQ06iO(D3m_#Ny@6~co32O-mRx@O^dB!JK|$)CCuCR< z;UuSZ>?hI;e~YYck3mnD5F@X^{z>UJ!DbsbA-a@ec%?@}x+w-CA_KEU#~EIM*x4`A zN^UR`On1W69PXS;es34D>E=wqf#HcGyP`CSdhqmDlZF;AO-Vn<85%)@4`?Bx7Eg5) zZyYXIJu$)R4X_bZ4Zx3|wH(pLgtRNQ>-P{tiA|tE8-~K#ed+=~g)8{;*cTW0j^8hS z2CAWEJbp%-6%n~8z^EyD*re42Xk+ip?}OG#1^z;o7A8n31&5V4VbG8vZlLmY4F5ty zEKTsB1|Y)w2*Sc2TOj8_6akCDQ2~^O9h)ZDF^uo(?y!-N)4p41{F*W~s?_lb%MfTX zCYP+F7Jou4>81BlrN$)udg+@*AT>$n$eN7tD^diaeeN@*X&}t9L}N0DScPm1w4#!* zz}pM5#Jr8-+h@{{2=t<@PAND9XoZB=ih->mEdQf4YOma6Gi(Qfr4d8LEEA?62-lqh z8j2z+K`wa&E~dGtcu~w=HKMkd3n53SIubOeiCeHf?mLljYf?ctx06*lbRO!UarB`Yz6$MWg0WRZ?I($+u1YU$%MT$A^u%Hi3aZ zrvLm16LugO3mzj0Gr*cdWh^=mHwyhop;Qlj$d_OzTlpD@?=L%<4hbhaXEBCBIn?)0L*J2Pl!8+u(X}EmGjeQ>g=w&O#c1^4;cM>} z;pw>I)F~Tw8cc~g)TrFt?@Szj!eN3d$E6=d+Fkd* zh+aZBXGT{UqHNL~0u#?flmVQ)0P4v~{9hWKK=WoOH+(n!%~fQf7Ea@{VFT+zKdfxiF0Wzv@a1VYcBc91lAFHnMVuv^qP&5yE z55jxtE`>)4z_L=#i@0SD5BeoC7_#FsOxB4<0{ZN}4S^dNwC3KBJ{8>+gmsdzk=7|s z>mC|~z>Xp%}kY6xFYV6g1m-v;DvzL1Da^vIsFIvK9^85L~Yl8qhWw4DN~5u zpZ>EgBCGu&33gBuy(m0hg+%r2*-(7ClFqngIkuQ?0iUid4Yvz!1aJW*dtm`I0uaQ* zng&JGj=pt4UtQ79%?>~=NWOW~fyf*h4Kn62raafoVW0Ke`*p!7mg?-YUi=l(x6)ZM zLId7J0EaY+rX`)4XQ(L;wWDK7`Zvf*&O;UUtjdPkz(9avaLSkaW73+Cm!^}RMsQ{* zDVNHGKSsfuNzHsCE`n!R4$9~FUS))KUr?~ms(c)N&?J412eow|t#qc9E8rVxIE+;3 zFC-p#looW4q*qvt0WS(@`ZHu~&sxsW0YR~~0D05}13IG&^Kv3mLtMdtRWG^CkC`jU zeT13eI6T4lR*%4kq+ur|=$kh+E$65hpvJbf4Wbv}_vfd@>B&=WhH@6OD>K*C8QM{? z+!x}27D44`&U!TNUG@$ANa|Unu=!!3qYdB_OwyX0+x>psg5}HCy)DSX4drZe<66sb zzum^r!yFH6H;vo$<|sAW(A<-_pfA-iXj%#ygol^@03Z^*KnLL;&1uRfwn7KzjC&3W z$TQT~MwqSR*V{7ln<&`;0q^;F8;$)zj}=?@x><&6wff`uqIYFzGX_s%4&2n9$aUyo zrpp`9S4myR@F%#zaA=IaUow3YOVa-OCeYZY9c~1SsNmJR5Tk{v2P{E)#aF6jsjIj_ zv~s^l1j6PyjMygVgtBY9xlwRiG=>n9$!QEQc^*#aFbuk;k&x6T$9IF5$O#*5@9GMm zd=UiS<%5m56EX=n=t6Sd6<0`ROE(q`pR#+0tUn+rcg&Wg*3-$zOzeVF(9T88=5U-e z`4~$S#!x~+v>dVyRx~&HZc-BdL06w5nbk|&BYopVz}s=dryK!A!jiacS4ey6i3)Fe7*FPZtSss63JT>C4K z;&AU0*eKOTdR*jxwS^MnM~`k4i#Y3m!qXw>^Mc`1Vt~y<>{ruy1eKf#X*H`^26Dlluv@ysC3KS+BI; zYZLWB)-+l%;vQm=ADWEa?(80%rSAr=m*Avw&>bjg*{P%wnARAS1FnpMv@{#)m4_li zb8bJw$A-&23hg6v)5qfyIJUuq232L3ZvPZ>2y5PrJmhPRC7~G*NW+#+r7K`=DG0AMC@^f}|7Ahy#0NbnKXWLzq-*ND)4~1I1}Y;qh~b zjbJxcQ6Tnz2OUTyU(pmck`Go~rSPTfkSJk5dJFW~@s?i#*Xsg~q$g_jZeUt8^AeL= ztE$itoky;+wFCkJ!m?psPW|~w;dnZhVGGeBPeWJ=!`DL2+|ya-?&hZLT9z2xtYQic z4~@raP$7@R7OTgJuONrXJBiO%hjT?Zb>^Ro_3XLGFqwA85t=SK1FAI7SGv3T5b!!g z+2X>T2uPj*9i_&e@ATM|RALRf8v@_g<@W)HdSv=;?*L_p zJ1`vd^z^d!=@zXwe}GqB*eQuEBNQ>s5nC8H<{JK^@*pxRqdl(< z{{Z#Th0DR$G=%wPjP|dEB91@>?`>5%eq*LvB8;^zhJBv0FA`(I>@gsp@Fz;+lo|d< zl#f~Zb3Qm1D}7OM=B0})@=Ff&pOL7{G`baN7n@{^g3(NPJoZSZUr$l z%?QFDK>khdHiSKOAd1-OuzOFz)vYl~ z@!e@2@zPIMBmx+TD;`H@tv3Hp($J5N`D`Rq>EQ#+kpwU+Icc?urzz$nsNo}#RxZGF zg9WEps7T6zYHNb=DOm}=MUhl#B5RT7IZ7*3u<(d;EO&E_kV{;3aD2udY|GK&4wUMD?mZP^W^0UPBoQ=QWte^sa(JL zarYrqC`PYxKf=(1K2D%yeCNkoVv6PbDj_eo`exA7U`4Ed7+Z`=qo*_f?X@ivE@QYJ zx-3fzr7?qrHE~BT9-KRa+-k{1p3b@?&DftI^Ef&Dz zRYCRnW2#s#!vqdD^rA|C6YDRCnD7X7ZuOjAq6v+`!=sZt<*n#n82MxM^-kSr0-*J- zOA%O+;A@CRua#6-{iRm~@>Q7qqLY?Q%iB!~O7IfACgd;f@b&bJVuA#p&E`z(9}nDu zzajhrqWrGIV+TU;dxy+ZcOHsnat{dHoiq3@jsJ)cDWps9E1fQBKvKu=5YR2}GNCd3 zpx<#7`ZQ_+g`>!GxZwxg!ia@!$O+I~U?`&dTThhC2r!5uGrKE!}s zHCG^>I{8{%xiSXSH94*AwoKN(#jMrst0fgP;2x9++=4izZDF?M5naVDwr zw+e!108m#iEK0r7z={VX_W zOuRIXC8h!J@`NNt=-X0LdWH06tSM0~!xax;7-p4t5kct~be`^Q%i;iD{-o38Pw>Tk z1{jin6NZgK35elW%q4)*810Wu6A~9f$FZ?NG^}+XcekKG%RdEDT6GQZ!~W1X*e>kBc_r@?SfhR`v(m?;^L z<8sh~VFrceiNw#V1v@&sO*kJnV-1uUZ82|6=Tc!wB!7TAMq*LU_=<8jH1x)QsUO+O zsLKF{-K;;@$j8S=-ml!M4F}-N=uR{CFM8l%cAq)(ufGt%*pFR!nu&4!Rzs=hT{1&# zHZIi;*s7@p|9Ss8kRC+Z<0fkumqiZvFX{@ylH7@2fS8PD&6=e@w0wHcx5u(tPDc6# zhpB&TG{e1QwP?{$#5N23&Bj0e28H1n8>?)T1ofz8XXzIVZ3l^HS)7_(zZAI@~pQz`CN6v?9+6J$E8y$wg=vqLr%G^yyE4oVD?xi+1Hu5MJ+fY}W9xa8Szv^^Sl7k0b#)jWP2q3M!yKI224MR0*D&hh zn)s|iVtAQ37;18QWzXyHXeHQ%6<3PW@S!!me+T0aIHCA>ECzFD22W`J zj9{dE4M51|tx_`hfPc;=8k__p(#QQp_*yiJ{p=h4Of zaJ;b|D@$OaWqr(!dB#X&=*OHGCSo@*o-7c{dlAFns2jNz9m z(RwU_Ca%*TJm@Z6UE zSfu_KL%2Bsn;CcV74AT%4?OCN-m60739cd=tvVMt=vk>8TIDP8(qMR30JS`O%vjjw(lCkaPwub=(nLf9|7E=x&KiZ zD|6}9A-lD^z|rgD^UiIeqt!|a`4S6xls;)U#-85B_Qv47I)1OfUewDLqwns8YSUMk zQ8&%~{`_M-uA+zMP!E`UXzZ?-m>AlW2>Ps%tx6B*FIV2$sklWJr9CacFo!nyq_Jeh zoksnZjG|}Zp+k8u8eh*&Vxsq=Pw6a@%1x>`QZV`bs|-tpndlq@&B;GIi>6~^qX)63 zeFz&T5_9YrYKCEWtC#Sp@#Q27+>86>Vct>on z0S-SI#+XHsBkVgDn<6AEd8xP`Hccb>!i8|qs)=~!v41~vV8ZtE*b?S+6I9k;74w<9 zf4tCj-i)VocC0@k0Np_liNX_<0jwVJ=+PtCKIb@jKn{M3#+u479IN4z-E8@;EsUB9j4$Kf2148(OwYJu&I^& zt)cJ9M|?Pivk^Da2d~A^B1k>~mtn*8A7G7K7sq_yLUxx;;o0LCPs4N5qz8_WoX(4R3%uoJhyW)K?$YnXW9chmZcoE#w-3j0xt7WOfn(+ksq!u{wy|8dt1&#-E z=M`G~_5dTH!zDp}+L7Ka`tfB;3;HAVAvC{OW=gHsEF736ZLCv)wM3sIFnQ}k_A}}e z4_FAYl}r3hr{7Qy5qoWfJs-4f>c{Jo6t;A}q-SRHpZs6{p2#8Q^@Q}f!f%W|}T{Wg)sy8*e-VVz8ohFt_HS_E5m5!j&H{vK+q zy$D3eSGe=ZbMwE0CVMpZI!X?;o$k8uMgt#=zjYX`9Q!W2j!xUW0T|esNh@Q>#h(R9 zHG!WCFop$iSj@N4SQ#yZZ#_X~xS-aVSwLmsz&A{z+3d57p=fc{U_a;~XCwRp5@b^r+ zBf$I8sw#Y2-r?4xh+RMM*U?C2EcXda+Wa~4a++n2eQF&n$h%xAX!5^o|CAU0Dsk~+DP8(v zZTJ5;dlRrKtG507Mob^eA=6YGzy=j_Ai)t4cIA*WS~&*>BA8Q-0ikRgoiW3CBF&*k zjYQN`R4P#fMbvW2lvET`6Oj}g;Qu?<26~?Nd%y4aAKyMY%G~$9?{%+rt!p^1^Saj1 zdUSQ_!=2KT&Fh;xF+;mcW~l95T-fu`E6drluSUPY8e#$bUpM+N?PJNq{ahTu6cV0T z(qvC#kj+ay%S(M{#!;tJJPsnO^pu|BGZAo}=Chx9u5em=>x>Y88?e zi=|%t$w16jo^<1j(v8NsG4H;!KS2QwLZsfkJJY(rPm+j(5WC%B{s*;GW+HlL1$$dK zIMP#btE4wN8?AUQ7e6MmmM{9VJzx$CANG`N;MEv5Oy`23pU1LkxgdiS?WS+P?H+2y zJ+IYsJm!VmxRo-4r_~Vo3jHB^@cp8HzW<{}i_&3)eF@y!s&3u7dPE~>uOf}YMzq8E zw;gX(4$)yP6L$~eMVfC1UU?a?Yd`OP-Y#d?jHi4O)VF?tfon4SYelVQ(&x$kbIuDJ z)mBfIv*f0r&EBt_%Z;dI#kDB{B1)n18rSc?uKDNnzfV$3#7Qj!c=lMGj=3%D#9AI5 z*FZx=1-OT@BEus%xvVX@g-Qodfx-!_FnvFl(mKq#7j``@B}|Ifbo0_!XGK#Fzf#64HS+Vi!5& zqu_OBYXUV{Y}L$+vQbYA$c?)oy)|e6)Rc%MLLA-2OByh>8lwMYjd1_JxI8(5GwK6Y zf;RE})fv*4c?!+1N?o9-ti>ryTLlNvWaWQ+Kl13(FZ=ipaA=IIOG!l!Z{8(|{sJ4w zXYdanyeA7wU>Fv>dvaXwHnYQqjN=6R69=M;Cx4#6d0#6B1Gotown3=n)?QdTuubWoMXYnV=&PB&Ln5G^i&)%W# z&BzXqR?3b6RP}qD`vWs|YIpA~*tk}Zkm|G!^XIJRmcH*{lLzmaeB;2{`3UyVU!1Hi zSMl8QPPXbmXMLKucU)iV)n2Q-+ZZfjoEIgh1BOjJ(r6n=>CUjH zFVB2w{!C(pPV_EXT2#~Wd=J(~tBAa-?fGUcIowvmlkGn+qbUt6{}HA7w-w7)eKRdp z%>Bb@X5lSuwENwot2(xWSo?V$&k=8K*>H$~vrk4GyRAmN&)n~@OuwfyUJWrJ zg40{<%5S&Pa_^u}gxPC0z2IlJuDn$coUI8U7PGyrIK}YR`87!N%t}6SlLKAXS}OJ*;l$VE&13syO(6Gk z7$!$-##56R#6jX$G>88OKpXP~3smiR>-!ucoBES8Ut3$%O0~3Q66Iigsdg;~3av)Z zg;R8pLPWnT+S>*;I7-5PvRf8v|@x6XN0Mdc_K=-j|s&`)kc z$!+9p_%G%FgV;V@LWD8lB&?s*FDxv~{e1CnR_X>#4d;Pgk*tvYPa*44Kf37NnqV%z z(bvg7*Jw;LKTV@=x)u%G7QHr`&V25F9$2p?odXGGCym_hLiM$it+*0U28=KK(J)R<5#K-KW0fR|0ZF05>Rt6P4 z^DLn>{;+$0LIr*knA;xX-Q%*~2*8>tchP#-#Kcq{%AjX?TlV9307zJPmiOy$X#0EbXYZK2;P&t zdo)^g1SM{s5!NLL>%R(po_V|`DC$RLJ5K!a3)651v~WI}xZ^4(_qRAD>fyj&?#>$@ z^#&Rs(EvG#@+7K17oJ?)bZ7DvP{El8ivEtjG3+_~_REAIy+W-tO~>*5zi=+bPx%`y ztHm{WLS{-{FITO=FC~B0Vn7AsPA!QAp7(axsfItZ8Qkcl{8s(&tQp(b(sP(l2eSDe zzpfd60kEkRwJDQZHr1{q)8w(rDRn78f%I808}kJD{sOYGby%cC=4--6jTti+Drk#UJx|g(=u{Q6Hdw6|DvB zsOX)~;AL<%k+XY&%_YGoW#%^zDi;Hbq%DMtUlF5^g@j**B@;uBtTH`Fz4l?+Tbx=` z&Pv>iZkIihTy~XQUPEpDT`@1$CFR+0jT*}QE#0YL%rD#UbPqxQ7HAa{{dsw7_Qx{n ziEi5Pw5UT3j~0dy`ymB0gOivO);q$BMDq_Y{jS)Zt7=-&&6vX68e3;$CSr8-TY?b8Mk9)Pcqz^Rg8u)4_wwNxU2VTgPTpxGU%Tpc+PC8 zNc+sNNxg3&LB;p`f59elf8J;TIeIS=qZNGkS!EwVW1Mo(9bL47_DvTL1pGN@^wu4h zH?5mLn}PR5*kWJ)=V2vp#}A1|Y9N$2Zecr)cWuCFejAqXMn~lr+8z-O)pVIr@$p{y z3Tbl`)P1-68sL#VyYZhuna13om#;YU=;}@#NeY~DNgMKYKyG`;_UnkQdGRj1!lU?2 z>#$1fm4^4^9%fG0+8n&uAUEQ(fBBFL-@UZ;sQzqW&%!ak+&#C%n{(i_o+E@yTaE`1 zUE#Itd%e6Xr=9m`-L4&RQ&dwVD7p9{^grVi<1RRBS_o|mk~HS`2MR#)d7S$*Yq#bl z#$1pD@U+w`RMA3a1q}o5d(D#LwSBOKR{%`_H42sxBF*%s?DTUZ5%PDcR}W9Vo_+7B z7*tOiXgw*DE5sdzOxdvr>fb@~TGbKk=O95w&EqhK^?+kzZMZ?5%e&@A6h{8IPRh{W z1#!K|+|XR-@@$C9oz{MM=i*(cnysNnod_EFQ2SALRH>cv6ni4^lOij;h>O@y5P0SDJ=~&?+X0) zm^;(%e6)@D;oyYB4QdnFg|}|gW<54B?sQgbGdP{r<7DBkMQK$qwgeN0n>{S3YxJ6w)grPwvp;IFaaR^P|Llyp5w0L z>PJ7mdlz+sGh#g*N5n-X$e{un8#DkK7B|_R{ey&P>{uo&jo@%$#xhQ;jLU&W>g_xtjVyF6vd;%l2yv+`hW+qr25)_K_$O5^ zGhH(wb8hsbY*_(FIcao~*BiVt=X-=JmX@zKIivNOP^W~yfDLA>bp&2ye4fZ7u< z1h1Rdb~Yy^y`q3^4OE_{+5y1I_uXF1>X|q&O94Y?WduS`6ZX|br+vtv4$%hcvfMCQ zuB``l>5?*=9vh#~cK)ecR7fJ02vtxnQ-El?Fr-_b;Ova=$hEeFw)| zZG7t*W_ZCnAQ%&XpAO@!uUHNK_8tl2*QrhLl^cCfO|%gVf3t{j5VBU;`|kMr8P~6x z^qs$Pb>u6nyv81Db7t=EQ-33-_xyuA**p$&0@=4xXVM9yHEj%P>%EgW4dI516}LsU zi(oM;eMd+ZroSfq<*weL0kogooAhZp|1fI!yRDpZdN7*ERzVEXZO7XF)|uL);|-jx z5UqN7bYtLmEu3SJh_9O$?~EbsFqqqWqyWUYD%QitHu)&nTZcIJ3NmTyiv8o%O+fp-GUr%+OlP?Hb5tmFe3>{ zlt`FE_qcSy5|V7wC1a<9;eZ+wKuMsIs}W6d|jpL{RR(qftE6dYuk5nCT*a3 zs-%@qxjtAP1~1q9dV)Xn%|2Em9jiP~(^a=#J)j>e>RTF?wB>g{i-dy)mpU08Hw~SLSzYiRs&h?`F?Fjm&Fid$&FJ zG95~)Ye}?fYvs8&jIQ_m{vo6B3{Wq|R;T|&y!EVfpSN>tEd9sb8~0i&oH(;F?oklj z%M%;>u8}w%UE}8`0Y4#kWI?j?{_}bJv+ly8IwUoa5%Tl(!S??aj=#K}=D=erKT?neHOQlo!8;l$T(R74~8U|sgrQt)Lm)`VN_ z0Fh_wP1~LiTep-$u%cZFd1X}X+OK0H0&?ZOC|qBaeuyZeCglvc7qOr2o^<^X)$*5N zCv|57ET|2{)@N>=Rxj>6H*&=f#EvJuEZb|^wyDp!=KktE_14lpf!}W1*2;JaEt}DY zt8WwgLjS-(H<}d`71DietuWd;uMW3qFW<$3SRZQHKi0m;RJc~DVD4h(hC-;O#%FF> zkD|4?l<$Re73k3PB)=fqp1#trG5bz*;c z*Ywvw^9?D2e0}dwd-h2dLuvgjxKKAL#f9x-%bb8i9lsovwU7ckSBm;ypIg6!=YYW> zi}EYmD%A*Y-fl*>jy2q@ns3UbcWSeI-A>Kn+Gi+}( z&DCC71@`lnhcqgY{3OYHz}r<&_U zVwvw(RG_E!ilo9Im_n3!tEQfBx*B>N1~fAWkGq_FgU&ByHXbl!)cUg&NJ>TzKb zlNHj-_WFp`y7JMbM*+8RP48mYB)lQQjO@x$l^fKuVuQ*4lW(7I!_lP4I4i@agoE1>o*FR=#6TfS_edAFEYQ{i0f9W;ev4= zS`n&gbpo|I@H^sKY}tAK{cUW<4PLf>q=iOc={sSgt&pwIP0&e3M+q#$7nd^>HJ>TA zO!6Qu<@2fy>N-4@wd%^BatBr;Q)T(m=jJEj5|qX_p@^q8V%|Nv9IRT+7SUCvAZ+)M zbXk~%Sps~;FVfC~;WK|;+w)R}&%zs!;Y1n=Ib*T5l40J?iK#8g z<;bwTR^T7Z>>SxSm;)~II20)138pP25r16jT|q{uy_O3s9*%`YFZ83EOYI<@t(R`T zPC0yvFY6Nn1p9C*AJXCe7K8RN$f3Q~y@*QyPKX4GI3LciUOui4ZJi_o0YFQ4~oIkO<*?lufLq zHE=6{@IuA z+<0>{Z_BM7ic3 zvbFEPO$_GHZZqW;DomLCHq?euZ4$}8mi&a>2GQzpOM?A+4Hg;QR>lhZwXz7 z$l}wpVe94vq3)=4PSS(}s99H!fJ+O+Ugfm^v;sTIb%-q%PDpmD*qOuQG)(vJ306{Y zQ_V`_GY(1&>&HsR&D4s0qqx9YJPSvB{kTQ%449>8R{NypEJ}n^g7ipm!Ry)6d9HnCNl{qc>uw$n78WB zv`ipk!an=kw5&L|nf=jJ^I!Xj#b0HI5dgB?0@uEz0F&9 z;_u3{g%xTw7YOc(*dKI|r~;4Ra&0;H!OvBK=d{>Krk&4l7fo0)Uo7UF?xB_Iyh{3} z$7*FR`LeL=ORD5-4zpy)WgjIjNF&31se9+w-sZx^fJq`!*m{}}Zs^z@?~M8W#|oNq zG%vIVaXRda2aQ_4C;sTE6ky7)Yvg!8;CVtAd3W*^q)(S z$Ud8uY zWKG)n75rFjExlSxrpt-x>c|!8K@w7GBG@(?Xj=1K%mevDXs5M^znU@4=AbW7EsbFYlV1kQ-Ui|F4p%+7G=iu7Sy1CSP|f&0rUw@DHv| z-0c{p?;9mQJ9F;+&0B-EA8Xr_Tc4ys=2@Z<2|SB0dQC@C_gOb9*K14QmbS2Dk_Kv$ z*5Q=2TV)kBS|Ta%B_`oxk4LwJb(5VfpX)(FZyuGuexO$;6w56&kvZ1+uH<-jsDtVM)M8)a^(p5=`#hrX!}GXg^tSUude?=veOA( zTi@I|P+W8ZuiLz}JwY>``V|eKHrB8Lg9shwJ6CP53@^7GV{SWKe@U?2Zk1EP(@O#( zM@3N~0vyZ7y{CE4ItT>@6%eN2X`V7)1RJ^_+?*t?ycOF?V{mn>{-6r0yr<0Wx2|gn z1e#|N?rAtCtayUBg<+wiw`}Wri~V?`vhA6u>m4r{mL<&*F6W@T99JIILMCq4&Zac- zl#9I<6`jE=KlrJVz{;}#aD;Ds3{NL+75d8d8y$xF%4uo^gB9b@&2cBg-%4D!JvDdI}vb}+zHPT)&ccOK1z$b*xM!$r5q;8eU?1+yC!rovhK-#!1%N0 zoNqqv zqcpQqJ;$8=J{3&4vaREz;`oTlu0HMMPg=Gk*ikF7WZfbXlrw=!>dJ2Va0|Wta2xpa za14A5%=x?21hRms+ey(Jq#yI;?|-h^6DKzL%plG%Lr=RmG(%(m+wKk`uX9CADRMa7 zsFJ|3zzrr2t|JEo@`GKHczd`(E^IRzAYH8lM_*eS{Nj>yy+GDmmuPW+h21uL>(2A9 zFy^Pk&It<^{;TouM%4!q42YgG8{DtCqIkj<+h0+u*ablDv$>%~7l< zUSUmOTwd=6K2&8FPpC}pFKA;Vf!>>!f!>b5+86$c%(o|Jas_P|!y9&6((+wJK3$~q zGP_PC(8>9IFNm*y5c%ht>$=XH%}&gC>sOxrlQ0Fv0mG0zrP%bEj% z_94RgE40O*&s=F8-6Mqr30u0G`clln0Yk?w;!U4>No(mW48!>JPVN)*=Nf(5zd-R` zE#)gT;I%ZGjA;+*a+zHEEU9BXQ#$2*GKJz#l+^cjUQiv;nI&owZT{S7)G64_zb3~# zJu6-VD6(Oypzz+52kj7rI>vWi&B3_13fy3&@+#H{0_4>xyO+2U%M)QKe_W0Z?(CUidlT=;0s` zLeOTi{}karPc!tOxo&>GoEW2V&NZ6xCytz4izQ%(x%|nAVhYSi>i#td>Z~?$^IbyU z8uwjYU-c$qwx!h44y$1XD{fYQjMYqzu4<%-Rjl430j;Es6HKaIK02wUxTD%xi%-3> zdCPMgU(}Zbr_`YI>kq(D>qwvJ755vbsrG?_E?P$FtJZQbg@Ol9?Ug}&@W1CjKVT5~ z$gDsPaC#Os9Ygl5EoxW-bo?AT_%f-qkA~4?VH+LvB|&o~L5tray!LiVzP=?XFU>rb zOp%=ao-E_D)vFI3v#pCN9_}ibg}ksDHKAEezf$i~L5Yd60^g^CasG`{8xLz}Z&WPy zu1eZ+h_s*f01UlWa>-CjxgJHGD_O%kRBqtiT6kcFmAh!ql$*8i3+4%mY5V)+Q(R_q zxxoffj;bGY61AiBV-xL%AkS|Le4eqkiYcX7?TQ$`eDtG34PdsYdg+kro+M(td;tss z3){wq7EuXjq{T^kr2UZf@iUiiY+Q4H-V|nW+phzLrjUoMOQV$8;QFkLJ>ICHuN6aP z{^-}$DYNa=v+sRjo=J7fOxm_+V|xx)7DbcRPUZcf`n;t#$l4aXm(1avNEoHib9F{GthL~Mf#z#LI`uO3Q1AQXtE#hOqMAq=G<`TfhcZb>z0DGexQL)=^Cet zZI@ZjIK7xUyTm(~Dsa&yl)XgMZJUjxoY=5pTwQWRA;u#P*@7c3`=Uyg%i4Wfg(l#F z_`ufpbE|f^x?nQ3s8-tBEtkweX&n+fs!qqLW44e*6z+3gUgvNZ91E^`w)!@?k)%kf zo4pOc48f0k*KCg;0YqvDK5#tw8+L_6wSelNS~%{~>R|)5%ptF0=N(V&ENl_eb{D}* z!BW+0;9YQ>L(Yl{n>@?n0==vyAt3+EJ~uskVk;B_l^sRZC5d!&{{~PgwI22)`3w-k zfjc+UxMtb8_r7SL1m|pHTa zkeFC&fv`@#bFq_nr{QQLO3*0 z5OX;DW9BfcnF%Vm>w@Z+9$kEJnPRONYKeW(mRs2v{%>o?2Cij9z%5+n!fBgpejvGG zOt|nN1hS@RtI12wqAG&myHf3i=h}HIYQZozHuPQNsxTk5&_yDX+sFYA@hX*|A%oR+ zJ;*a%IfZ7fRFTPOn3*T(`6bS&SisoIyA1;gX#mT;kFwaRve<& zgBuN8j;zd6BimbCzd3gsqmG zQvbu%g*~Nh3lyPd9~2LJK!HbnQl(RnE%Eil8#tvK`-=)<8=wInMJRS$W-eklBw|C! zjTZvPTb?&MUMlRPBCl;|3iDOm+_HCB&;iXb&h zUG(TcamN9G)3SGZY=R!!7_ZW}FQST-=uIoGm*}^S+0BzG6rYeBPh-c8<%*dbyN?o9 zBOIU3E4k*rsx~npLhKfa)`mW->IyG5!axvKQwz3G`D>xi0-Mb(AJ2hoW8VS@Vl~p4 zM{>kEE8U~{Nj{)0I@lCurAbcEKcj`zo1Y32FB$4{^4@6#&_#UJ6JLK4{i(tTwA`Fx zZ#>X_sE&gW{hs$LJkr-JY4SkT(m57<(^f(X3O)NC6i&HXzcV(?F$;-1FHB4~vV!?F zvNC*`7R(H}%P4R}Q*wKn+m}x7R88-RLZyvVnz$wLWDoPhxGn%HCG%GoA4__M)ZXjD z?AYpfVc_K@Z&Xv0Pw&c}Ws_eLYWjbmC{lUYR%li8$jn#DHcZW5My?oJi=w1qw(&?iuoy<^iz#!Glq>k+Ekqh zqu?6t1q{5Q>}^t4NVj}sZh zX$u%6R&1x&21~gBd1wcj?+?+wIzw>wWpM3xm7oYU@jV*DzjT7mrxKYo5J^Ff|3y%N z{K_HJ2Q>!Q*C$NaRx{NLb2jI*a5W=(t@i2A$+@~Hk|xE$MfRzt_(kes>#LMf2rRk+ zr)R#1520CaK@ce^Q00cI5jL77{SUO~EX5cKbWG)-7r7Z&#eMYT+od}%PW?mctQeEf zeHaHyitM?1hKJUW(11!@GjGFP)c<~)5~rwLQ~TypP?r)kGiPio(UPL(33C)no}FxB z)K1RnWQ4hq?S)eHl05JSIiA3+GhwiFgzLV1^^98DtojI`O|Gr{W_{wlZDfkNLVk^` zAhtSRyO$UDPrJ836=grr_c!=d?{@QuxnAhxyjA+*KL(xkmg2Ykn`bL?a;+P^M6JiSYmZ7)~yu_v@8D`9w3 zLUfc<=cqNgOO`$AHvnX@4puo)nVIbD-t!JeB0kQl=%>U4T`5OKRyaSSubUoR_zU5> zEHaUvE28VTH{IE4V{f`WrdLbvzMy|-5=61DsKLsJ;LJ+H+RiOQtPM$`vd~gpJ;HWbm$7R&||-&HK8%>8lNeIo+HkfOlsI$cmY!{pryb)f@(1Ut9>zcJe|)jxf_UhvPCFcrn)`&JyL};e$JC@ODhWYo3ah**fAt5S7W9 zPU#!{@D%u&QP~UH`JU3V6L$#d5EW40P*@3v7TIO@wBU>PIR^b3k;KsU|9m;9t$<1~ zq$*fhUJ7|d3f_X6U@jYerLkWW>!$|r3(!*#eLv*i_$u>X0?ApPP?W5z^Dq*_&*^Zv zxeh$is^02@tmO6_$PHP%;VH+hpuKaeM#|F}g$?~ni?(Gfe^8#Z3myrsfTIxZP?I56 zT*zsfh=%7KX%Z~{4&Q}*E0mF!85FYU9V~?@M71ZWt}$%4`0RA)aJ^Jq^Z@&0J7>59 z1^~e+HlW|G5Jp?_%-@t#<{j^Hu%8{v9V1ptmcG;q}>U!BKBIe&<7?=r14XAx!KF4%i1 zYEztS98aXi*r$@2|9<6sphHnfO6=;0LqJBgV6Bs3uwvzXE@+2&vF~gH_8Lw=LCJAeo=jx@6EoYZXuuAqJAnO);Ag+IP~IG7oi=hbMm6pW+Z)`3@>>+WxZj$%AC zC3AFLD0MUUn!*G2kZQ==KnhL#0!p`>CHE?K+26046`LrJouY-BIJVOfI0HvF98Ur> znBsq?IPuGO2EN-y=!XFqSb*;BF~r6dM7}it`wKyk6XS)M$uBrue^M{q>3!*b;9G(; zYmIp&0A%}pf!sA3_nIkEB+FEDz3?@eJAs!3hJ8^j_9XfYb#DTaDzwgPWG|ziaYdd~ zv}O;CaqSdDYl>|ge7~^?BL4FlUNIsYLVapHw2bQ$pha{M;Kg8n1Y9i;D@6u|QHf7! z<;f@(eh9Ha4BL9mwkG!1fYm_1tFQuEXNlox3t%X5uhMiWCY&}+Yw1m-Ezoc(Zm{Nn z*|ZyTVea?Yc05Xh;t3eyeyN*@k=oJw|Fm)}{6$tzW5byW+k0b4i5WMEs>M~fNqIqn z>9Lrd_ETH%4X?G|Xq;xqOwEf3pi5t$yPcyTLiJ^NZ~rA;E+{S))h1_VHH>G#{`JXA zRu}zI`6{G!>Lj4UgRKtNSAleMRemo}5b5r!G@`hWhLXZ6B<@y-L|4T$)XQ)evjiIF zgd^D#O@|6F`g(X-cvgwCKoVNe5B+|Lj{48b>rxK-_(tF8*(KX$z_-LrOnnFG2K=iM zH%7O<`!J@spjz~Hl))tJQqek*H^U#cCz*%WYyZJ;Veu+^V5RM~I+7?990J*$l1dpe zGe3Z@4^3Pxtd)r#G}72~Kv&TZaDL$uv7vvZmcdk|1Hf+AhEa?~z0oLsQZPhnhE7>2 zJ(_KeWkCk@kv9#VeO*#c zZ3yU=gI$A|!so zng3J1&d>Ctp-`TDq4l@HrbStO0jsxiHE5Aq@gBz464M~@1@l^xn`x?!xU^FbG9iq8uE0#a|C|575Pyw`}gq*OT53u5Rp zCZKW$lIxf010rQ$iYjdv*%S@;4q!|_KySFx#ILYBa^pE%UKlFX*b^Tc@KoMMo+;6j9 z*#-)RLEP1$<@{go)9LSDRH(>k7j%>0-jO;8s0v5m2XX^wD);IFUk#O*m0E2^$#U5W z2a|}$)pK`}1-Jlhm5{G^B~D;i(X7f=>Rzg|#N_7AE(56CWo5s-2{tYp2*$rdFX5z@ z_*m7&O{|7L>&cN)B_)|%dpQN3PyGQC#Xmq_4$%Qfs@oCMQ*=<8?yv^2YAqBypR)Z{ zE%)S@^4(-DQe@jYxGN;dpIC5cu8G+YeH*<{8`Z!PZ` zQC5`u&%^M}O}iekFKrPTW$7g|&!0b!o9MYk{fhM0idHQDXB~e3h^4qte1^dIwQ7Fa zH}QY`y6kQK-yiV*>ypwLR`HR*9lMDho>E&Wk<&s+2Z-+fA75S3r28ti#HaN}Fye-5 z1$3zlD|Ez1j)fDh6iX@3|HmaNc+q zsT+oSHF9oz!jx!syk#}LY6G(KLrO}dZPoS6r_2lEJlRjSiY|JrymfPGG}y%Acr%Zx z_6KDn$7v{K{zF7qY!44hZb3O|!l$yI$0hOApjWHrNbM5k44M4q)AB*iJ)n$*Y`T9r z<#be9!#4A8sQbsUP7B70Fj#-m(N<{JSUY7;N@l4@U5-*YGfeqZx9Hm%Ltg%{xIJjE z=R^TjDX=z06O=|T$*HjDgqxhmTGEfm{+t&8xC&aBCA$wJ4mlj%>+{Q(i<>w#T%kNr z0hwSdfNjL4u4Ns|pq&*oLQ?UnZ z)vS|q7ny`}6FD<11+u3G*)<8se?saDU#O}@$^lJm@1;Ifb3FF9H*pM(d1Qszw2!kA zu6RTj_EZ59GdtoaP15U_Vh@M1w_Q_0Rrwe7CUOzI%Ed9(&*8@?cg>8YZc^4(X3E$z z9(Ghkk_L4+`(DMqufIWW3Cnh4DE+2HXb|_b1_i*XY5ApJw-n_Hq&z!v)v{Nq{4U7& zaDNR#>~HTxzfO}4e%evRM&QUm!ws)cnitHeH$}g@T51+#>pq%(6e>zkNhZmufXE6x z><4ZwR)W5#2V!m6zj@enEdCr8xOq{<0JfA?t*`U$giq- z_jYb10CoKh$nJCKL(qZd0G_{QW~Tmo<|(1ffIyuE;Rneg3n>T;WAGwX zAEpMW)YFXnM*SE10bFF*X2~p1_y`Z|iqfGBB5J*6ie!YVcup*0wqE0q>hoyv-z&7C zvy{4NfQ|peI=^ z$TIYJ9qQ>Y;P4xjN0>5kx*cRG=umw=`+3MW)Sb-t{?l+TwA%=nhz!Z#n?6r7=1P;- zT%+CZXvt>{YAIqZg$$iB0Q^E>gMIA-Uf`gDw#gMd54!!ui&I_FH;C}w@NUan-(Mho zy+d3Ex$Z2__mz3liH=Y5PnjZ=8I^@6xVs|Wch|W+aaY|8zW9*aa;jl zl{DF~t$3gMXhN(MA{)F#tKeybBw4Lam`$nO<&A4w-PdS2}D8LVWgPPThx4$Jx7yVF&oPmv6n2(+#-Kf_BQ6m~I<*fk3@Aw{l#; z#u^LyJyW}-qoJF1{v3i?6Z(#6l1NX$b|UC1c}Rj>?)Vx!h1mlLTuxR>{odgyou{bj zEt9A#@zjWtC}l`Xy8ND|$Bn>74c8nqG)SX6$liUCJ;maU(R@D+F@ z+}55zJT!X%(9k-vp2%{n{E;W>AV#arpG)4zc482H&0tKO4Xof~Q59=nd+qsZ?rsiV zZQ?dT6|Mk{D0+AA@th}CpPhB$!Ub%tmByIe-!GYNpBmMy+cy>SaIhLIL~FKE8PC(; zQ}yhzOoRU~#u?j61F<_PFMLt|#ZBd{9vQTwa6vKybx|W-1Yuxt9~_})TEpw4YNDDfcJ6QwLRrnY15}+5pM^O%7Ed*0R#GRCR}D_Y``>^SVRGT2a!R%P{d~ z(~T=GN~me#Dm8MTQD})Fk4+4Ge7Ux-AMTHNadecGIZ??|M?XZXM*upWysi|P?tM)P z;aUxtfSH~GF=+JBnmP0gKD}kI zw3~FIJwz~bMYpIA)F*|lH{v8#wZ1Y!%=ieif_Ng*TDy~fV5oG&&;@>=l{w!)jbl^E2s7##C0#uh4<(ec&c}#oA_CG$a2aswT45!&N zO^{Q{|8Mx`l2h@42XI;4>nXow_z!ws>AL@0)p;s?Ip< z;sh^vk}BC!Lcb9eg*A7GIDihwZ8R0Dr(yS0R?#G@wee{4lX9KUH+|6!^2SgD(8 z4#Hg2oQ_IjGWLMrQYkEsd!=1B#)Y9B`#5M_pf+jU;Cg*t*g+~4@oQjFXXJDj~ zhsD1^uW$rt&mkbQm6NcBWP}=?c7nF&K7kl2eTjF(W2v?DeACzl1No74@yE zhlKm6wlwnL>*^%r=)ha^EZVn$gApD#k9H2Os+pC=zoyfQCeSupEi}HBKAn1g)W*rz zZno*txr_Hnk`lLjW^JRva^fywnud~Ns#M~pQTR8?bQ;oa2-U-ymi4ZJOF6N_?@j6K zr%D5MIlDz&CDA8wfd{7FP?lI7^YkAVQ8HB;$I_FYtd3N~xf?U!7jM=nwj~neUsHAi zBOR>o>$f3!Sh6>*E@PAHsAyToO&WcQ7*MUPHwrj$%T~b1X_$W!vhN zrv?-#$%ST%*ga2BSb7!^R_UvIJn#zDZ1bp+Nm26}UbDNA92j?J;sdd2vGWKsn(*Ly z_?>>zHzyRXcX`3FajLS}ZM$(g&nSr&BL}e);j@&ie@(ty;HGL=X-CdUttVch2)1e^ zi78b}ai-%XC0VxMHy|1QQyEe)?wU9TgXoK<>x9K{otJ9#G^DLU^Js)-`abt%FiJr& z?;AMkm3jBqQ5UsD^%Yrx5FjoLy<=ZnvS*r5%Z^F1C$yujnu<5|I9=s#v{T&CF%WG_ znEdV^(Gy7pOzm%d|8tPK_2MZAZD8As6j4Hxj-JW=R=B;yN+(yzX8q{6S!Jbrk_SHG zcrI5Jpqkcc%8O{;`YDT3o??v>37W-08SbVyff{;~=n&w{i<#_r`UYI%=@hc5T5PS{ zWJ;Kocf+sBtWa;vv)bkwOC!aTtXim=)UX;?MaXe~T5f!yDRFCYkH#-421$mmfyFay z0A`rNN7OFf&VwKr`18mR7++j@19X&*rp5qS>B9jXj3d#C4i$9Z60`WWSW^u3eOQX6 zhA2IZvUV|B532t!ld|GJMJGd5$R#;Udo7dhmk5a>%b*iQ-sYjLWLd)Yf#RK|qe`&4 ztTTPb9J4$3Z%}gd|DdWR;gZ@Y$eJtlqJE-G%~=&=vT2%cBxX>Fs<_~4-Gi)eHgb_k zV@iy3-f;C_P`-v;8upo5q{(cnz6u#LyvUlLsn-dr(I*^AT(G#)p_n8cbM#N24zewB z%iW1{$g!zsqdGQVh{saRToD1Xw|$kWy|d#FJTd*QxOoftKeK<5=IjH=5uxpb9LYCJ zS=gxONo?`hO%%#^E%LknSEpe&_hdXM9_@6wdgl{)o%;-~^6G}c@5ha7(xdgM@wGP8 zYWr*X-aDpLJ5~ACw0FPq-X6XE$K{!6vloTid|vot>&To}!%z* zojB-=OK!i7{PU~q8~e}fIWr{Y@RW#SM;{gLdmP-d%iZZ)?>wniyg(s*1a-4%PX7iSdZA??)l$-yEnf0{`iP9doM1cvTzY^S78r4w28Rg*`U@w z=g%+4fAvrzf0>h&6Qn>*Tycu|xAwBE=*7rO=50=;h-)=q%b+i-QB5ys=5%~u;7H5b z(|zdBp%mvY1nT){Z{3o&_&tM#`t#<4OXt;;DDkLewVs8hzW#>WLw^xtJpnkXa}r40 zZw$uvMCzn4^9$ct^v_60i6P`>j+mrQRiE5s(IY}gjyZEWhiz9q5)2XLtbp~G_U*XR z;7)iqHPrD0BRS{_jX8PY0~=fRVlzD*$Ae9txlZ_!Mq9}D#^1KAoFChcJs;~4 z^~W=M5ssd@j~Gqz=zDv2O;sU>x<_h8W(*lRltWsUZW*%U-@PoGTc~EeBiD!j ztsciwS6_0|*=pN4J5b~JSOnX+fWBloRiHs7!Y$=-f4l%Lz4GIknMRPBfk3`veQ!gv?3!U)sdxoCT z_ag$eN!aykdIk*qbb@j>!OivASG$Q3)5}}=)y?F4F_%lG(mm;Fe9@or6WOav0D^pT zFzrX-DD>a_YZ})&m0jzX&oHk6N&K*DD*kh~)8DV#kk~5WG zP@l^T7Q{td_?Jvsws2T>PWohjvs-h($?WGlfw1dfX>f)1n_Aj%HuvgdpPf zalaA=VUnt5yI2oDy%atAF!`{znDp>296r2CF{o&B%Pf0<&bY}LK(EI)h71{!=4Ita zf-LUVd-}HnTq;~sd@uT1eDTA0j-Zl&?z2k{wnlY&#+r8Q-|uYpq)1p*U>DERUh?;M z0rw&p_7ZA~wlMB$M#`EYWe*qPL%#_1Ydjs$hBoFnvK4}=I%L_M^R&5i@kqVoW}J;h zO{|rRPR>*OOWba`b~)W4T-L8K2EmyiKxbr)CC_W z)C}MuVVmfveSJ>g;~*$0OZhW5$$8IAQFawqD}R7yd=kiaHqKy%jvr={ay++g-C9T^ zvy~jCxQID@?VlfX6;m^Ttig2}Hnc!2C(n^-zY}?8Zyt|Xt0CzGo5{_zR_$nh)>}_j zI1zzxq9Co`|HS!B2iRCmE#CL~!Eo~qKYmhi3Ge--xOE>UU1>0C>{vaZ^*rqpt$-KV zy2KqjP@-W$Muze#RI?)YsO%4R)zN<48Z6>G?Zr&f^8TYokM@0dBIeq;&^6p7^P7L( zU<3^>_Gx`HgP*{^{YZIDHF-ccEni^PmTPlniNvP7Bo#s<)Qyd$x5aE5b1p$)gdewN zi?r4;NO42i=$WS;>t6Tqu@iUh+^~K7c9do2l`TVewWRS(`ae6oyVYYf66w_D53VD^MsQF>k>ed-18hew{cAJe{hb1iC+l(3K^PTDHf5#gFb3-`)F&zfbdfeqS;H8K);+6&dA$ zTLL}GbddH^`jd^s9c)p<7O#U(v+3H>;&@Wh{Fk4kzw~!-)`>wCT;pfVs5p-eb1azB z;tYCfqLtn)Oj_l(HCynZXQ#hmETVHYtTE3qKq`!b{0DHij}!> z-_3XLqyg|PYq#%4?~rmiQ!4uecsa*Z@X8Hq?i_O_Ir)>WUb*&b>Mgf_L$$Y^{tV#+ zEZ+Z(iI90?zx{)ZNkNmtZXO?AB4|kSYY=~mW-6XAJCq*ZKcC|7qEEr?+E9UX44DsT zY!66DzS4%)w$TK&*N@bt0*3Q+!T$NLwes9I4*id`R6DLl5$qC+9cEeUl|0N$b z{0hIi(~}nZ(P8Az(c1!kqTY1z@o9feilE37NwjKG$Fu-dRn(Uft6@BZ^N9bqhuopO zbrR0&A|9d^!NPL0cc1x<`6%q8pKkI{v8mQFQU0D2`yhf4VB_ zb5YT?@kNbQVKXmvM!=E({TZsCQ>$WR;RA9hX{1linoVfGkOKZIw9pY?NyziFh4aZ^gQtmZ21QZe~wwQ7g)cKOY5*qx5vAMd}&2? zW3!90cvg}xe8=93SFTHYrI*iq$t65#WChnMBmY~1uLEcu1w_0sIsQ(?$R&T@JaZk> zm5yhd*4YE@&(J47o>fh2kB>h3sIU%(sfp^Kif&&jYC$~jUc(j>ly!HxOL*(0oJ^N_ zTeS|4ql+&U4_xi^=Z1CbUINT-_g79Z9@0WKMmDJWaVF?J&bhIw+~=f;j@{}{=qzi4 zMV%sD-1;*$Y-N_39k-_31!eC<)DaR<0VS28Zh`VB3dv>;Zfs>u@x*0W{yJ`e@4aQm zuM$nT*GRsp)`5>{Q8e28=rwtqIP2LYNpK2sy`=r&!7 zENk*+GZX8@%MD!}F*2e;_~2EmRu%qKd;bC%Zp?)hw}NWp14qhSrli+pmQFnkEWR0? zEj@eOiazbfK^(?d5(Qe5w^K}ajr`?5CLt@t%*JLGY7On_?`;lzf`95UibG;Ma4-}u z34>evKfS2OE_&2k6fM6yzr(c>r#4!VX9tpAr_P;YZCID1P>#QnQ<}cS!-JV`VxDzJ zZgdmhyR*iePyDu*)qSBDP@-BY8Zf{6MNL7~`Fb$P4BVt8nvDE^3FY3Ozup7wG3LS# zt=x(W4&TFZSPcEc-gpSpA^yDfFezQ&4}+^z!+wb_{7zoZq+jZOSi+6DYO)PQ^oounC7WwsP*t_PK_l z$iMyfD|9k$StGOC1&Rt>I9wDQecD?`WzeTDT%t9<vM)T*-*E=b)%&?E{^1t*nP9{Opi(c0oaIymkTQ~pJ@t-RzKKxXWBA0BU`Phf_i;2n~=?F z8hx)_^jDfZB1INtg9J(++Ztn6-3n8?<)KCp>gAu8-SZ+O^`+`|qV^lQr{u-_Y9Zmv zH6AveGaBAOPbr=@pWL`!-u4HG(bi>Km zf7HtSpzN+sKY_}UL1JogcKQV9yY4=ep7q`msG~22jJ9l2A zP0sMuQF%u^osvhFF1A(W1458%^wl{^+q!#vwOP8te5x4dgnEqQ6sEBy!`~@=wYV8V zujDZPgIgKa2l@_oo$r4;2c;MkX%dD*9W%JQ8ku4+% zFFX-59Sd9VRoU(4P%ri0k!Zn7rLUb?1tp>6Y}Bn_xAf(0Mx!L6lgplWqVM#)uad5J zx^o1kE<-6!Df{YNsU{;)hhO({*&XXkS4DxvAIA=?&dA8{bk00nHj`iF5a_yuuKZH` zwwq_-J-i&~nt8w0?6hlF3HXl9e!f{+d7GO64)f`qBM!B~b;y(82Kld*J@1?8tmQ}= zVK{t`oZzw-p9SxNV6183(NN#72xz`O>Hxva9W$MW(Yn0@KoMM-nAl2o-?G<^oGHMS zUM6YK(-?+_?4S8`N~I|1OEnU4=!Be_Dy@KYUxD1U0cuij1z(D5PX~_y@jR;Y$j)NH~nAY*b zm;RzJlw{W7Xoi*Pr_3+51nlz``U2)Tps}@F_^bKkx4M1%wo3T=_}o268jK}v{X*Fd z*U?=pL6v+F94(k$-u6}5RQisQcU-0u?2XGd@U#oSgI~n}0XyU;?733OvO!5wFfSws zibG2;>-VyGEbtIamR!+y0q%1`FKhBkrGv<-CWet7b&n$riESp=DElhLhZ>*`P|zj; zhcfx&os8O5NyMqnWfW_n=p>V zyxd!dJD5|hbnwZ|@-Pb5@Gherm}A|tv4^M7*vdezWf*Q)*=lCJQ-Vb0ZHt-K+yOOL z`Dd7o1p!V3dJ2Vnh_Ggq%D?^0Eg{Gs0W%GwF%4hM|K}^gCWY9B)p(isR^Vg5fZ#aZ zEq4#0!AQ`j4v*)4}s+}^@SkONh%S@zQ7wolAXO9E9W!FZ>~lul#jR)Q##i!wP6EBwo{ zZ*JqDJAB*ZIc0a+kSo>D#0n@AGAr|H>9+)rD@%WF*}fuWQ1ba_ixQWX=^HXVWiw^9 z?ojp~O(##C`d^P|{TWI3Jw8skFaC3lz_|bZ8-UY{p*~j8KNB*l`OuwPe4NU}uyu{V zQ{{3`mJZjxfjR%b|6c*QdF2J=n@?shVG4w_+kBk!BTDy=?Nm-qPAY6b!mfut&eh_M zySzHwM%GH7LJuL&(PAL+O*#l~F~re{)Vj!dre^?yaOr3lApIm z!zH`1qr;yny6jQ(qE2a=1cP8bb=W0C_>=j_s>UFbUIz$Em9HU=YXqUqu#x5war2d@ zl#yUz2Q!87C*|=1fMydB8I(zQ8u8R%luJZ~ob3oyz$dC3Qrmx#8kI&WeO~gJMC)-o zMt$ZFCGJ4`SK*13EK&F>ep|GHQQyo57V01_n@*X^zj=MhJ7zSSYV*_LYhS%-_g2&P zK7LQ~$yz<`rjE(v7xWRVogB?>+qAA)RF*SofR85rRH+FOgg)Vma4H6@wjMU;M&9*U zeSv*ql%Es8tvDCl@%3f{w!8@-$Lq)gtb0{s<(0nt5U{&M76Od-0M_n)+?qy2XmeJd zLAaf16eKR5{^apO)5y_^KV7oQS5I}dSNM&7n-lR!uU{&Da%nqbQ?i9mfmg}6US?b^ z^S-V&&7C5mBa{l5*pV7P(>-~Jg4>= zNg-|7*nR8C;k^*QFBa zeb^iYggVN6o5Z0fJ%<_XfmFa%<? zm-K>;g%V#KjC|)&b5Z7I9V;?w{CE$Rc(yJ)aq{FsK~pLP(1|pTX}87ipnI|0l57`) zCFQ(FR=DUDa_1k3a+jEx80%Q($n^^9n%I4r<+zIHNq9_zHWo_Lk8?b>WP?Y-$H~+(=btSKN1(pP6!%XD9RMKE8RFW!a+@Vn8y0MKOdb5N9 zN+uoC9IJ^EZ1ff-Yw)I65{gwwRfK9d{oi>fo1-J9;5jHq%O~f{q!j0zbPZ%%JL;+N zeWouIiCbKalH0hKtOhZ@&EpJ{EJ#3!vWpy~p|mZZ$jS&ej!iYY?`4IGp!>+f#*&R4 ziJ^=0V7xhRs6XsVdaNpli^T{Kh3b>}3zlI&3NNmj_g_C4)h?CnU4D(h!0^V$zmu-!t_KO{fiC3`&#}rQTxQ!)`d7EqGHfnp|sMw9$ zP6BHYf>Scs<+Cw;4`0E4FMRov3RTkB7ZW)wX(WWkk{N0JSxEZgMF@)S;71O-$yJg& z87BW_#+x%09p#Py3nh-e+IxKDTS_dfoN&lRHnwC7{1*O6#ms@|_uPeQjS(OH=2>X5l9QzWrfF`1T2^i=I zdim`VLG#4HJtE*_wNqp#?h>$#tV1@qNt*ZvB{I9@ZkraiKx|p^<^-q|*E#tx6$M*4>6rJdDWgGMAW8IR zO4=~qx@x7a;fg6>KuloFcBsGnHfXTcM@1o%-z;^mMkNltl02G+IIg%Lb&hW9sB;|rqguhziqnRZ#01kxvx+*M!eGJySz!DOhT5g zzI!KfV98*Q4{^A4JJ16;Q=&^r zQjVen@X75at=5y9guP-imvYbunH@&i?)SYzGmb{&Gbd9}xa61jcl;0QJ}W-V>0uqF zZTV?Us%UsRv&Avapm`9oRZ-x2N)E$E|$}`=()C zgtf{M`EN66bNiKyieNSTrXDPEejSi;;^&@<31PPAli$yw_x1@{nlMf;dE^_pO{Z z7crS4Lj1Q$w+DogBN)8n{dY<)e5cg3!|gqehc(c#6C+>HLO-Qx=@I?+!01J#hDQ{l z%9DXcRfZ-{# zpUXZI=({6XYMjN-|5OVz4^UpJ+hu>h*+lnQH##ll_N{6dwcU59UwuCtnn3;3x z-~UdNW>)IYA;)nQm7T%aGvD94Sa7J_H6>R$;b##|^h$3uyf81D*Bi*|*26|j2<=W2)N&J6QJB2dTEG5l$L)QKkAPi-o=maZ5K_3t`TC=Ec=?IKxU#a z8YN=oT^Z2adGcH65xq`mx6U%s z@0L03`9+^Wf^x1?`?24AJIRt8z(_v>_yc`xg=7!^>egS$(o$izE+ zo%j5{(f99fO~3|{Nk4w#x1LNE-DT5o8&)&<8$pbs$}bP-84>s0`FUY= zM{^7k`KbL1)kg)^PJfe@MMdfOyUhc(zT)uA-W^Wr=w9RSqEsEy%mg2+7Sk@E+rpyk zFCVrt1fQ0k9IGJ`OyS8T``>PCZ~5!Ri>u{6fz0ftQvKBF(*t~s?zA~?eRpqL5d|YQ zRHLWFoQV`FJNRYu-pe{M+@z#Vq^NVRlHMZ1>V6MkCxqO;b&eBVKfg20M8-KU9(ed` zyttigeP&hJ5~=P~)m0<8z{i=2WCyiJLVC-H*n>o~t^ zghB`DjO<{uvwr!}gnj!iz|Wcp%R77Q_>YDvZ$C1pO=X{)9ZD;b3(T%EKKu>JP1cB6 z7-LP|t&^aXt5#$z)1*HWX$1OK&~1}PUv0Mi(R=}L%Ud@kG=57kvp|a&C1YQUKf~mc z=nthfeHjJzjPuxD$VT$o)X+eK1dd6JGSdjBV_;%_6_GOpiO^4ZBa3!4v)PW=ihut5 z_n8|CZ_!zhF6jHef*JtN;rGAf+N&RkYQqa*z6^D2!hl2c1KW;>=k@ZKKu_)vc=<8| z%W|eS=>Bj?w?7XjuiIAH=l>A)?Ey9B+xt5aGor8K%+R1_PFo#AqKH&9W2Wp;a_KFi z%ZzSPBGN^dZ473{CH7WLrHeanx`;~YvW+3Tqzqd(U5p)xlwF~8`9161#hjV%_x#RZ z=ggVj{l1^eTF-jcv(}2MLV-~f-tP&K(jVghXy*1! z#1D+})jmYcgBP7Cg|)^dpo62^eiu;K8|$@@OKw^u<>0;Pa#Obi6gRH&5N>*n!KCJB zUt5N-HyX)mH&k#CtS0dg{$t=s=K1(u(k#&C6P7`W?yeUR z7%IjIH&p_ZQJ7578Pl4NqDJO1BnDfR55zlwds2L*L8>*B2)TnOy-hRVVRRP`3qv-w zHxWt?Dz`v|%Wcp!&K|hHnx3{YfM&WU3| z$#w6Ic(a#F97y&#mZ%2EHhp#1l=`^mV!9^jB%(e@o~Dm(m1F}T*3U%dLus2jy(uF^ z#qQCbaknrF&j@{$xwL<$_4|`j(>vn96_SZUNgRx0V6Q7Y-HGNLPtZ`i^!%EO{x}{= zCz$L&-4iZCL!z)2lS-rGoNZXis57rO*cv7))7)7mQv0UEiK+1Is5&k~54dO&%4#NW zr~`W!iyn_O>a`a;t_*4|(n(m+J>!fNU-%j2q0rr%6Fl7Q@D&(l;HiZRPhO}gRW)}3 zBqFh`)As7A5w8Oyo@g($h@9;&ze&Rj(anA}MlOl5rYBEbzt1_`<^+xxY1Tzfxcf@c z+bdKn0$%S`w_{sV$4k;oo}W;nT2Krd)^{z< zydJ-DBHE;p#(-QR{OT6MlK1c5rv?<9#EGMD;(n!x48ZxHp?b|=e1HPo*CL7NCVOFc z=k+#zb<6bu!LEr~bCxsA6hWxf$m;yyt<;Uq4Y`$@frT9jhN_+aCP+tF3F4k;;yI`B z7)NJ9xG4vr-T8I7nP#g-!kjn*rih3tx-q5qwvIvg!ez)z&Z+-iVbPF&g zRgnSU#N)^;7%moB>ucOgg7s&Ztba+xO;bc}$evY44D=bHe2x~tU9EWwDX7VQ0}bvWy$t^<*|U6X(=DoYgotqAu%fnK z6&C9!25mbK@lEC_vtQeuAtwUkPT1B15E-w1fyf!My;u**x)SS(Jb~Xduh46gFw?Rk`fru=7lZz73} zDOm%Nk%633=l7bl3JO0G`a@=RxVGFO{h)j(jCaB(n+Aqb$`Tf8w0j5OiHQF0f^nR`gNsy6r<9A zgZ|P*jnTh~TGtb$G|l9@nC>r1TYEb^Q`dbE2{=ijloL(6XdcsvotS6U0_)cz1h1T1%Qh#A3QpbDLB9vq>u$As8SL& zo$|bdG7t+6UQ~k(6at?s2j9{iLlab>wUH6@GW z!jLqSH(uREW(6kZbL7|ph%F<@9>l#ji4r5F|KJZqBpVc6T@QF(jcT(FQaVqX7g9Ye z;KD-b-clW>YmyU_^53v=C&WQ*;{qgKKN+qq(}qmWM}K_H>L@9-!^K6t*Qr;1L}dR6ub8l_dQqo^(Ek zdq=VxLTOa;OU9p?TMm8D(^Qwc(3o&w5+Q#Xuvt8JuFmd7I(%I`Ql)o><749aPoe_P z?i~b|C;*V6euhrf7yuJ`ePY=`<+%aS(=dt>4qFPHHA@*2efA{tB3mag=Z7|(&gJ5BT+tTV}XR1ddTVxsr+_ zDI-eu4s5d@<+uRSPK9#ZQuEg#*Cv@!)6{&7)F`8ltX$bs%Z8;QoTCM)>f3-pbXPI5 zQ-blm4q;Pl&)k3VTeh*wURf;v7>$ycmO&kxiDmb9p#Y~MksyYcmQ zO557G+CO-bZgV}OUIr%Z~>yUp64`A3rB zoz0Zyje!E4G8RuO%lk(+*Fv!EkD6GD!JztHoBc*@F5QY|DW?eoc9>ai1COIa%ovT3 zhDJ8^R>i1DzDYLAPIV8;^3HM$K7KIt`&v26I>M0G3kr|8`BooGq)Z6SFQcFZY!2M$ z8ES(*hzt9lrE(=Z${46(apw;?L3EJl-=1E$Y!2_UkT?#sb=rzzOyJJ)Y5+F^E7Y^0ySh9)ntTNu)*u3itD>-c)!oa8 z2#x4;0S$8kx_h;c`FF+Y=U8t`%?-|KTISXat=6 z_!x#cV4L}NUxe!R=yD5l;+SbNDu-;KK*O(z3BTc6DaDpP)amC+N9;|2}N&5 zc-_c12{av->%4EM&C*PaMxuUeoKTay zpW80rjZ8U;^o1c+Asm4Q3D#NP{d>#R32xsp%+}J1C0UNCW-F`^!{3vsMmC(2dAnFE z%J{oV)w;4l+dpv`=yKW0`lz zOqz6Hj$Fepbk5rlc(OQ1XDh&q;xp#Fq<)N!o(Z0yF{WRSw|-$E|bxoemui$+HX+ICbVx7*`FPY~HE;o#Fb3bk4D?+1v!j)K^)2PyWjjzs`9;O?8OhneNh!MEaZY zLlGdRTCBOU-IvQ=2pztqB4esh>qyxSA)_ZE0nYFzk29Vc3+VUM-OE^c#IaSyID0tT zB5T{sQ_q*%KD(b<3h}ax4j;{Ch*b&tplC-*F=_1)#LWZ8^11THIv*p!!5If)4d}!z zM8mmBbmGJ~ahLVTtopTkB`3D4MK(C3$hI$0^zrpH2P!_IP`-5Ll^GE9gQ$CB1RA-J zD@8(7p%|>CCfN$b+DL9^nGLKNDnmf$#anSwv8et7y1B7=}{$OLeLl5^2|+@xGgi=&J(?H6uL6So}}52*;u8o687UL z^y9fGNdnil1~%@L;2`i)p<(B6Fvv~%V|ov>ti2sGx99rK;@>kD7wDstBx1l)qT>K? zA&u0-m7hhfm5RG)tTy3i^ni0xy4K!A2gO`{;2EM&>15(v8ZPfj%P^F_O<_N&UR8{X zx^rX%J}$?BnQJJBa%0HbK_Q4%ug`IOmE3EPCQUFR?14@29E=%>r&pr1<__mgja!g7 z^?)5GmIs%*M7=9}f%FW11%}$j{f7q6#;c_)+X9TwdZ&VU-2)B)zjFLjjh29*ut(==w#3`*E_3btiYq-O_zTEg5wYAxS=7V z2iSVZP?;bYV}JDA5x@Ez)z4x^AM|3b3v~=3f_jtIxG}S~gqzZxuZP`f$2Y zf80JLO0VVS$c{1h;zw!~txA!-3f}UqG3&G3k8)&4w@}$Nt%SQ;Bjbn)FbZCYH1BG0 ze*2cwiM>(9zuH|@yfB(;c8X%5J(jEEo2l#+W#vhb5g6Dm>O)SSELBkOMse?YhFSFQ#eT4SDC{0{Z-Vl> z`)5lv1=-Uk-K#};&QWq5CQna_ONL7}(h(wsF|nT%asvM=INFHUU-6j#1efQWdf0B_ zw5Dq;*I<~0ShwY(r-B+feW)}EMa%HppaZ#TCQV_bE0RgXhot2`j-!}~!Yh&-9#`UR z;YoApbH3@TCisIVWAJ`44UI3~;sDGPcuduNmTr>wD>@DtVpr6)7eefvKNj?8E_(I- zj#@a!R7AC_oo`QIN0NmMK1Q6n)bJF`ZY?1JBUR6#y5 z8wE}VNj>+@psHdDvFubLPOJcSW{_q7XT12RSiX^A0*)MpfRsBGZjCQX@NvGP-dR$C zpeJfdi!b_YmmnIWrYle++`EGhA_{@dFNv>|2P}@U51qDZ{oCHU0(g zd3*R1_}D<(ykBuRlSq(AfG3uB_9D?8c-F12CpaA;z49$ua$ebYD@3;TOxJ47Hy!k( zkOFnIGw_i+8OP)5vR`CJ%|8Dq2y*8&8jwGsY1%4m25EO8<7k3zP#CfDCx`I&jY zw(wofv);~{LCEtDeq;--cb|>OPq+F4%m>m?VIW=lIj$d_bv`*+P+*Q`7-3ujfy%aU zR0qkU7T++@fD&q~Oi}O$pF!*MloUl*vjd8OSiA9~$P4CsNtye@-KTV~S#VZ3% zo6jJi!zk1(gB^+}uXe&n8X#DPxV+m?(W6YG5e;mgYQJN>s6)KJtJ2WvTMV(}bW@af z;eA3=y-TUskbn}FO({^5l&(1R*?G1l+HiSULX-zMyLaDM|p_ zB4GI`ozOjso>pPhXDGcubc7nQHsBlQ9NLLIn#_CT)ZAIpA8{wqP{9DnMjuLhV9uPe zyIS%j8q7F!THm%66)D%N92g1cB`=qwPzIO&F_R)&7%kr+c=b7a5fmUDQR$&mX{s44 z*gW#Uj%(L$Maw}?ET%H+5?7Afn98>NZdft--Ir-9S2RQEK8$BV3i4lfy2tiy9sT!Mv#Adig1&kwnUh_Z=8KwTeI=4OJQ z=Bi-SlH*BjPvjTH+0>noFb_C}!Kf##G7&7x)f-b9;mgnj$b4z4eeGw`^ZclydCec{ zSnj`xq!%YnKygww5GM^6L@%DQUw4mIrUYo&=PdIS#f!u~PPSK(<- zu1{?obY^n%wqRRQ5J3@8fI_XEz{&<>S&;|LMBY9-NcFJpIqGv3y*u)WsW=aM z(r$s}kufc)Q2m==$dM6J&=m2~qu}-*V4exR8#QprHg0&q$qWK68A_$_jH}f`#=d)6 z{V`lfU1^T^xg9PfkyF$lvIDa@Q>=M&4io!7!D-tHk{BRGq7*y_HQm?k-V65n$j(Hi z1OPtvL?F)Az%TMner@!a7GHqh?i=$852NQ9Dt~l|wWLyiN*yB<$m9~}v|x>=e7{kE z+tQ8NnFtqjp(ko&<0;&757AY@X}y=rwtwPH6;e>496?aubYoJ%PwL5Q=;#jeP1GE~ zgUFg<)A|*INI!=Ir^YXY4#kt;|0kJ+q~kg+6|E86=z05N8YeM;RYjjGQ!Uu{?lv~Sc#ReKuMp+@?>l*p+%3TX z80+{3Xr{SaB&=^f$4^RQy}#9LMrp;M=jcg<r~n-JYcvnpeGUj7sik~14U^YW*Z)!`g% z@|o(Ra!}pa#=@(E+t`I0dJEz0CEch0HobQjh5w|Jb%)X*7t?*GRXY{a4u!S1!RMkfb zFM`vg(d3L*h0n)RyWJQj5^qMQp>%H8g;0Zrl|8GSr;5bNxhWTMzG0O?y@-rC1 zkyPSDhLtLcU~joDhFk(E*;L=gA3Seh%+5kOu-Ji{l3g)q4!2O`<{=_@av!pgqo}Vj zf$b_#XeW={fvf~knR1BUq;-LB`wZ#m*LlOC*)dJx(EcBX&cw(FV4}C70GLW_0N;?&&o<^d|&$4@2RODV!j)~t5;LtIO-3{zvr*->k~LkL{%*b zDsa0I4{3R!DIPgkYTQTzNI8KUt(NmoUkeVVvn_WFB}oLm7FujVos@HmW2&*4)Lrn( zKzSXhwviYP(9NhyHNQut*wi+Q^e^ZHsQgR=_h1670S=mtQN#mski4;rm3dngypiee zh=Ku=2vs=EAm-h_1*JZ3gi7bf&`n6GW|wqQx&1xQ?$*~kD^+kQVr!txO`46ech5_9 z#x|}X}y(SD`(Qt90bP>bMEl_WFoCrOX z_MJUi$tPsX(=_L8`K^bNU(#HQlkmCrR0Y> zXH;=zn{Mt*3a!jtEQ1QjwJDFjC6>+4+CNzII%>=(9LzKg+{Be`sZ=a|fNCSE2d8>0 zsw3pCWT#J&wZ9L;XvC_+JH%Z zf;U^Kc6J`TnWAfK#WjcshWJ74ii%l?H;GR~Z?HJXuTCMo9y(m;+(=4j8Vt%|9?~!- zKUv-Phrt3d^LrGfFsMmq!gG)rwS~GwhJxli4HSVsaRZw!~k_28thxcvv|EGPL3sg zF27BJ*nYK`ldNMqXhK` zHJ3aZ+icofxu$tBs8%@r!vdC{fNIEBNU)?S-Ll=Cy&%oFJMU?Utg@JR1WTMAK#nkW#C?CTM+T zXsaZTq}Gy|z`b&ap0{xI0bWOK1ck^8?#1|*{uIM6FJ5k2XmDf$e^JQDF#I4AMn{KW zC8Vy@ttcMWY7kbA>_&atFHmQ2ZJ2m1>4V#+$n$A_G(?Pje;PJ#`x3)v*VFx8Zd4sJ zk3^2|5QzD2NTY>~nShnDSdUv~B8AE!b*9c77&rUGvpU*;7$4d>(tL#yLN*UUNNS%! zG%J{f7_53DGL0Vn54HPI(}^dw*XY|Qq}V!r)j3d_+)#X^FVQ~Bdaq%a6XN~hFI_%O zrr_#-k*ik73twfWH$8J12%%0syhhpDST`ijbPkvbW6)-1`6AM0+E%OwuM^sY)i0;s zZqa(d5hCAG&tzwMDpEjCCN;dVe*n5J^7zBN5FrxtpZ@;QIexgF3F9Jd(zS5&mWVl5(_u%@3D;2c`i*)aj(41=uOQMdKr z*s0}<(e3#WFB$1!~;X{o6Q}F0)dsNTL2q97cI_`B6$Jt3~Z+fSe!9} znM(}sr<-is4Vl>@O2W`gOIXGOB*CKIzM!goxjhKU`&zJY4I^9cE-XB)B&Shvg5hP} znCfITRWnf@1Elm8?EquvL7G08iY>=Y-DHSS&=fL|LXs;Is92?M>kqlt3EZ$WR3UDI z2SNh5B|&h|Ix`a<2!+@~o(xG^(sN_oH_gIx)@`}|5w%KKt&24hCb|WPY+;{qHkX!+ zs`xib=VGu2P<`#0+WnpA3EA5F_oImx2hLS$P@B~dBl{A`OWhOD4G(L5acz?P9_P#E zrtjxbKhbUbkVk-1Tp}6}L!fai5&TmUiJGA`j)lXIRcZc?QhU^C{s}CT@;OG{OMj1Z z+YD$rQ^$fTTJo?s14qEKR0|di(#|C8BL$fUR?UO^d%6Cqgtaa0suOW zD&FAABpZ=Xcn?1Q&T*}VdV}O^L_tt4Avq=0+8-(FoFghhXpC^6X}Y8EG+f9ZENiK2 z(sMoH@b`PDTL{v&7g3W%ia-#Yd(4Gt#)vQ|3x@i&C6_!E|6j{xI zd-dRJir~2P@f0qx4Mq#O#d{lnUiJ-2{g9t zLwYw+Sb1)UlH7k!$%ByA8oBs%@B=p?f9QZ2SVR?XbaEumWU=x*z8;X+>HU&tkM?>_ zQWDF_TY!cqiPt5{!`ydSa-jcq0uAE5h{s5%M>w?;qf!}eQJhm;bV-P^x0H8}=&SCh zfyq`_nRCdPCCMB4O9xdB`A=>9xHj2J=&@iD@>(?d^sxal6s^gK#Cb$Wn4z0-WALpNB2H_u- zW;mp`r&>b7V`QAnDTtQ6QJ3S_^MUI+`9aIza9J({EnCwkh zE6koIv_>1;hc`bR!WqNzmJhL3E^U8htrlFynd`W!5k8CSCr-s8oxTZzP0PqDrIe1^ zhI}^%H-ZRm%-IXiR=#gv-B5r`{cB*g$}2y>hEc^MwKGU@cHA`6k*1}>!X(-fvr z!m9B2h~_S&?y%U+NLPHQ zFh-9{p4ah_{uudm$K+gK;RtL05I_~=5%6zAJl${;4ep`8*tiV|9cq^~)U{Gr@3~6U z20yRYlKfNm&(SyFXOqiu3_)v%t!;m|$F@`B(xomvE0y)-b3Pw=b}yugbGUxsxFwvm zXf`K)*s$s{O84PtccR)gZz?~PO>vHG!)%EDG@*#kRhv*A| zqj=kp+zYu<5+KqPW@L)pLlxqrTZ6I63p&W+mL>k~qA3SVdCn$S=TH6Gh4nCjts*yj z(S`6Sr=~w27|413`ir>xO$h^i8}5{i?^N#`b)zctrmpk0e_Z|T-v^HWw)z{#=_X&f zIXw{g7u(#Et)1@V(O36&`t-b<*PHlpx4(@2>W{Rv+GjdD#br0Pg#Ebtx}&eju3z(( z6`$w-p!?&>)=@?h^}BViwV#&R7JaU9Ex2o&OJ4}n6gj!=;>swy9|~_jyIk0Ss!q~> zqVHva4bMzSFf;i2bmzk|<_ejbjGt!kb1$=-HmYWHnOt3ex%cFl#&22HG{sw2>e{EV zVj|0RLpZv{(!;~U9~jYCwLPr2CcV#*c6k4R>S7oOp^a;V=wga@jsHl=g$s=;oASs1TJX)N8nLW+6 zoHicTUXf5Swz=GOmY0=e)FqOiw(i@vFGn}`Q>jLFxrGZ-8I*zMPUWcN-nn$SdC`k&Zdcd;I3q~% z%5b83;jD@3;elJWysYOx(F@-8R=tz!@=VpPgqwnY7bhM`>Xjz>;H_(k)X~(|E~o$3 zn9gP20+C$7U*y6hZPb}nGb2bnX1XIU#GZ+n8oR_W$t|n3;!IOh6P19(9zA*sqemM& zc!g!ppZnCKSzOL~JRw=k*oP^zk9z%xXTEh@*Z%Bd$!C*QO}>y<2iHE zLlh>JVS2|y>t)NbKM)4^h1`u-P%nom6vq{B`b;{N3D`JE*m~+&-uAB|L#yY1^|6_7 z;KZ}MFGL!;CRcnbaxPrBK=trk&#ad(UmB|(l2fzggoxK|{Z6J7#AzkQi`T7VT)b2> z%-6I}OdDUL(x<7e);g-{G*&NR*VV?z2@@tPN|KuhLZ97U-q$wJSJXlEa@1th`OU8r zJbZ2~)05=9-R<&b_X9Al-P!|>A}$dY3ff#M2tUO-&&7h@w{(5$xNe<~Rp-s`i~na$ zJI@hMPRB1i_~Va18d42HdM&UE?g0UF-@a-sMce*^L|X*kFiO0$a9BnvvLfZB)ZvK~ zh1?bw<}4QUr?Vk1U1z=VpQM6as62s@64xA<2$5XQ-zs?FXWID`X`Emv+>?I#>8EvJ zT{2&_s%%Wq@h8evmL47ukGB-IZJQ$v6(ulpD=m4(dpc_No@HysNdlkdz1S5zPb;8o6)p6rZ_L)2|FHa1oY^jE8%k!semB9iOB zu@15`Aw2|hxQy>8*srd(Yy0r_Lu1r-72%fB z4c#j;n=V~n-ooi2DR-tQobuN@_MY;=EYvn`XQBeXjCEN{HH zcZF!F{?iNNZZCLtJ`{BKtyPJNBgQKG^AS?Z5e96b=@;2_YO^!5_}WYTH!xGYbR;@= z0-W$lADivD`TfXQGn^_D4$J!lw|yt6U!&X$wQpF|b7E1AuJG`7jJbOJwL!=VP6}g# zCuMxpYU{s($z7~6@x#$t*P1FDcx#t4eF2P3xVCAS{}CQ@QoH-Gwv>AjGyxCc9%HoNs9PGV%eM6S4tL#{*{Cw>OSUDG z|48syG}#xIjat^A8+!}P71!iCUd8e@W=JZ~m)y*DN6pT|-w_C?eiZKGa1#KcP5 z_Oaf%2Y8bP&ELa$Wd6#MpXC`<&dVRerL9PDJwY3U4MviiXs%FrI0;QN z$_IK}22!|vy7Nj89bP(bb4Vwf z_@4|L?#efNbs@6MrT4na{4C_wg^xB&lXkG)CGd%_T(QXUXW89s+&7Bpg2L+U&38*m zzIpuQiP6G^iPdWy!iJrAO5KF$uia)%vVEQ1@)(Z|7oq|yS9LV%6PkdgJHT_Cp+imFXYpi(LM@ceNPS%lt`o-+{(NbO@Zd-feNP;a(diEd4;Uct2a=?u8$^7D_z z6g+o-hZ=h7xvQ`0zCb+l1Ma&0B! zlFr8Rck$=pZMLHm^yB?Tw{PCMwco&Mr~Xs&Ty$}0{Du!%rrOdnL82pbH`e5j; zP>cr?cHsc8eK~+Zv(v2VkZtmw#Jt6 z;_qX&PyRNi813Gx+T7Qic;tnwGTcX#?{MLIckD6rvhkwl*6$%*K1Ml|QD+RQf5n>| zNyK1_C)}I#N;K#W3sZgdrHTCUOjil32>++h86T7!$OPCjt;-Z|x-{l&Y&EJlLldAD zbr>xYKYjX?5@C4MHfpoPIi~em9ly{O%$TdsHz{B}*p@WoVHVmmf_Ss$5DX~ecjxly zo7Q4esX`T(=s`eC`5nn)dxmSTYlU%3+%7*`{f&P(W8)CzqNOs+4y!UTkF6o!;e4ro z=g2)CgByfdAXT?+-}VTQ34W10?h?i1^C`KhAB;WrF)tO&JO`VUS9pLoOI`1hYLC%G zbsV^Cvz99?@wfK#BO zNF&vyZrI{LN@ycZR}$G*6`A!xw%a z>||4zfG(uKo4bFB8$+|1rk9lpwKD=^=ddI3Rt8Q#g|OMchNSM2pPMu(vNf zP?31}e`%V$XxG)`DJt!s0x&lKdIip$ITM-kUj8E-rxE}nu>g=fYNNvQbFQcW)n%#MRV*IdP2yO(3mV=Q%rG!`GQuF}i?^dB%P~3D-NQqd z!Y*R`jPa%I1$7DXE~ZOy)wO+|@9<<7pmBUG!nl9IxlCF=YvKd^Mt%0>%Rzo3&#A%I z6k;iFXm=l4l9E#iuDP3df8nrMbJnk4Pf+>@^#Gtz?D4QcZz3iy^Z%N0Lb&`2`}#0r za1Gq-WbT3+;#*TqY5;7Iz)5f@Xko~2ok81KV^#IC6Ixwod-o2sYm*#=aJA5FDx$2H zY@9Eyr~7(D5_Sl9U3YDB%9$>GD_Ymw5a{y*HL{@O%IVXmYlhGICwPOh&dzPGUewj% z_zGLS^rcTk>+G1EoN>YfN@Navg%q;y-Tp>?8iulIY}EW?YK!gW?H zd$B~3&&IJVPCC!>0DwvMZnnnf{Wb-Mn_8X?}47Eg5pL=-PZ9c zT8EJiPM?DB-ybLASMmWvF5>rFe+4wFwP&WJvJSc?X zV7`Xr$C@Phb2cuGt*sfwtG%-tR*jJz;W1+Vq{q=!m{*dy^nVM0`$T=!1e?I(*=Jm^2-92 z%FGlIYN)!P(-u^0TBF{cOo2a4clLU0Lh9q?qDn^gL(^E!O7kSIS1L-i87oI+IrWREb68kND={lU`yyFLWl7VYjKeHcc?Y}}?lL9QL zk4r0BI#Wsj8>427RYPrQ|GC5S{J!Y9KvBiUrGDO4$7}pzf0k;`DyDUmP#-XCl{kN% zba%gbiRFC!e#b+Ni1~;PeTTgnN&fG4g6URtG9YN+V>z0f^4eOS@orDItHV)MKR7D)WQoG#nT28-8z6kqg*p}cElcgh=4DW9AadJ6doS$(#W4RCnY5X z*;iX#U0p*{(|DOo_G+B#4`954x!+wKU77w}ECTr2QM^vS^HVC4SZ^!dp|oc}0s4aQ z%b@x&Wn(s43>C#!=0Be6JIt~IR^%ea1U^7|ozP%&=|g_eTE=gaDsP)pCH($)GoI@% zMpi36dcuC*l8;|uc*#YwRc7lr?&KWnh=^-*D4jJl6ZkLm z$=Z9=@B)&96NDtp{)uz$%!ru)r%5WpN2R#xK3_5czDz>2{D9yEaURID#>U5&zIhYW zkHN;5@#EW2=aHoY8#B^>zH}X9V<&ryP4gMcy?6>+D%!6%7>R@OF(p}qk%>vHZ5Z5v zTJ|A8w(X!v+6xA8(81Tkg*Lb8hy9s=ZGEb*q=Ga-=KY1LVbnX5Vi<5FO;k7*zf)hr zU6Wm_m-;)2R$+0ODH~AxY@9R%h9x@p1L|U*6`h}-qvVFo-d302rc&uu%S=v{Np!Pd zHK~@58Xr>J%kd(;tg5g+;N6kg$KjuCqNiON@>z2*qJ?TRskfiU>lbw<{=aF2xK2ky z+3||4i(YRfXH``XFq_Vvo)HLh<%Ua>eU^1R%bw#GiRAG(b*bmiyM>1@1o;%35HQui zXG9uCwDax*+Q^u>YnUXMiHrc+I{h@Ze=Cz9qP52@eF`B8tv#G%{XqZg9L=h)22FHE z!DMoekC?7v-{HJ$Er6j}|N8GFNW284RxwuQ=>3Q{-ZL0W9DF!jIPMQ$ZQlMv?1H@h zt9@4D=kHe^BZ>~4J9iG)J6m)9L4wCuT?t_b?_?ix%Vf7ZM2VeMTz{iiA7{q|+RLm( zdg&1vdymxsq5$F;8X1XEICx2O{xT|1qJ7_g8tfvDHdJtME?#uUbk4K=XcZzhTO?hH zPzVc7b^@(cqUx>$KEe5G)sd*hCnj!!3R&W{rvI&j#a!ez0Zu0B)0vxembJBmVRo@4 z!|eSYoIn=#*jRPaO*%BQGRNu$`_f^}!irgn0Vt|0*%osqz#kmp7LDnP1E9p>6rqGk z(C#x!vx-L)$wlON$es8=l>Ls}psWZ_Vr++$2+Vq@NCu<~DAth~Q!oQAjU=+Q>gsm} z5%?u|WY=eFY%=wvUvU``6JEv`1kOTVsMJ!}Izjlhz7ba)0bZ#cJh7Tw&o1<3@KxJ0 z1WVSIeksz!5;Ie9)ic6q(S6g{LTAQEpvF1G)*F-jZqXDaE?x!?q836WS#(uhH(oZ8 z;=<%1D~3Pr8*(i?P^TmIC$E@%|_p&{!iEui=ZvZp$6y7m5DXAPT-DuvtN{{4`aLkKD zXUv+WaTg|Z?9|{e#%4A0j)fC&cqOmxn6@-FK~Nv3dI0Cj8(XbqGsJBu3sNB;S zoNJtQ0`L#PQ%ue{UgH2A9WIw) zkI!o;9m005{B2IJFADm%iZ0fug-x0?sgx#KP!%)Kv7b@<|Cs;DISUVD9g!z7vM#LM z3IyEBQ~*ya`yFTT-LQ9@MViwU&QCIW_kX>x*#^TGCOdFUg#bLchy`IzxJj2}lOV0#LFMS+ba!==}d5sKgh_x8RmlNpZv)p$^+u?S7v` zqt_z*m1jgYxvRchQ~)z`*XOG8CaTe~S^j_04*p-NgldzW6&_ptjp8V~;0(J7pKswp z+rF4#lG4dOU+Vu=b&m&fax^SqFvY;-iopIT(VTF7PCn!>ZcNx|Y<$?HK{}G>v%{&f zFNN>7OtF|iJyLnybq#%WKql!M#``SAVpdW|!z|qV#)l?H<-SapDYm`!{gv_IsL`K> zatkOa3~t@%5?^foVhhp4cRZ@LQ-nrv&l^FuWbs9j+d}DO0Q$xtI{7}AS;thiny;5$ zG;vF$+TsA}P~Kf05e~zvIAsuat_)c-3@6~srs~?IFh1v)tSjunOGr)o45#JWvPub2 zl9psvfVDwq_>LoI%%}TtpYUGDy9_HvuX*04%ZRzK2&ajVDT8{7`!1p5pO+)+k zg9qzw6c=}-1s0@~&06`YwYCy)Tv!xHDCK}dl*V43Nt0?6iVJrdZnXp zc^CCB75H1%D{BQHNAuaqZ2&mlLoq$?;EKwCE24Y@#4>xpMdR>uT^{DnmFZSxazk7& zirE(*{T~rMZ@#fpWtL8ey!0?pZoIx{c`u49CzvDI_P-=@e5TL8HH zNw)Bw8i<+;N|J(?eT3~n=bdGWTl{&r|0v^*rY`8z*NCtpa$c7rCD9iG+v>^l)|O2X zB!U|SwiTu#*~iP6%E&xZpy(-zmRn#6k=!Jk4W#Gc=_I|yAsM0X^FIaiysFRX`mA;Q zTQmUdREIperyUWW?M9X5Hn=(Sv<=x8K-FZNxp;b8oU@9GzCdCOP;ISJ9kyZbE<6pMo|d)z>d8KHlw)c z3H1>N?OLx}^-pRiNfRu5ab0Hp{ILjG|C}rp-o(PRXEo!@$&SzR9}46nE~x%Jke~m8 zm>Amld(Y9gfU#K%2W1&WC)JISIk4Ufq@zVMDEP)wo9}q#hLD|dn_%#377i;u@N5kX z=C^><>zGwcz^X|qJj*P$6Mv)Tml(1@*R))Gig<4eGjMT z1cVZGu~9|ndzE&`*G?93p4{Ru@wlynZcX*89@`xbapz7 z^sEwkTJ16{v)jMkLldsV%irISWKr?oHgl~vH%Rpv*n;5qT8;7!o+Nuc-I3@)(`;4g z@;|9rssy?&`- z=->&-V3aX>9_v%0%BxMpY6**6I#-`(w~F#-{d7frA`9{t%>eYqj~^f0G~Fdu#^{YU zGJ^%+RecY2%_a8sdDZ}dlj{|_Q|-QN%L!&~tbCq$zVpsw3jkU;QBP##6OH~xjT-d= zFpHCFVA6c-_lj=W%f4cqWR|$66oE)yFK5sM#Z;6(R~aoX*!J(DuC+x`B(4aE3jC$> z2?kr-OwCy!{R9T6Z7`j(4j=ty2fdM&1ye9hdK(V&!HKKOi6(&^-oW*Of4R@a$H>el z%~OTvD&~ywS4=@B8;SzeARhO(UqPA1ToIcslm__jEv$n|>py(qp1nS8^#$aTjrUCw zA6(+Zm zs?tmb5F$@dtnO!2`wLcwcW~FAVsoL@4O;8}v6Hzt$hL{LR=RA)E+cvHfo;&2)Q*N@ zB0MJfe+{%Y$!nT)1cN|jAKo}wo3?n*+5d>lp-`cIJyJA2(Ri6K za!>YAc@u?)l?Zf%;k4LQy#F&aZ`T;eDDzQW)&|>kbF3bW?oVt;1P1Rj^Ah#i;h*HB1KB5d`b!cx=yZj~Rt!%Cdg=vJ4DMZ!>40yEj3(6o(dXO8~vVfowm z#P%Nu@X>c4yxz~B;2?{sMJ2zIz5?~fo9xMS$>8b?3;O?1=P>erGT3h()}8IHsVwvW zG!!nJF*Vqku~`G-T{W5ehJP?w%aIifpDLaAUQz44C0WFykCx z#^zpfS5_8bR(s*m+}vD3$}~nZzWRImfzA6lNB5HLdBpuCw_7LwYe0T+ z_w(8uqN^pUYiP}_7?XOqit+DPZT8c=O%9^hQ*$dCHVKA$WjpG7Wrj3y3&glTu~8+S|wY>FKZvd3iwJ`-w5))xrh+7YTv-)j=3M z(Z))=E*3C&CPZ?)6T}iqj8`#!-((uS#}^%FR4@nBM>l3%)p~?*c8rT6X5&xX-)jbf z$MRg`A*cld!pO{-EK_M@TG6NLhAa!3V0nP#+6p~-cC3|`@{|ehWFC@tvT^6wE95yy zdjyD>!lpZbaZ0kuECRoZ;Dh#x1UF8B!3K3PVQ*g%^lC$sw;tu7N$O3E~;kZkTC!<5w@1miETK=_VY;!BYJ=o z`CXL4Dv(lN2wX!|-?g`PUB<{7MOJ!PDjl(`$u=+wo=h36Kk0Fx;ylCJr+6DnZ+A^N z@Zyf^S)!Xr$pDoR6=GI-6l!oMWWykuYfWQMw5sBQN01$BR2f|DN8)wJz;UtOy)z5v zQmlvHt+8I;P#DI&`okN1PdlQSAT!`yqV;M&^nZrg%IyAq&ffVeQ~F5TV3T+ak#ya( zqS>BMtabOPt_fl;2Y_m;jhPr+pwwg7e343$H<-Z;6MenhOIYp}BREXqNb=Fb^(&bO zdqzygHxZ8O;A9gKj4zk-LiexQd|z@#)Z`Memg`o8*$s9;bYWl_lu{c`YXhV3SN^}_ za`$RUCE)}5B^hPo)>hP`|uwbnKx6WYvSHF;`EL=6IlW?B+w=KltI|j zrM~sXgSKpbKPA5Wy%{XK4lVoU8T5pTcy_^Rpt@c$e>6}Xslsf7OI8`0nT~f-ZYIUGq zFl1-;vNJF#yfA{%k_tu^I!HuQ5@3*sMrc^yl@^#4>^8J$TR5!olKrG^(E>cmj=nkL z+y4??YZYj(dZBcDvqA^utj*e!Xc4$mj?S@&IDP<*wH0N((rmu_`|m3gF)GCaIT!S2 zXfnJbASc&=yR`fM0-eF#5z z^PRbcJBM(O{ZGvu6k#L^9*Hcuv7h5$)MVz5c#n|@n6ABaR~~WpC4S|94Xoo2;?;!C zsk*tk(t~VGNbwb%dEa-DwQxNIC~5q*rEq`WLPzvx_gC{zs$ii;>VCz@8HFM@OF3?= z*|o}dET-$-l%W!f5i`_ffAxNmDMfv?MOjEIw%>$kcrdnhO(6#+iC)3DoI|?HU`ggZ zn8unKM-(}Uovv(mr;H0?xVJaA4AK~q#W_di*XgiR0)S_1M0drW{|}^z3y02B^;=hjKIwy226O^j@gHDV$p=Z3K^ZzItqm7 zd_Cb>eD#~eKZn>n%iVOmEghLK7;15^rRbqnx+FUgNqcGtL3$7p8(!)jSF0rMs&0>+ z+MP;%Foj&g2@0QhwO?|mga0StV)(P1@ag0TTiE`>je`-oWIM_hq7d`31F7IRs!npd zm1;L6S)BjcOOl5&l=qs&@R$31!&mn|_UqRr?hHPmY8hE&!xc>W`OhQD;Z{>=FI{WT zu{&t#i}iBT03ArJNa;xeFit@esMi{D>wX}HCDF?T}xx%hv2{Xdcwj8=C;R?il z?p*9g{vcb2{yGExAfHx!yJ!bQKnwikOCCRdOrDeqdVKq5LMX(`{^^>aekB8S<}t(} zlIi*}R{C z2LQ)>0FT_Kr{fDxwANjDZQ8#BXgZV3w$nS7nHNFs4JBHCbAn`F2ILs_`s;L!C`2bY`!v zU%$RXtgQIJ_w%I>`3`n61C)gfRKrwT4i<4ldgIF^iye>w)U-tzhgYo%FzFy)>_MK? z%xqBL4#W?a^b3^bB@M8eKIM!7(^p58`pRR}mXpP`)cND+D#}sQIyduueBVctG z&Vtvo^_|)h5FAp=ct|2^Kb|n5%|>yaAGsk3Yoq^oiKsNC<@>9y899JbKDJ8P9id{L z@e(2y%|O_k@EwVN)s<9lQ<%B6SR2=%cljZnK$P}u`&2Yg7~SVImM8i6!XbQdUI9Mq zP*Fr%wNjqJYn*>}NHyGW1QX@goO|r>n|C%`_6?Fd!G1rZ!t_&=2pwP-AUnz!|ja#utv!KzZpq!kMRqV+Y1r z;U7erOkTyA|JT;FhecJb??pVx^Bhq#pOllJ=g0t+2SI%#{DDAvyo~qMjR*qcrBEEq zOUNaJDN{2Ebucesar4$jbi6Qx8ElUkO{Qpupp&8rN5k+kMhJ?W_gi~r_V#zqe?HD; z&t7}2^{w}NzxVwHt8kEIeeSNSScR!OmQJ-9#g6&?u_B`&WgG$z1YQt71EDgW5Ai=n zFvfJEvVQqqAPiO?&7Z9AOkrS&Xwg({X^f#)fA0n)UbBh8yh`u>A)P8LW|lgqV@#Xl zTQSU%D#Tu+Ywpl-%VOp_Xv#<{rpA1Xb}jg#w}kc(iZ@?5cb_yJvfxBxn=d$s#|Yh* zMjI!I&9s-KKsoX4S2>19#hdV`?DK68(4I@gxV)FVY6&kDYs~nzpbwshKY}Q+>;h-v zwJ{URyUy0J!7CT_2&Q|NR==Tlq%g3QM!2)_Al`v#kJrRuF%-?VAeyma%JP}sRcQ6o zPMyk~Q*@0wQSzALtkIx8<*ZP4AV|zml^{W7%1 z4K?n6LFwCGhJ~mHrO!QTzmZ1`{O`P1Ei1)lPn2Vs=^Ot1sK>?slIM>WcU-4@Y5=>0jl+W|MJl;v1e!_X;0(_#v^0PK3yxRCX`CQt(B?jVHn_ z6&UyR9ROy_QJ%vdHN8X&vr57?9574e=t9Z-3@_ttrG;;v7FeVf#G?Mj2knl# z%%X_n&m&IuM{BfkGlfkh;xxi%1p!VY0cJ4-R?zP-;bwlc?88^hT&C@Id*?t-rTTmDV z08v1;&YM;@%miuyDx`H@6K%%dHB2_pGf*Hj{CoRuRYu}AcnQv?>jc@q%VISsR9c`>3{(T!^KE0P*;(xx0 z<2l0xWYy3kz7kfR#3b({;j}E9Xj#T=a-53Nn*HRrAiZHg5i^X3t$Ae$c`WgE#t;j} zuK!(B`79x-b}9!6K(YqKwoGX6q;A>P)k9o$8|T>VgSdr^1V#jG5{CgwRKrU0GHvYENCHUaosW!BT zKOjycGQ!Z(^dX#ws6vKdNcCGW@+kl?Nx-RXzG;!h>SHw^fO(i50;uO*&t+`))($x&cE=mJMMpv4 zUsN%cRqs~eIm5!v{7nvr65i?hL}k9cv3Tu(ZiLIzlcUL=XQr)}U8F==wkb-uI){|M zcj6a4r%!mCyDOIay%6^}pkwJXRg|is_cNray~02xhA@c#wQ)S5^ccF{c!Ihg{E+r7 zzRrE^ds}#;5FA71pOde?rH#vP99Y(a!fa#1?AoeCgfVH=&&jKdwb=prsrXzx8pf!)h*cQZG)2JD4UTL zTi3&w5oo!b$5Dqk-!t z?%A2JVz$*KCwGiCvxNFPh_u?IaU4}hd#6*B^^uKLY(jd2z%vJPgRnLy1utOnEz)Xt;yJOY|j#2|(QWBEMEEp^A;$)F9W#|5n}md7JCGiRfsD-Ot$1vmz`<%H;(4-3i3 zbVlfg%R}6TYV9;+6BUG53l5WzG*$S9bePEWoHYP&OGx+U8^aM~2M%MOC~ZP;U8h_g z={|tx`%HHeC}^Cq&2MCR5*UPVa--5I$kx#**!~uoX1xpL5?1Ky&W*8f5!UEquV56_vF_wDDk zJ9sj2p}4!Cm^gK3qGe?Zr{-Ak+scmf951tTck0R?O?HpDsK#^BgNyRX_;wHez71!w zJ%`t2wP!808m1&U%(Ix>M-GCH)5{J(m;L_PBn8hgD`^Q4gG*KZ5VxGKpCRZBEsd%O ztLpZh87*>bYX9zEp#q-(VIlfXri z{Cz{Y&|@pGP)U;8)02tDC71ezAbZS;qwn)jt>@kdTyoQh{IVM%PSpnTp?y3%KJo6$ zTphuzlj@Sgw=|xj{82v~`V1}lHBh|C9^#BQxAA|9O2aDII_6jJB=(9G#B;z?kRY@k zrZQB2ZDs8$k2ercD=FGE(-g5yyZGFD7`K_cyk!IFGS0du>4^$b!WI_UvVL|9I-8q(zy+l`K4KhaF<7RYlrr9cJg>Lb*M zj^%7p)}OQnN#VDx0rgpygp?qRvg@lZ4ZocWCfagB#(~Y-| z^+;c(KswgzQ%54j^fS~9UAhT$9`6r@KbM6`P(WhALHXZ0I0jwZs&ymbNgxLnM_s1& zU5*BA_={yf{tr-h|8G70+RKI3jQ{|X2#FZR&sUK)5-8g3J`OcwgX|?F;XkfqK~>7o zBM#w=7-|{lQ}J`Jk&gyE1L`93WpE>R5yNXORwAuF<}vSO28$zB$r_B@c7~1$4;P`e z4$bo`uOF^z(GONi0$^5oq&4)OA?pDGrrJI+5B~|x*;AY)e^gCWY!%ag1l~Uw{o~%@ z{o`sT+IIZ;*KyzRGRR6d;5|O@PmajV6=1T&Gk&NFwdP~8Rx{B|=ZmyRA*-0@>jncjipIQ22cAaLq1RKE#5ftjIg!&rO$PW+568QVHrVI8NGb_ zCCU+F@^OaR&Xenu+>+J*MTKOg6nhIH-RcL18<)A6oM+A~Bb*P~aIZwHgt1>6w|U{0 zEun+dN^`g*$R&>e_=Z|-9{LXls=G|+UmC+X9+vt&WQ~!v=j7ZuErQ~#T|bUE8^Pl& z>lLH$bmvl{h{EDU>?aK%^I2-W5{8&J;;HQJzBVFb`&trJl=9&6=EdZtgS>nLV(t6b zs;x_2qZv4P#VV`0FwfqY4|mH(L0e8NSwTOcEK0bgNt=gC$UA*7NI0=MkYpWHYXHVY z<8*rk`s*uUMbD6Q?EVBEhS<6y@mj1y%ssHTUBdR1v_Vk0@Dz`^3re7^99!zcrGasC zgkoD2^`tjxm3)Mm%aA=!vVEcHxAaEai`}(xktptB9pOyn!2F6BFvCo?8amBTw6wdz z%o~tCCkV-_`{M(KLH?VvXQn&lG)JG_a8{qz`E3pvyD&o!T~llelB^NsK4~+dpzJ}nYPKMkOe1hL;i^Pw$g&y2DIAL~f zhQB2t7qXKCD+Of3`f30@dnXQ%J0Sc9lx2$5_#3@3YuCaA{F2)))6@6`+Dpa*2fFI6 yYI|zh^E8i*8T5-bx*Z+xt)w0b5N7&`V0PxX~$0e=fTms5B>w1J(BYP literal 0 HcmV?d00001 diff --git a/CringePlugins/Loader/PluginsLifetime.cs b/CringePlugins/Loader/PluginsLifetime.cs index ccd1565..86f1d38 100644 --- a/CringePlugins/Loader/PluginsLifetime.cs +++ b/CringePlugins/Loader/PluginsLifetime.cs @@ -15,7 +15,7 @@ using VRage.FileSystem; namespace CringePlugins.Loader; -internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : IPluginsLifetime +internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client, DirectoryInfo dir) : IPluginsLifetime { public static ImmutableArray Contexts { get; private set; } = []; private static readonly Lock ContextsLock = new(); @@ -25,8 +25,9 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : public string Name => "Loading Plugins"; private ImmutableArray _plugins = []; - private readonly DirectoryInfo _dir = Directory.CreateDirectory(Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CringeLauncher")); - private readonly NuGetRuntimeFramework _runtimeFramework = new(NuGetFramework.ParseFolder("net9.0-windows10.0.19041.0"), RuntimeInformation.RuntimeIdentifier); + + private readonly NuGetRuntimeFramework _runtimeFramework = + new(NuGetFramework.ParseFolder("net9.0-windows10.0.19041.0"), RuntimeInformation.RuntimeIdentifier); private ConfigReference? _configReference; private ConfigReference? _launcherConfig; @@ -41,7 +42,7 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : await Task.Delay(10000); #endif - DiscoverLocalPlugins(_dir.CreateSubdirectory("plugins")); + DiscoverLocalPlugins(dir.CreateSubdirectory("plugins")); progress.Report("Loading config"); @@ -56,7 +57,7 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : // TODO take into account the target framework runtime identifier var resolver = new PackageResolver(_runtimeFramework.Framework, packagesConfig.Packages, sourceMapping); - var cacheDir = _dir.CreateSubdirectory("cache"); + var cacheDir = dir.CreateSubdirectory("cache"); var invalidPackages = new List(); var packages = await resolver.ResolveAsync(cacheDir, launcherConfig.DisablePluginUpdates, invalidPackages); @@ -78,7 +79,8 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : progress.Report("Downloading packages"); var builtInPackages = await BuiltInPackages.GetPackagesAsync(_runtimeFramework); - var cachedPackages = await PackageResolver.DownloadPackagesAsync(cacheDir, packages, builtInPackages.Keys.ToHashSet(), progress); + var cachedPackages = + await PackageResolver.DownloadPackagesAsync(cacheDir, packages, builtInPackages.Keys.ToHashSet(), progress); progress.Report("Loading plugins"); @@ -87,7 +89,8 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : await LoadPlugins(cachedPackages, sourceMapping, packagesConfig, builtInPackages); - RenderHandler.Current.RegisterComponent(new PluginListComponent(_configReference, _launcherConfig, sourceMapping, MyFileSystem.ExePath, _plugins)); + RenderHandler.Current.RegisterComponent(new PluginListComponent(_configReference, _launcherConfig, + sourceMapping, MyFileSystem.ExePath, _plugins)); } public static async Task ReloadPlugin(PluginInstance instance) @@ -96,7 +99,7 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : { var (oldContext, newContext) = await instance.ReloadAsync(); - lock(ContextsLock) + lock (ContextsLock) { Contexts = Contexts.Remove(oldContext).Add(newContext); } @@ -122,6 +125,7 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : Log.Error(e, "Failed to instantiate plugin {Plugin}", instance.Metadata); } } + Contexts = contextBuilder.ToImmutable(); } @@ -136,7 +140,7 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : resolvedPackages.TryAdd(package.Package.Id, package); } - var manifestBuilder = new DependencyManifestBuilder(_dir.CreateSubdirectory("cache"), sourceMapping, + var manifestBuilder = new DependencyManifestBuilder(dir.CreateSubdirectory("cache"), sourceMapping, dependency => { resolvedPackages.TryGetValue(dependency.Id, out var package); @@ -187,7 +191,9 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : { var plugins = ImmutableArray.Empty.ToBuilder(); - foreach (var directory in dir.EnumerateDirectories()) + foreach (var directory in Environment.GetEnvironmentVariable("DOTNET_USERDEV_PLUGINDIR") is { } userDevPlugin + ? [new(userDevPlugin), ..dir.GetDirectories()] + : dir.EnumerateDirectories()) { var files = directory.GetFiles("*.deps.json"); @@ -201,7 +207,8 @@ internal class PluginsLifetime(ConfigHandler configHandler, HttpClient client) : _plugins = plugins.ToImmutable(); } - private static void LoadComponent(ImmutableArray.Builder plugins, string path, PluginMetadata? metadata = null, bool local = false) + private static void LoadComponent(ImmutableArray.Builder plugins, string path, + PluginMetadata? metadata = null, bool local = false) { try {