From 57cab6dd48d85c9c24476c13eef776b21bd9eb7a Mon Sep 17 00:00:00 2001 From: kceiw Date: Thu, 17 Sep 2020 20:09:31 -0700 Subject: [PATCH] Predict parameter values in the suggestion (#12984) * Get the parameter value from the history. * Add a mock ps console for testing purpose. - The mock ps console will echo back most of the commands. So that we don't need to really execute the Az command on Azure to test the prediction. --- .../AzPredictorServiceTests.cs | 4 +- .../Mocks/MockAzPredictorService.cs | 2 +- .../Az.Tools.Predictor.Test/PredictorTests.cs | 2 +- .../Az.Tools.Predictor/Az.Tools.Predictor.sln | 8 +- .../Az.Tools.Predictor/AzPredictor.cs | 70 ++++---- .../AzPredictorConstants.cs | 7 +- .../Az.Tools.Predictor/AzPredictorService.cs | 51 +++--- .../Az.Tools.Predictor/IAzPredictorService.cs | 16 +- .../ParameterValuePredictor.cs | 113 ++++++++++++ .../Az.Tools.Predictor/Predictor.cs | 104 ++++++----- ...osoft.PowerShell.PSReadLine.Polyfiller.dll | Bin 0 -> 4608 bytes .../Microsoft.PowerShell.PSReadLine2.dll | Bin 0 -> 310272 bytes .../MockPSConsole/MockPSConsole.csproj | 29 +++ .../MockPSConsole/Program.cs | 165 ++++++++++++++++++ 14 files changed, 465 insertions(+), 106 deletions(-) create mode 100644 tools/Az.Tools.Predictor/Az.Tools.Predictor/ParameterValuePredictor.cs create mode 100644 tools/Az.Tools.Predictor/MockPSConsole/Microsoft.PowerShell.PSReadLine.Polyfiller.dll create mode 100644 tools/Az.Tools.Predictor/MockPSConsole/Microsoft.PowerShell.PSReadLine2.dll create mode 100644 tools/Az.Tools.Predictor/MockPSConsole/MockPSConsole.csproj create mode 100644 tools/Az.Tools.Predictor/MockPSConsole/Program.cs diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/AzPredictorServiceTests.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/AzPredictorServiceTests.cs index 3deadf24dde8..54911c1e2522 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/AzPredictorServiceTests.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/AzPredictorServiceTests.cs @@ -38,8 +38,8 @@ public AzPredictorServiceTests(ModelFixture fixture) { this._fixture = fixture; var startHistory = $"{AzPredictorConstants.CommandHistoryPlaceholder}{AzPredictorConstants.CommandConcatenator}{AzPredictorConstants.CommandHistoryPlaceholder}"; - this._suggestionsPredictor = new Predictor(this._fixture.PredictionCollection[startHistory]); - this._commandsPredictor = new Predictor(this._fixture.CommandCollection); + this._suggestionsPredictor = new Predictor(this._fixture.PredictionCollection[startHistory], null); + this._commandsPredictor = new Predictor(this._fixture.CommandCollection, null); this._service = new MockAzPredictorService(startHistory, this._fixture.PredictionCollection[startHistory], this._fixture.CommandCollection); } diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/Mocks/MockAzPredictorService.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/Mocks/MockAzPredictorService.cs index 1da9df41817c..2cf1ccd43c8c 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/Mocks/MockAzPredictorService.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/Mocks/MockAzPredictorService.cs @@ -40,7 +40,7 @@ public MockAzPredictorService(string history, IList suggestions, IList - public override void RequestPredictions(string history) + public override void RequestPredictions(IEnumerable history) { this.IsPredictionRequested = true; } diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/PredictorTests.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/PredictorTests.cs index 8ba5568ba2c5..dd68a2c3a08f 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/PredictorTests.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor.Test/PredictorTests.cs @@ -34,7 +34,7 @@ public PredictorTests(ModelFixture fixture) { this._fixture = fixture; var startHistory = $"{AzPredictorConstants.CommandHistoryPlaceholder}{AzPredictorConstants.CommandConcatenator}{AzPredictorConstants.CommandHistoryPlaceholder}"; - this._predictor = new Predictor(this._fixture.PredictionCollection[startHistory]); + this._predictor = new Predictor(this._fixture.PredictionCollection[startHistory], null); } /// diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor.sln b/tools/Az.Tools.Predictor/Az.Tools.Predictor.sln index 2535cf7cda8f..cc8a579534a1 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor.sln +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor.sln @@ -5,7 +5,9 @@ VisualStudioVersion = 16.0.30426.262 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Az.Tools.Predictor", "Az.Tools.Predictor\Az.Tools.Predictor.csproj", "{E4A5F697-086C-4908-B90E-A31EE47ECF13}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Az.Tools.Predictor.Test", "Az.Tools.Predictor.Test\Az.Tools.Predictor.Test.csproj", "{C7A3ED31-8F41-4643-ADCF-85DF032BD8AC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Az.Tools.Predictor.Test", "Az.Tools.Predictor.Test\Az.Tools.Predictor.Test.csproj", "{C7A3ED31-8F41-4643-ADCF-85DF032BD8AC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockPSConsole", "MockPSConsole\MockPSConsole.csproj", "{80AFAFC7-9542-4CEB-AB5B-D1385A28CCE5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +23,10 @@ Global {C7A3ED31-8F41-4643-ADCF-85DF032BD8AC}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7A3ED31-8F41-4643-ADCF-85DF032BD8AC}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7A3ED31-8F41-4643-ADCF-85DF032BD8AC}.Release|Any CPU.Build.0 = Release|Any CPU + {80AFAFC7-9542-4CEB-AB5B-D1385A28CCE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80AFAFC7-9542-4CEB-AB5B-D1385A28CCE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80AFAFC7-9542-4CEB-AB5B-D1385A28CCE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80AFAFC7-9542-4CEB-AB5B-D1385A28CCE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictor.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictor.cs index 7bec718891e0..501a8b85f9ed 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictor.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictor.cs @@ -51,7 +51,6 @@ public sealed class AzPredictor : ICommandPredictor private const int SuggestionCountForTelemetry = 5; private const string ParameterValueMask = "***"; private const char ParameterValueSeperator = ':'; - private const char ParameterIndicator = '-'; private static readonly string[] CommonParameters = new string[] { "location" }; @@ -74,45 +73,45 @@ public void StartEarlyProcessing(IReadOnlyList history) { if (history.Count > 0) { - var historyLines = history.TakeLast(AzPredictorConstants.CommandHistoryCountToProcess).ToList(); + var historyLines = history.TakeLast(AzPredictorConstants.CommandHistoryCountToProcess); - while (historyLines.Count < AzPredictorConstants.CommandHistoryCountToProcess) + while (historyLines.Count() < AzPredictorConstants.CommandHistoryCountToProcess) { - historyLines.Insert(0, AzPredictorConstants.CommandHistoryPlaceholder); + historyLines = historyLines.Prepend(AzPredictorConstants.CommandHistoryPlaceholder); } - for (int i = historyLines.Count - 1; i >= 0; --i) - { - var ast = Parser.ParseInput(historyLines[i], out Token[] tokens, out _); - var commandAsts = ast.FindAll((ast) => ast is CommandAst, true); + var commandAsts = historyLines.Select((h) => + { + var ast = Parser.ParseInput(h, out Token[] tokens, out _); + var allAsts = ast?.FindAll((ast) => ast is CommandAst, true); + return allAsts?.LastOrDefault() as CommandAst; + }).ToArray(); - if (!commandAsts.Any()) - { - historyLines[i] = AzPredictorConstants.CommandHistoryPlaceholder; - continue; - } + var maskedHistoryLines = commandAsts.Select((c) => + { + var commandName = c?.CommandElements?.FirstOrDefault().ToString(); - var lastCommandAst = commandAsts.Last() as CommandAst; - var lastCommand = lastCommandAst?.CommandElements?.FirstOrDefault()?.ToString(); + if (!_service.IsSupportedCommand(commandName)) + { + return AzPredictorConstants.CommandHistoryPlaceholder; + } - if (string.IsNullOrWhiteSpace(lastCommand) || !_service.IsSupportedCommand(lastCommand)) - { - historyLines[i] = AzPredictorConstants.CommandHistoryPlaceholder; - continue; - } + return AzPredictor.MaskCommandLine(c); + }); - historyLines[i] = MaskCommandLine(lastCommandAst); + var lastMaskedHistoryLines = maskedHistoryLines.Last(); - if (i == historyLines.Count - 1) - { - var suggestionIndex = _service.GetRankOfSuggestion(lastCommandAst, ast); - var fallbackIndex = _service.GetRankOfFallback(lastCommandAst, ast); - var topFiveSuggestion = _service.GetTopNSuggestions(AzPredictor.SuggestionCountForTelemetry); - _telemetryClient.OnSuggestionForHistory(historyLines[i], suggestionIndex, fallbackIndex, topFiveSuggestion); - } + if (lastMaskedHistoryLines != AzPredictorConstants.CommandHistoryPlaceholder) + { + var commandName = (commandAsts.LastOrDefault()?.CommandElements?.FirstOrDefault() as StringConstantExpressionAst)?.Value; + var suggestionIndex = _service.GetRankOfSuggestion(commandName); + var fallbackIndex = _service.GetRankOfFallback(commandName); + var topFiveSuggestion = _service.GetTopNSuggestions(AzPredictor.SuggestionCountForTelemetry); + _telemetryClient.OnSuggestionForHistory(maskedHistoryLines.LastOrDefault(), suggestionIndex, fallbackIndex, topFiveSuggestion); } - _service.RequestPredictions(String.Join(AzPredictorConstants.CommandConcatenator, historyLines)); + _service.RecordHistory(commandAsts); + _service.RequestPredictions(maskedHistoryLines); } } @@ -175,7 +174,12 @@ private static string MergeStrings(string a, string b) /// The last user input command private static string MaskCommandLine(CommandAst cmdAst) { - var commandElements = cmdAst.CommandElements; + var commandElements = cmdAst?.CommandElements; + + if (commandElements == null) + { + return null; + } if (commandElements.Count == 1) { @@ -196,7 +200,7 @@ private static string MaskCommandLine(CommandAst cmdAst) if (param.Argument != null) { // Parameter is in the form of `-Name:name` - _ = sb.Append(AzPredictor.ParameterIndicator) + _ = sb.Append(AzPredictorConstants.ParameterIndicator) .Append(param.ParameterName) .Append(AzPredictor.ParameterValueSeperator) .Append(AzPredictor.ParameterValueMask); @@ -204,7 +208,7 @@ private static string MaskCommandLine(CommandAst cmdAst) else { // Parameter is in the form of `-Name` - _ = sb.Append(AzPredictor.ParameterIndicator) + _ = sb.Append(AzPredictorConstants.ParameterIndicator) .Append(param.ParameterName) .Append(AzPredictorConstants.CommandParameterSeperator) .Append(AzPredictor.ParameterValueMask); @@ -223,8 +227,8 @@ public class PredictorInitializer : IModuleAssemblyInitializer public void OnImport() { var settings = Settings.GetSettings(); - var azPredictorService = new AzPredictorService(settings.ServiceUri); var telemetryClient = new AzPredictorTelemetryClient(); + var azPredictorService = new AzPredictorService(settings.ServiceUri); var predictor = new AzPredictor(azPredictorService, telemetryClient); SubsystemManager.RegisterSubsystem(predictor); } diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorConstants.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorConstants.cs index 3aef8ab60b92..e4b21c7432a0 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorConstants.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorConstants.cs @@ -27,7 +27,7 @@ internal static class AzPredictorConstants /// /// The value to check to determine if it's an Az command. /// - public const string AzCommandMoniktor = "az"; + public const string AzCommandMoniker = "-Az"; /// /// The character to use when we join the commands together. @@ -54,6 +54,11 @@ internal static class AzPredictorConstants /// public const char CommandParameterSeperator = ' '; + /// + /// The character that begins a parameter. + /// + public const char ParameterIndicator = '-'; + /// /// The setting file name. /// diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorService.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorService.cs index 2770bc9090d2..695bb86b5bcc 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorService.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor/AzPredictorService.cs @@ -12,9 +12,11 @@ // limitations under the License. // ---------------------------------------------------------------------------------- +using Microsoft.WindowsAzure.Commands.Utilities.Common; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Management.Automation.Language; @@ -48,16 +50,15 @@ public sealed class RequestContext public PredictionRequestBody(string history) => this.History = history; }; - private const int PredictionRequestInProgress = 1; - private const int PredictionRequestNotInProgress = 0; private static readonly HttpClient _client = new HttpClient(); private readonly string _commandsEndpoint; private readonly string _predictionsEndpoint; private volatile Tuple _historySuggestions; // The history and the prediction for that. private volatile Predictor _commands; private volatile string _history; - private HashSet _commandSet = new HashSet(StringComparer.OrdinalIgnoreCase); + private HashSet _commandSet; private CancellationTokenSource _predictionRequestCancellationSource; + private ParameterValuePredictor _parameterValuePredictor = new ParameterValuePredictor(); /// /// The AzPredictor service interacts with the Aladdin service specified in serviceUri. @@ -144,45 +145,50 @@ public Tuple GetSuggestion(Ast input, CancellationToke } /// - public virtual void RequestPredictions(string history) + public virtual void RequestPredictions(IEnumerable history) { // Even if it's called multiple times, we only need to keep the one for the latest history. this._predictionRequestCancellationSource?.Cancel(); this._predictionRequestCancellationSource = new CancellationTokenSource(); var cancellationToken = this._predictionRequestCancellationSource.Token; - this._history = history; + var localHistory = string.Join(AzPredictorConstants.CommandConcatenator, history); + this._history = localHistory; // We don't need to block on the task. We send the HTTP request and update prediction list at the background. Task.Run(async () => { - var requestBody = JsonConvert.SerializeObject(new PredictionRequestBody(history)); + var requestBody = JsonConvert.SerializeObject(new PredictionRequestBody(localHistory)); var httpResponseMessage = await _client.PostAsync(this._predictionsEndpoint, new StringContent(requestBody, Encoding.UTF8, "application/json"), cancellationToken); var reply = await httpResponseMessage.Content.ReadAsStringAsync(cancellationToken); var suggestionsList = JsonConvert.DeserializeObject>(reply); - this.SetSuggestionPredictor(history, suggestionsList); + this.SetSuggestionPredictor(localHistory, suggestionsList); }, cancellationToken); } - /// - /// For logging purposes, get the rank of the user input in the model suggestions list. - /// - public int? GetRankOfSuggestion(CommandAst command, Ast input) + /// + public virtual void RecordHistory(IEnumerable history) + { + history.ForEach((h) => this._parameterValuePredictor.ProcessHistoryCommand(h)); + } + + /// + public int? GetRankOfSuggestion(string commandName) { var historySuggestions = this._historySuggestions; - return historySuggestions?.Item2?.GetCommandPrediction(command, input, CancellationToken.None).Item2; + return historySuggestions?.Item2?.GetCommandPrediction(commandName, isCommandNameComplete: true, cancellationToken:CancellationToken.None).Item2; } - /// - public int? GetRankOfFallback(CommandAst command, Ast input) + /// + public int? GetRankOfFallback(string commandName) { var commands = this._commands; - return commands?.GetCommandPrediction(command, input, CancellationToken.None).Item2; + return commands?.GetCommandPrediction(commandName, isCommandNameComplete:true, cancellationToken:CancellationToken.None).Item2; } - /// + /// public IEnumerable GetTopNSuggestions(int n) { var historySuggestions = this._historySuggestions; @@ -190,7 +196,7 @@ public IEnumerable GetTopNSuggestions(int n) } /// - public bool IsSupportedCommand(string cmd) => !string.IsNullOrWhiteSpace(cmd) && _commandSet.Contains(cmd); + public bool IsSupportedCommand(string cmd) => !string.IsNullOrWhiteSpace(cmd) && (_commandSet?.Contains(cmd) == true); /// /// Requests a list of popular commands from service. These commands are used as fallback suggestion @@ -209,7 +215,10 @@ protected virtual void RequestCommands() // Initialize predictions var startHistory = $"{AzPredictorConstants.CommandHistoryPlaceholder}{AzPredictorConstants.CommandConcatenator}{AzPredictorConstants.CommandHistoryPlaceholder}"; - RequestPredictions(startHistory); + RequestPredictions(new string[] { + AzPredictorConstants.CommandHistoryPlaceholder, + AzPredictorConstants.CommandHistoryPlaceholder}); + }); } @@ -219,8 +228,8 @@ protected virtual void RequestCommands() /// The command collection to set the predictor protected void SetCommandsPredictor(IList commands) { - this._commands = new Predictor(commands); - this._commandSet = new HashSet(commands.Select(x => AzPredictorService.GetCommandName(x))); // this could be slow + this._commands = new Predictor(commands, this._parameterValuePredictor); + this._commandSet = commands.Select(x => AzPredictorService.GetCommandName(x)).ToHashSet(StringComparer.OrdinalIgnoreCase); // this could be slow } @@ -231,7 +240,7 @@ protected void SetCommandsPredictor(IList commands) /// The suggestion collection to set the predictor protected void SetSuggestionPredictor(string history, IList suggestions) { - this._historySuggestions = Tuple.Create(history, new Predictor(suggestions)); + this._historySuggestions = Tuple.Create(history, new Predictor(suggestions, this._parameterValuePredictor)); } /// diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor/IAzPredictorService.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor/IAzPredictorService.cs index 31f22ff624ae..1b07b81657ff 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor/IAzPredictorService.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor/IAzPredictorService.cs @@ -34,23 +34,29 @@ public interface IAzPredictorService /// /// Requests predictions, given a history string. /// - /// A history string could look like: "Get-AzContext -Name NAME\nSet-AzContext" - public void RequestPredictions(string history); + /// A list of history commands + public void RequestPredictions(IEnumerable history); /// - /// For logging purposes, get the rank of the user input in the model suggestions list. + /// Record the history from PSReadLine. /// - public int? GetRankOfSuggestion(CommandAst command, Ast input); + /// A list of history commands + public void RecordHistory(IEnumerable history); /// /// Return true if command is part of known set of Az cmdlets, false otherwise. /// public bool IsSupportedCommand(string cmd); + /// + /// For logging purposes, get the rank of the user input in the model suggestions list. + /// + public int? GetRankOfSuggestion(string commandName); + /// /// For logging purposes, get the rank of the user input in the fallback commands cache. /// - public int? GetRankOfFallback(CommandAst command, Ast input); + public int? GetRankOfFallback(string commandName); /// /// For logging purposes, get the top N suggestions from the model suggestions list. diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor/ParameterValuePredictor.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor/ParameterValuePredictor.cs new file mode 100644 index 000000000000..d42710a69205 --- /dev/null +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor/ParameterValuePredictor.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation.Language; + +namespace Microsoft.Azure.PowerShell.Tools.AzPredictor +{ + /// + /// A predictor to learn and provide values for Azure PowerShell commands' parameters values. + /// + sealed class ParameterValuePredictor + { + /// + /// The collections of the parameter names that is used directly as the key in local parameter collection. + /// + private static readonly IReadOnlyCollection _specialLocalParameterNames = new HashSet(StringComparer.OrdinalIgnoreCase) { "location", "credential", "addressprefix" }; + + private readonly ConcurrentDictionary _localParameterValues = new ConcurrentDictionary(); + + /// + /// Process the command from history + /// + /// + public void ProcessHistoryCommand(CommandAst command) + { + if (command != null) + { + ExtractLocalParameters(command.CommandElements); + } + } + + /// + /// Gets the parameter value prediction from the previous Azure PowerShell command. + /// e.g. history command line + /// > New-AzVM -Name "TestVM" ... + /// prediction: + /// > Get-AzVM -VMName <TestVM> + /// "TestVM" is predicted for Get-AzVM. + /// + /// The parameter name + /// The parameter value from the history command. Null if that is not available. + public string GetParameterValueFromAzCommand(string parameterName) + { + parameterName = parameterName.TrimStart(AzPredictorConstants.ParameterIndicator); + if (_localParameterValues.TryGetValue(parameterName.ToUpper(), out var value)) + { + return value; + } + + return null; + } + + /// + /// Gets the key to the local parameter dictionary from the command noun and the parameter name. + /// + /// The noun in the PowerShell command, e.g. the noun for command New-AzVM is VM. + /// The command's parameter name, e.g. "New-AzVM -Name" the parameter name is Name + /// + private static string GetLocalParameterKey(string commandNoun, string parameterName) + { + return _specialLocalParameterNames.Contains(parameterName) ? parameterName.ToUpper() : string.Concat(commandNoun, parameterName).ToUpper(); + } + + private static string GetAzCommandNoun(string commandName) + { + var monikerIndex = commandName?.IndexOf(AzPredictorConstants.AzCommandMoniker, StringComparison.OrdinalIgnoreCase); + + if (!monikerIndex.HasValue || (monikerIndex.Value == -1)) + { + return null; + } + + return commandName.Substring(monikerIndex.Value + AzPredictorConstants.AzCommandMoniker.Length); + } + + /// + /// Iterate over command elements to extract local parameter values. + /// + /// Store these values by a key + /// consisting of the suffix of the command + the parameter name. There are some exceptions, e.g. + /// credential, location, where the parameter name itself is the key. + /// + /// For example, New-AzResourceGroup -Name Hello -Location 'EastUS' will store into local parameters: + /// ResourceGroupName => Hello + /// Location => 'EastUS' + /// + /// The command ast elements + private void ExtractLocalParameters(System.Collections.ObjectModel.ReadOnlyCollection command) + { + // Azure PowerShell command is in the form of {Verb}-Az{Noun}, e.g. New-AzResource. + // We need to extract the noun to construct the parameter name. + + var commandName = command.FirstOrDefault()?.ToString(); + var commandNoun = ParameterValuePredictor.GetAzCommandNoun(commandName); + if (commandNoun == null) + { + return; + } + + for (int i = 2; i < command.Count; i += 2) + { + if (command[i - 1] is CommandParameterAst && command[i] is StringConstantExpressionAst) + { + var parameterName = command[i - 1].ToString().TrimStart(AzPredictorConstants.ParameterIndicator); + var key = ParameterValuePredictor.GetLocalParameterKey(commandNoun, parameterName); + var parameterValue = command[i].ToString(); + this._localParameterValues.AddOrUpdate(key, parameterValue, (k, v) => parameterValue); + } + } + } + } +} diff --git a/tools/Az.Tools.Predictor/Az.Tools.Predictor/Predictor.cs b/tools/Az.Tools.Predictor/Az.Tools.Predictor/Predictor.cs index 0fc8983fd371..51d9a991dd7a 100644 --- a/tools/Az.Tools.Predictor/Az.Tools.Predictor/Predictor.cs +++ b/tools/Az.Tools.Predictor/Az.Tools.Predictor/Predictor.cs @@ -28,15 +28,19 @@ internal sealed class Predictor { private readonly IList _raw; private readonly IList _predictions; + private readonly ParameterValuePredictor _parameterValuePredictor; /// /// Predictor must be initialized with a list of string suggestions. /// /// List of suggestions from the model, sorted by frequency (most to least) - public Predictor(IList modelPredictions) + /// Provide the prediction to the parameter values. + public Predictor(IList modelPredictions, ParameterValuePredictor parameterValuePredictor) { this._raw = modelPredictions; + this._parameterValuePredictor = parameterValuePredictor; this._predictions = new List(); + foreach (var predictionTextRaw in modelPredictions) { var predictionText = EscapePredictionText(predictionTextRaw); @@ -69,7 +73,9 @@ public Predictor(IList modelPredictions) public string Query(Ast input, CancellationToken cancellationToken) { var commandAst = input.FindAll(p => p is CommandAst, true).LastOrDefault() as CommandAst; - var prediction = GetCommandPrediction(commandAst, input, cancellationToken); + var commandName = (commandAst?.CommandElements?.FirstOrDefault() as StringConstantExpressionAst)?.Value; + var isCommandNameComplete = (((commandAst?.CommandElements != null) && (commandAst.CommandElements.Count > 1)) || ((input as ScriptBlockAst)?.Extent?.Text?.EndsWith(' ') == true)); + var prediction = GetCommandPrediction(commandName, isCommandNameComplete, cancellationToken); if (prediction.Item1 == null) { return null; @@ -105,27 +111,24 @@ internal IEnumerable GetTopNPrediction(int topN) /// Get the index in the prediction list of the user input /// If the user input does not match any command in predictions, then return -1. /// - /// The relevant command to autocomplete - /// PowerShell AST input of the user, generated by PSReadLine + /// The whole or partial command name + /// Indicates whether is the entire command name. /// The cancellation token - internal ValueTuple GetCommandPrediction(CommandAst commandAst, Ast input, CancellationToken cancellationToken) + internal ValueTuple GetCommandPrediction(string commandNameOrPrefix, bool isCommandNameComplete, CancellationToken cancellationToken) { - if (commandAst?.CommandElements[0] is StringConstantExpressionAst commandName) - { - cancellationToken.ThrowIfCancellationRequested(); + cancellationToken.ThrowIfCancellationRequested(); - var commandIsFinished = (((commandAst?.CommandElements != null) && (commandAst.CommandElements.Count > 1)) - || ((input as ScriptBlockAst)?.Extent?.Text?.EndsWith(' ') == true)); - - if (commandIsFinished) + if (!string.IsNullOrWhiteSpace(commandNameOrPrefix)) + { + if (isCommandNameComplete) { - return this._predictions.Where((p) => p.Command.Value.Equals(commandName.Value, StringComparison.OrdinalIgnoreCase)) + return this._predictions.Where((p) => p.Command.Value.Equals(commandNameOrPrefix, StringComparison.OrdinalIgnoreCase)) .Select((p, i) => ValueTuple.Create(p, i)) .FirstOrDefault(); } else { - return this._predictions.Where((p) => p.Command.Value.StartsWith(commandName.Value, StringComparison.OrdinalIgnoreCase)) + return this._predictions.Where((p) => p.Command.Value.StartsWith(commandNameOrPrefix, StringComparison.OrdinalIgnoreCase)) .Select((p, i) => ValueTuple.Create(p, i)) .FirstOrDefault(); } @@ -145,7 +148,7 @@ internal ValueTuple GetCommandPrediction(CommandAst commandAst, /// Chosen prediction candidate /// Parameter set of the user input /// The arranged parameters - private static string ArrangeParameters(Prediction prediction, ParameterSet inputParameters) + private string ArrangeParameters(Prediction prediction, ParameterSet inputParameters) { var predictionSet = FindFirstMatchingParameterSet(prediction.Command.Value, prediction.ParameterSets, inputParameters, out StringBuilder builder, out HashSet usedParams); @@ -169,7 +172,7 @@ private static string ArrangeParameters(Prediction prediction, ParameterSet inpu /// Parsed ParameterSet from the user input AST /// StringBuilder that aggregates the prediction text output /// Set of used parameters for the resulting set, if any. - private static ParameterSet FindFirstMatchingParameterSet(string command, IList parameterSets, ParameterSet inputParameters, out StringBuilder builder, out HashSet usedParams) + private ParameterSet FindFirstMatchingParameterSet(string command, IList parameterSets, ParameterSet inputParameters, out StringBuilder builder, out HashSet usedParams) { usedParams = new HashSet(); builder = new StringBuilder(); @@ -178,7 +181,7 @@ private static ParameterSet FindFirstMatchingParameterSet(string command, IList< builder.Clear(); builder.Append(command); usedParams.Clear(); - if (DoesPredictionParameterSetMatchInput(parameterSet, inputParameters, builder, usedParams)) + if (DoesPredictionParameterSetMatchInput(builder, inputParameters, parameterSet, usedParams)) { return parameterSet; } @@ -193,20 +196,13 @@ private static ParameterSet FindFirstMatchingParameterSet(string command, IList< /// StringBuilder that aggregates the prediction text output /// Chosen prediction parameter set. /// Set of used parameters for set. - private static void PredictRestOfParameters(StringBuilder builder, ParameterSet parameterSet, HashSet usedParams) + private void PredictRestOfParameters(StringBuilder builder, ParameterSet parameterSet, HashSet usedParams) { for (var j = 0; j < parameterSet.Parameters.Count; j++) { if (!usedParams.Contains(j)) { - _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); - _ = builder.Append(parameterSet.Parameters[j].Item1); - if (parameterSet.Parameters[j].Item2 != null) - { - _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); - // TODO: add local parameter suggestion - _ = builder.Append(parameterSet.Parameters[j].Item2); - } + BuildParameterValue(builder, parameterSet.Parameters[j]); } } } @@ -214,15 +210,15 @@ private static void PredictRestOfParameters(StringBuilder builder, ParameterSet /// /// Determines if parameter set contains all of the parameters of the input. /// - /// Candidate prediction parameter set. - /// Parsed ParameterSet from the user input AST /// StringBuilder that aggregates the prediction text output + /// Parsed ParameterSet from the user input AST + /// Candidate prediction parameter set. /// Set of used parameters for set. - private static bool DoesPredictionParameterSetMatchInput(ParameterSet predictionParameters, ParameterSet inputParameters, StringBuilder builder, HashSet usedParams) + private bool DoesPredictionParameterSetMatchInput(StringBuilder builder, ParameterSet inputParameters, ParameterSet predictionParameters, HashSet usedParams) { foreach (var inputParameter in inputParameters.Parameters) { - var matchIndex = FindParameterPositionInSet(predictionParameters, inputParameter, usedParams); + var matchIndex = FindParameterPositionInSet(inputParameter, predictionParameters, usedParams); if (matchIndex == -1) { return false; @@ -230,36 +226,62 @@ private static bool DoesPredictionParameterSetMatchInput(ParameterSet prediction else { usedParams.Add(matchIndex); - _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); - _ = builder.Append(predictionParameters.Parameters[matchIndex].Item1); - if (inputParameter.Item2 != null) { + _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); + _ = builder.Append(predictionParameters.Parameters[matchIndex].Item1); + _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); _ = builder.Append(inputParameter.Item2); } else { - if (predictionParameters.Parameters[matchIndex].Item2 != null && predictionParameters.Parameters[matchIndex].Item2.ToString().Length > 0) - { - _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); - // TODO: add local parameter suggestion - _ = builder.Append(predictionParameters.Parameters[matchIndex].Item2); - } + BuildParameterValue(builder, predictionParameters.Parameters[matchIndex]); } } } return true; } + /// + /// Create the parameter values from the history commandlines. + /// + /// For example: + /// history command line + /// > New-AzVM -Name "TestVM" ... + /// prediction: + /// > Get-AzVM -VMName <TestVM> + /// "TestVM" is predicted for Get-AzVM. + /// + /// The string builder to create the whole predicted command line. + /// The parameter name and vlaue from prediction + private void BuildParameterValue(StringBuilder builder, Tuple parameter) + { + var parameterName = parameter.Item1.ToString(); + _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); + _ = builder.Append(parameterName); + + string parameterValue = this._parameterValuePredictor?.GetParameterValueFromAzCommand(parameterName); + + if (string.IsNullOrWhiteSpace(parameterValue)) + { + parameterValue = parameter.Item2?.ToString(); + } + + if (!string.IsNullOrWhiteSpace(parameterValue)) + { + _ = builder.Append(AzPredictorConstants.CommandParameterSeperator); + _ = builder.Append(parameterValue); + } + } /// /// Determines the index of the given parameter in the parameter set. /// - /// Prediction parameter setto find parameter position in. /// A tuple, parameter AST, and argument AST (or null), representing the parameter. + /// Prediction parameter setto find parameter position in. /// Set of used parameters for set. - private static int FindParameterPositionInSet(ParameterSet predictionSet, Tuple parameter, HashSet usedParams) + private static int FindParameterPositionInSet(Tuple parameter, ParameterSet predictionSet, HashSet usedParams) { for (var k = 0; k < predictionSet.Parameters.Count; k++) { diff --git a/tools/Az.Tools.Predictor/MockPSConsole/Microsoft.PowerShell.PSReadLine.Polyfiller.dll b/tools/Az.Tools.Predictor/MockPSConsole/Microsoft.PowerShell.PSReadLine.Polyfiller.dll new file mode 100644 index 0000000000000000000000000000000000000000..8831829a56e1d74ee980cbdec6c709f8ed309ba0 GIT binary patch literal 4608 zcmeHKTWl0n82)E_Z=upq35EoxmW!eeEu}y~rQ2>R#a@=qQo*dDv%9C;k=dEe%xv5B zf_*@ui7_NTnDC+xycrW>e84M-(HI}_!RsSD7!ys5PbTOC`2A;Qx(ii;CQV4>-=6=R z|1$siZ*$Ic?5WdKLqxS0*RBzr$IQ?#@y*d9#I5&!&`R$$UFbgsv8xoX}RUZr&7{P7V=`DmBz{^pBsS-7eF8YKziE)Cdj_ zz|}24Dn>sB(Hgmq1%5Mw{gXPeHyAkw(s^>IcEcl>n8-O5_afW__lAsbzYp&;JK}p~Gv8cyr#;AgR zc(1v_a-hh*(liF!l5t}Wp`U0VT1WFG&MSa@i%}gVRm53Gq%iY8z<_>mKnb5_U*>jd zU0P39Pj??1t0N28hw;u6M3*r?4?jC~-!<*L#~NwWfXmQ%Sf^<$IE2o}504};a}IuF zdcblrm>KZ6($G%y3KM@SJ+vLR(3rwbTW?0bQw4CmjKPkX{4sp-+JK(U-u3^gZwslCJ~TE=FF!9SOg~ zDU@*u?hc!#A@r678|lr!byB6?SIUCYgjGPz#;U2yp^P3Gb8;n1JVtui^F=|MEZM$U z5R?#^Qa*2FED`rn&P>S{6!$z)$XMl+=~uH;hMO1uFwO`u@3_a8>kpfjm=dmMI`(qm zh&|)D1;dBXu>MhN(6MLCe94u16(fUAp=er?IVmh-L9V=tJn}f{BFe14T)+klyIc{3 z@k_pMW=zZUtEAT_NekUYv(uQFbsf){@wKEgFI;_ASeBO5Cxww4HEjW|Rh}^|OSoFj zvZ8E{8McuZ1!4PIyyQDU8Z^C>@nkh_sul?+#f&AgoIirs1;frIU6C^bPPCj8I?5?L zsdnqWl9u%yH`*y-8hP7+jjR{3!gOgtArQB4=gh3|!u~;K&|e@UKOB2fcqNOEN(n!A zlt0hC-aP)sj?L43hnmh%t*R)EH7Y4}ShTe<+1hw+|FIX_zH8pw*nMHo)H}PzdmEMT zBH75VX)3nvN!KWjJND2*RunnL)U4~wdkXX#*$6jtuhxn8Xc z23p&f+Bac(Maw9UqnmMN(6)b(ENWJ$PQExexUq9L&Px1nVu3G-C~VsB=?mYIGM3~s z>{W~_xR0*z-4Oyiy%u9D#z~y%C&PO)6yJCi(4?NwPm2z{)!2CO)T%G`o&8~=hiwe* zO&|8~>ZM&Ld%T>U6h+5NSK2ZiwIz7FC*1gqFWj_~c_uBRNZZ0ke$uy|0)S>v{j>U(USy;lMZHRmCCw%4?NZ%OSeb0?9E{Fkx9^hG|p5 z%c7h@zEDznZ8MDAa7!*X`2XQ3G8yZM7O#&vxY5y=%lNFv-wsFmiP~{LN6=oo6U!;m z=@{@3O=2~IJ8c~F2=H+5)kPoI{&qFEySV!pf_Z;H$ZrAe`D#djP+-*{7j{g1QwZ3! zX@(rBwn;vfg46)lgWMn=dJd=n&ei((=vCm84=oe?{NGqgN}Vp;$H8wWWw63G4Q^xw zcd$bRD#|^|h{ymXr1>#e%)+jNy&ZVvDsWndF=?+>b9l1$h;yF7M10DcGnqR*(>=)~nMuM7H@VZ39Xh!QS=d8>0AXJPVMlK00a=C~ zf`|wRh>9qpY$BViE(n64D2oaTXpjN&0|ilV0YQ*0`QG3oQ0gv771z{dzs7wR?q8&&s#)$WEjI}^fB3JfUMbM| zFQN`Rmr(vMU(F*)`1h}0Mb+-S0pC_(&4OjaXjx-5vT9u zBTqXS&kx>V^2NLwxl1raIjpbHUpN8;k&St0M!!2;(8VaOzQU0w1OQT2rHl^lt-&po z;EJDK>J|Sen}v8Qx3kn6SxeOkRjKU`imC?-=3x|<^bAYQ0S@sUWwrO&*7yx|UR^e6 z_fAxUu(W7*F4E&U1ACTkZMRpcWRJ?EJQbUko)Hl}Llur1Yyv3AAvoy6PqHPlp=}oA zY>E7u7k4^{F6<;(Jke6oM9R*z)VWZQ-4O3>iVYM%>>P7wh5}^LQBOHh@VC@{kPnhT zzO@vnb%PCk+5NewvfY`Ij&i|2c`_cXtV^Z$xU)gX#oRO=z-=w`93A9OF4n&_B6{`x z^|+WkSn69y0}+u2f{^>TlDIu8>$ZVMD%P7q4pO*P${SQJY}8(x1hxRxt#P5lWJA2L zCGY3rzA@38RN1w_N0m1xUhql*>8KM$P{ss}RfA;GMO!*lemB(Vph3n>*E{vSi7;Uo zSfoEqDe48;rR6|ovgmyI(4@qHs13>%UWX->m&ER6gO@Q<4@ZY3?IT>0K>75 z>wl_F*?SnCDl6EETJX9>ImyaMCTM*q zgL*zbtqwZ0REKJtp^yQk$aia8B~PK+$rn`QWRl^lwP2{KlIJv4;_38ip43wpc%oT? zo*JR23j4HSeq)f|o>+sY;$my#fK6-?Yq<`gqNj*L9bf{rHece|o3dl$4wE>rzmR_x z@lddi>U_tAG22PoMakRk8|uUqrCeDbVTG{wT(t9_o>c=ysi4M0vyEO;DLIfDJ(Z9= z1c;BEI?ByMNOvB7bUD_u((YsB>W%9n01n11Q9B~N zaSa1e3|Yug;L#L_?2C~$|F!kcN3v^?x9H$msMi~8AJwhj2eBWvlU&Q9Fd++uhp-Vr zKI+v^zy}YG8l&8WIunrCR{3uu0JLpDYix)UQ}gMYH&NGIsoya2u{bGSZ|M}wZvNz!49Y)%85G(JJ!D# zskOGcFQC-W5^NF60-tn}y^b=0?sGaQf%-Nix5j2pf?U$h>csX%VyIkAI-N|gkclX7 zu90Pb1Z&`dxXTU&OOSAIJ#?i3-2<9lov8@~B&ux(-*EJ8YJj zH3`bSPG@gWgQZBNxCVEchTKMjqmXD)o`XeXsDsc2MGI)s*96l-p$3G;P?TQaxX)$6KjYm$SOCy{lKWYcv@~{s9W9rIJ)r zF_Aqp6BSSHHbk|FZ=>|HJ=7Sp6T$XKA+1w(qBcqry|W#h#e6Y%hfsE{JZO(;pM$ie zUDVlN+E6r#Z;cxKWGN>iN2ZJj9t{;EAou5Z&J0UZgQ>O3cx53f6gW(t4l$%q7k((u z1YJ5UbuE@Q+gRLvp0ej(M;6M-8D)(rON;zSU7yE#hYEz|t>b$Br0o{l-4S}pMY3KD z_b7R&(1~U@M5U_K=PyAF$CwOtW6jH(gw^*0ChAb z=AoLC$~;wsA>YXUy!#m#DQ8G@svj9)NVL#gXX%)lOGI+4?~&`SFxQ`BLnT>v#TXHb zOd_u2d^iiq_$H)cyT(?oQ(2h`aoxL+$~t!!XM#>z+O%!7on^D;8T>lH_W~%mRhPwL zS~|px zD5;`4n>W-FHtEaiIr7=9@iA%)Iykj@ax2a z6=2h2Ws6MElnrvW{$Ow)vP422=t0E$i0v+`0gdxO26!O(b;J{K)0p`eX? z9RSh6zYb^h+cGPL7*c>L@15?{2M6#LZh;-3+eLE`5i1bRFWdk%BH$oG zU?+uLQ5YQoN+Frc;qln=<3v36mmkOA@$&Ey_A6GTneGXu3JF6W$@v2tH*Q?th`JsJ z1to-D(;lF50#txx77YQMl6m78Mbk6Ep$JGfI*sWDr=fGNxrgI-+qq-$yU718U>I+K z;NOJX{7X!!p>wDGw}&&XK7+r9%pdRhC+OXE_)&Pi4u6%`{5L=VizDWy@w-po-V))6 zzFqU@>VRW(T-cyG+WhgJe*z73coNU3Fm$%VtAu~D&+-;p185zh!C?pwR^g{`6?7LI z&WxsjrGB!k^Pn^e)?*UN&@a22fzy>B$alh@#Gn(+J&D5SCq6?7&5N7m7bfh7@|)c-%Ge!l|~wxh*&d8se{i3PyYNa4XWbBUF{^@^iMU*I=@=(e#NZPGIaB z>&;`dGXw1554do0B?BCsp{YyS?Y3xOtY+&T2O6qgvyGpW9pU5+Z#mx+mR=q-ReH<@ z`cda8fE*KOGcOsNd7su{5AZVhH~ds|4C`nw$0NP&wG82G6S{=nTuj4*PatUac=H7N z`h5v6NGVHbRV#u05gYc2)Il_}XCxDxi0DZx;%)_LG49~3lii>qSr@g>3s9w!jrsE+ zZX$pWf;=OO8kDYwPvI>`CxPbs5QOzjj-$h%3Ayl7lJIXUo;K8p8@*&Lz!(yt zS4s}gOFAW)aZ)-r4QSs5m2S+Wo0yp`Fy`{`Fl{3?X%%H&z zGt=xeS7yd>9A>5w&AHCaCv;DkLQj}7`BCw73(Tnn<472+h4$~O4{5i?QtzrOF4b*( z2Wh>Y7MBV&tGESw>1js@_Sl44Y* zz&OiL|H8kZP-_6yiGxNd#OWB6hFJF2^dOU^*5AWiV=Urs3${wVa4%w4p;@BifDsse+AH$t#l#7GRIf{z6rtKHDf*jU>0H`7Ozj9AKHO4cuTH{r{90$?5o=Wt0 zk%>fRRwhveiw|iai(PnMkj{h@UjZ0cDsQM>~^FWzr3v@1&fD zE7GVJNz_7C-ry|!Ff(+2+A5;~uohuGPn!({no}0I6?Hz z0Y%_IU$9=*+N=)MBMk{C5~$SkCKa@8XqC{%FPVdU;U9`boeWie27h!Zw}a~h?_1~t zpk0JN7^eKAUvL-hCW%c*}-5 zE|({IGeIbCiUw7L89PGsi~;FD4V3mB{i3bwRz*C{`q4(3X<-$nPydyDC7N^v*Ae}$ z?kh8?i1e1@BpWHkd0W&6I|;?ouA)-&I34u@YcVD%BQnqh_chRLY@NH4v^!DVljT~wdnf@LQnq~oD2zbKaC&_$hBLAr#C@|M$weTRHSXC@=mh~ zkY|mF(PR}~3ZK|5#(NhTU#8K@B#hTE2nQcsT}xE@ev4#wYazw`44#@b|8`{!hl_6j zeJZFICRC3sik}ESN^QYBN<9kL;Oe-4aXEFXPj6WF}{QGe4;u%o;&j;)7wG43+sEzIG zY?=2-W$oC3GUw9JzZ-DfR`FAe9V?#8OT745ULw+2#Mfnq;s+Mb6H4&{TuMG1eU6_( zmMtku|Aov&L@XOtDPBiI9Cor81|zmA#%4x(Xdktsn81zp5VK;ljxuEv)%j*Uj0Na7 zFr4+afnRYFZ(|A*6KqDJ9l=Go_H zB9o_mY8hn+zo_CA6nI0{UdR@<)UYaDZyHShn706|09XTyXoee6iNyv{b>?6i?u$sx z?Tje90;(qhzr>I|00(Q7Fy?RXfC$RcK(2Y%NtuQ0J%~-v-sHZNadt+WbUob4fhDjb zYk&>&PA@Z*HSOu5nT)MW9hBY>zN6^y*z(Xs#T3)tzriYZy1wBv_rW0xEBU# z8}U9xSt6}jtur_WZRvRa1E^9(1};RZPF!5#G#uS|cff35H;bU%v}3{7jk+*lJKbU! z<~+x#sN`Cd*5Nc$*I~TrHm40Po6`c98cNn(jnlHuFk4roDv(N4_irs3Q=FMr7d0Q6 zt1+y!lNP(mu8Rzu1KEettxhZFzOqgh9%-aos7~v;B16MWD}tySpQbN8odsE8BKWGweb$nC(Np^RXuaE<7a$?A~c17K@F8j^-b{704${G!1h zlvTXOqB5Lb@;b+_}yW6r_(9nJL>Sy>G1D|;ayIbgzu!oPtf7_gyEB%N%O9SDN=!z zHDj_f*)gqedWthy*OHmzoGF=EZRXLLQZg@DP)cv%Y|*<+A>I^IJB%F~&RUHDN7BaF z%jUU;=Bd{z%&@~lP09v4i_|Lry@;r7YZSS(?CEZ&8xwtzHiO82NduB4K&}Z|{!S^E z?7@1R9@uTRA(M__i9p(dgj5Ta-&aSztprbR>1;XgD^!Xd;DSk3EA2XN?+iSDmGyqA zGZn%~%ZMuOOl_`1vtg8BoFlXi-kzoCb?Ir&wBByhW!S+LU;;n4@K?GdU&Di8+@rjS zn5>Lt8-|N$Ib+;cSx+%zdovnqV7yGaH3Pn)UhEWTfK+)j@}k3R+Or1WT|ml~`N7wbf!^bt`2$xX87%FgZ`TW& zoP$l~b}NUVZ?6oQQx54G9x|>R0>7jp4lI|7@*N*LGqUMEs0u@dy7U5P!Mv*|os;Xe z<3^neorS%*QrTf$khMy81$sWNA2E{YZ7gRS(+?=8FTKcF1kVmjN30UcgCjk>cEocr zr_Us?*jX%_l=Pya;(E6*GepRzM(nAk5&s4LYJ9WhoFC8MKYR_l~qHWNksg4j?R>wR<+ zVwgm_8p&erM0Qrh)7v`R_IAK`)q5`-vj?NJgz8}?wf`DK=tc-y%%tiDRBkYs!;U^% zFXx&$_!%f0_F86meE?F_gA&ZiwiqJ1-e~Y+Y2q-o2+sx+p`5?}_v7Xy?i0{o7kIV? zE3~5Jp?Dcossl2`FNgPS#mjLoej9u=1rG3aWt9#R#<77Yzaz+|UwjMwV(%QQyugu} ziIrRo0Kk~PveN_QcpdZ-?2g1EP{KM@zDXyG-OG44Cobo*c_cl1u>v@y5 zr8aRU3@w?Ri(n?bJ>{(e4)xs<9BiASheBC{(bsb1h(#GVRH@j!N2!ITXjA=R4OajD&>lvM zQi9!4DZK7_DYtH2WEfF?5hd5%6b<%aF?ToB2mA4+*be2fEx<5hI!qyp$4GD!RDlPE zVHv-!_$9FbKDsv}DAdT@(GsVG_5!(#>(4hL3YlY`=yCLBXdTE_*F1tUYT2Wc-Ptv|b~$23(|xeSWA$mUkH1Mm}Ts!Hdqz zz-zd5Z=;so9L9vES}=!^;C5!{4u*xCAZep=A+7D+$pBUOA)7;CFb(N)&llPf?h|!X z2I1DgB%}}tFu8_#(%$)a&|53B4eNKu7%$;MMYhT`tY3nD+(H*ydY)%J= zJ=k!tE{VB9XlbTxkCp9KEY#eW&3Z}Q93+m_`-aJ?X-825?q{fG6gcMoGHTjlZb#!k zl+B(h0o$)*In4uQ7G&=K18gvfRlpBWEVfnrke5jDBVMA#4Y(+)b2S!iUIwoJyO50S zlx)$I{U(or&ul4g@$bb{`cdC8Kn%W*OK;i^?#9&`m<$ojvIO=t%=;W=>i+?P8Y;?Q zZ2vu=G$#7*#Rd9F=y;g`jZm@&J!Bky&waQL?#B<(jRqK2$OJ64@}k0&NEA~dQ8Ohn zYz4;Bq7*4fJa~ZdW<*-Ox;UyuJ?5d!bgEg;*hkH|K+m68u9ISL!B2Ukyn-!L796dy!B_;a-U?&O zOntiEbgcCm_f{0K?p4#a#l^8~wBB9D(zZGOM{Zjv4aXMM3UthhJFyT|nB)(CUec$<^>#Ivc^=#nC1V9YL*!hf9sZY|WlBRYd0@5@J1hJQ znJ>VO*8~p(*lZ-SDkaj>mS|2gnLsiy?PAmKLomJD-geR7VgK}YAY`PGML$u;eK?#W zFZm9H2af_+n(yjB-8l<=3FIlYaTP6=Og!&|dfdf$?2MCWg!nK(PoN*QC0V2gRHD)+ z5ErOKpkq)x00@*E_%MCll9u~-vaF)la<2wdCR80(PSZ?9NMY-HTN_J+#sgc!j*djO zZ<6PZxcAN57LM#1i0;kT?rFso2kelY(#P$d^N{();2;~=QpOQnj|R2En6xb&SC{Co zgGZp}B2U2;Jsrx%-IJCJT}=cV^Z~q76b#0IsIbdTSs4KbP(GCooOV|$yf{lX1Xs9n z)&L7j{5j59N`G_?>;vs9?PCH0xhY^*)OGEUHPHjXzzZgQ2ym579=v1X(UbrRWuv#~ z|2ZvYEU0kDenC5oWM*+EK^wL_N)MaLa~Vg)BG@&OnS}v%*(sEMmE&(#e5Chf;B;_I zThrb!P$>;`#zBQ7vJ-FL;aD0oxlBu8H&j2)ejV_*@P{7&-DJD zh`bLnpJfYP*%B{_4R#~OrfozO=7zZ+hqf^unLx&n>JcylS_sO#!aN?Ld1%8l14`M} zTI@tT)Gv5FY(`kk^sY9zh7!!(rxPj1^df_or zJUwNl3yu5yfxo00F9wCCK*uoFm!PM45iCenJ+L>kB2zT9?MjAL-;xY1kYkF_0_%rc zpp%Tj0`+J@jIwNj?6fV8A?BxGf}1ru&O7^5UxAvYx+@JZmo_5O0HxCs8yv%FBV&VK z(47qTG8&80{f+K=xZ4rNwOb{~T_v<{Xqw>4wYt2iKV#z3#^Hael3i}n#%rzm5J?2_ z7=H?`?r^)_Yz*Spz&IBWUthm0x^89u4~TE3VDL$!@5V!Ne2EMeMQxc=d%puqx=IjJ_00GUtfYE!>V53#fuz8F_IrYniHL`4(utqokqYWE3 zA{<+TXsPw}Z7aR*Dk$4a4wM^V_3VXZ?7p&U_q1dnW=RHSCq%8rPxuucD(g*6N7A{t|JT4YjQe4fI3ILi;E-Kh5_MfT9nE^U_m(Ij~^TX&wqwL9G;*5EWHYw9&-ubh-N3EkUq+Jiea_NL{Jh5Fn^PCztg(vFvRnjPml z)T$0F3bnMjPlGvDCDT~jk!>P`gZvwigWpmBsLa7O5v)cz&DbXLAaX@-B#pH+@YmaF zoYGJ!tW0dabamny5!D8fD>^YgIuAc7ZYYSrAeE<8J)|E2ZcjXgS8KBoLIPjM^XV*wcfmUP_?bgjF%eK z-iPb)Qn(TKDDo)n-E0f=qi)O5j&n~c#*hc2PsW}IR^jeQ@$0-qg9AZSnAf@rk20*` zxMwcnz)yl-lZqwn?b$N4;tw@b()Btl_XMWs;gudVp}0v{?(uSC{N9*)Euqw6(NX_1 zD7mC9iybhQZs4TdC>#N8V9NGb5CXVdaJ>enLkwUbw85NSi}5rDO_af$UyGTqF(@#D zxv3UIdq!F)XoGpI7Q^*JV7?M!{-+khHArAC4>8y~U7fF~S{_W6nzS7BnpJt9rZHEC z7_SzCE`Vu$Cd4eP#mv!|^FquKwHRMxJ{w}rtHmtPnDax-t+g1gk3yb`{x!XiV7e7Y1rEV>RZ|kk9qCnEWU(9UAkc zkk6g9e8y`G2IQvP@2SO1(3nq!n1^aHQ#9s`Fs;XHF+CcC0jx>u@3ojNjkzJjwAnS~ zwMb*o;TS$sYccO@8~b#K*|`?;w8s21#H^~t{ALuG-;M&aZWNejMuGX=C@{~C0y8uU z%yXl_JUN8E4;&05Pk$|DoW_h)zl!Mmqvek+UQ#H@K_D?{Mxn*naAlin)?j)_;5w@DhWbCToUA#m$zAm$`tqRArsEWX>C zo{>;%Zk6VH+#;b7*K+M^qPuJqZ7tn8QNM z`L&q;ZGM*V!QTpHzOGj0(fDG<&zckRd7ze$@u5caG3&JsNA&kc<7Z*UhGj7+l;_D> zdEy!~qCcC^m=VVoNsS2y;f1$q(;AIW*QEJ;GL(5^EuUtM!32eA-<(8M+hGr41(bOo z(cf>;m@Pv-3v2nLHD<)I#ed5W&FZu|!=~=gT6x+v=G0K;VlBq_p(EO}>EAG+V{~{` zEg$2no)u#5uf>?Y6f@C=&m*-M(ced(8*ae8yIvskPOAY0L#7=I^zbziG^fb2k6fn6pDZ zc!RHc?7l%`M)ENSKhPLVt{a)B)bbh4_-r)({%FQ_+2RV|WnH_e!NpAdM_W`O^@U1GehV>0xfF0c_AXyZRO$lQ8k zJW-k|JwV4Cv1($oD7)Da#w7OOAsRDcwL4B@MyygNY0QXKsx-Yag6YWu4rCs&+TEzr z8qv&e`glw*#2Mv5cF5@{_JEaCYepj@_Tt7fJ2$k%+p8_n9yH#-h`pxq2KqylJYK^` ziy7A=DDK02r9-KuGJfLRyNfOG*ox4VU-A33OK00yB@!z|IEk7%-ucS<$v3%pF1JmwaZ5@TYgg-t5FCf(SI|8g}F13 zP`vBWlLk|MtX&7LdHUfd|7HXdNjCo8h?ZX=$nN}|t#hZvyT0{5`!xHzV)=uhz5`!& z{5M)e+z{>|or()v9_z70ye>%DCs=$v~{ysPJ- z>nAXco4441tlx%ZF~*EP{d9+abF+RR!oMSeXsS0PJb5@od|yjspb!n7)yVdp5kBIq>(Kb2UGl3 zEQ2r_74OeMNPdnW>nFaQTl%1AfAZAgRAyyrKHbCQp1)z2E&LxD>EC|(2i^XWh9eRF zg$|hf9cjk9_P+DN9zShlIrm%Jy8b~%O7iq)ppf!E6Xf_0zT}bjA$#>r^S^4e-}Bsb z&!2606X6e0O<$B4u`QPL`mT}wwqO1z=T9@dDZ1aotQ;%Ii+Uf*Q~r*^HnW+=8+U!Z z&wmM0GT#%AvuF9|8U+*K--gul({p*eKeSgk=3;efC3?lp!po{#|2#$C4|IA+Kf5&LC^VTyK`YTK{RtLWy z=9s@pkk?*w@!_UUOj-Z(o~BOhuhuVPotSy->K#}ou3NF=Vt+wWi$|iEP5vlhvCYf7 z?d;!eH2JmbAKBS&H@PAke;bOmK#-r?HL@!+l3DrkGM`^!ppw42;MHaRy>b0Og#RwH zo|G65%|38fzYCU6fMd)JbXmx&)9fLJ9G%<355{5_1w6L+0>nEy8;5*6?NnC8$W$X_k{ z=p<7oroZ7I$E>X0>XIXw+}Ta-tNmXgt5m|g)eDdG?={v)guep1%RdJx<6X;-di5y( zG}G8zu-iSyh6YBS{{FP^I|aGNC+G#j~ZX3{C|F>ESu{GGnD$oulljYa=8 zqtin_Q5^KIHZh3sk0Dll?I_&(&tLs%|9+FF zK09`<|4kz<+4!&3135vEr``Fx^O>h3yYBpqKhsG1&7K3#_miebiSVCdo?b@+@vil6 z-g|+6lu_o-E?9G+e}Jh~l-7Tb_58`VRKOv5K^cH_(R5KyMU(T%D2Tt*>ryjlHHh-}(_T3LX z=60W-#$a;f=|4urenF7QSAKODd7nS?@!S2KKqu(Q%iHhrw=>cb;U7$cJWOJI)>`%* zf2EOr`c8X(&%e+VGe!5WByuZ3{^ssK|CsXMx9Sh~FpWihuiWkLZFKsL_}M@3Z#AtU z5&oXgUH(IqRJ?1<6F<7of7t|1nD(a!{q4*Hd5WC*rv!P)>HQCr_tckH|I8m_M1J$z zg@^qkOg$vRf1d_&wZu5_!%si#f7xj9H<$nA5&s&KZB_?=4_5C_3i6L%?0(VIiCI6H zy3W*z=g&Or=d2U%WfwojI+0m?=wtqiMm!Sz=UMKvg~jsUT>Y5;fl2I@?>+UHKgN^_ z+4ysaObGI=XYPKS8S$q5=@;D=L`CA2f%og`N%YxYDvyo?+#^Gy!xX!=N)8)B{>{{hqmS6;Rc58F z|Ghsjxm~yX{);{~Ux-Wz=U;#Dv9d1@MEC)%@kU|t%240S{^1WKQO60d`bQfz_1}HnYrX@YnwclUpTnY9E-{|`;^$uXuQY*kpFI38 z{!1nyitZmmskKK1%jcrXek!p93WD*q?g4`Mv_ z#M}NuCh&nvqVM>4`C6nQPrsWM{v$zt`HATJFYoxjF}j&@&ft4~#AJpDKg$@O zlNeLpJmVuDU#Spw?Y(b*wE-b`^j3!PX zF)zd;u-iow<0MWIBDd{m;#+L3nuN&x5t_K3#P{%H7q~F4iI0)^vJl_JI7t(~OX9DD zSPWCYibNc%f#_U&*T@ScWIR^Lfkhb{+`5-@M9NF4T+DF_$MJ=6cT?x z;?qLBCnR1+;*W&*Y)HJA#G8cpW=K4p#4ibvtB_jG)g+!J#Ph>4!mDU1f1D6+3W@Vc z+*^pThEnuy64~L{1+ETgp3NlU`*0vm2$3JKT4#jFbzqJBBZ>SLoL%5X4^4cM#J}Lj zF3b+2-$&vzLfknd-az6{gt#gseu2bWg~$yZnrD&3uL$v+5P1xVctk>vh1uMT#1n-G z_9pr^B(Zr2x?#Bu7?_u=UNURqkC;T|nLE`s>_}7qlE{RtQF*c^ea}9}fUhG0HBpyiO zCxy6INZf%$%ufP&d`RS&E5BTbmxsjhByKIlr$b_l#K}T@DLSq>;-MiiMPiQ-PYsFhz$M7Tu#wHLg~XRg{188O z;r`I(e@Wu2Lge-(T@mgk@hKs49$OQyCGmbCa$;W-FCy_qAwCc$bS8;k6ymEP@n{kU zg}5;!?n&aYLhNoS@uYK>Un#^rLL$HamtQ2rVo1a%X;gli5FZGM9QEbfg!p<${4 z8^tap(xrrcLn3x-fH*xQK0x9+Az~8FWbR z((8;1@!gR4B8hL|$1aR*D<$*`64wiHZbqFwVV4p_=$KiTEHeh^a98k4Su6h}?9hkvEa}10ixZu_k_r#Os8} zZOEE<7Ks-Nk$Y4%@i-Ds7ow9X5%JEN%C8n8caLZ!J{P6(csmUuajTjpPA74`5VUEmHgjl}oGRemFW?7}0VNPi&lH6e0;t42OS;%|lc zLWsPF#0Q1=UP$~ViMI%m3pF}A-y_Q7MQ0?mWwt~-gT%9iI5#97N#Y4Y65rrh$n?aEL*BP_D3S2>p~*-z^FWyh(P>tNW|t)mB+d%h}_Pp6MB_IENg?v z{hOMIEwn0+y{#Z}!=@%;x1!4bREV#JJikpMc1Qu~w3m>VlX!&?cMXYHsZx0?X#sh3 zNc;qee0>ihg~a_xJWz-?gv4!0#Q7~iJ{}VLNSrCe#Mn~mV@Vt@#JM3cN@7fiTm;iO zdJ8Ki`G4RC#t`-h>q&e;h}`6^k&lu1s1W(agC>5L#P0}^+x#{0DiXgTM84CYi5HM~ zz7Y8`gb;J5d1qkwSxPr|tam&d`x2kr0p3A&fp0u$@Gjo2c43cFc5(~6ZS2C?;bYF5 zZWnG3A18WU_$EC6#^d|&?d^?T>)1xGd0eB{Fuu`?ci@}x6H4DxodmQL^^RQT>&qc;!VKW@At-NYllnu1&T zo-g^kyWj_}PbNUTeK-+u8}UXQ-f(jo@J8GN@t^~#Iq@MUG1NYkPIg@MO?*$HJ5%@r zB)_&h+Y;wT0+ZKvw-^2@l(8)dLm5~2fE0en4Tn}xrZJgxv$xtA<1}9Z*B9S*ypw8Z zaau$wCn@jF%iDVRB3nzwNsiOs@hX2I6Yure?w`OA--LD~L%1*t;PGdWdz8}*@$tb) zXAH#u5><}{g5>PyjntTm+ zv5M(LjV!?d(3E^?tMo1|PTVL=4_liZ?09=ye?t#h;A`eC!0g0~1eFop0emFL z#Pga|%w1G|7R^;21}C3_)h9aXvKn6O=_tM@tiRbAttk0KMad^(@_wi(`36(+4T((@ zIN$I45)`z3xW{07)Kf75G$A}bLp~8c8P|#U>%kw&f=2?uVB`}~*jAxG9X=b^Mfmga z=PjAo;4Q&-h!&1*@aEz8#ku&KiN75FrsA&~f0OVxp>s?Fn#2aLwW9$|VuRN(p}~uf z#~DNjlrte?s&j(k_o&bwK7-;P<*S2c%kAuN(*~zWs$Q|14uiw~6Bl{WuOM=svI=9i zBsYhA=zUaS%r^5YLOyiWt1v&%dsMy}V(6q-VWw(%t`9N);cJ2at!?K2t?l8X*|L3` z)(?!#l*J}qpM$f+@>&>THn9co9?b{#V))RfuF|u4#cszCLl?UWV>a}_^bDU(ys|Y` z%X4Xn*~IH=W_vhxz!*N9jjl>-jOK%u*kCsCirr|oB$xJFg|_TDvSTyUfQ>Ww!xW& zD*f!Q>*=^qhg?Ld!kE3uw}yN;BUy#P2iT{(Gi1qCEIW=*ME#YD{k^4`*qs`V)< zQJC`L{)s9KzJc+v@_brj(8L%%Tt}?pgGxg_sAdMkRmmz04j?0DLs+JqKCZ%?r!h#< z@Zq+JD$Hj!W<))ouQ9iWX>k#&iq8caGvc`O!cnC4xlv$t*O-5X@@(R>8!JYE*<%zK zd?A2(9x<)GMuAy53e4W4z~DWukCg{6g?%grs}UcI`Mk!A=!ajbF?WY$!Bx*H+qgty zaL9qNLvAyw!d#^>-wXM0iMk5&1&#TBh~bKL73QW73-!!}u`0~BH0J#f z!*#OZn6!vQmaQ9#p#0@|+T4xKFYQWBdp^ z#Bc{%6~_4KBevhh2j3#(!~K(0d{%3DM)cRryv2wZ)5ecD=VjW1u23Fs@~o1_v`<@x z7;ed{!kDp6EW~g(T@}XoS&0zC&2?26<2$E94EOI7-G1cZ#ZUcAL>YHj^2#< zM)U=YZI9@08r#M&!PpzOR1Hse(AYMH2?oPmTU8ii+i>p~B>=y35;ls^cRTyKp$A%bgRI9=mo5T>n@Zr9-DvYto5i!OlF=R7*xPh&T zkFm+4Lk#z`Rbh-x9u;D^ldTG4Y!XFc(&B!|DvYs73?&SP+as$m#wGzZ81BHV!Wf%8 zBgAk+=5Wl~86}(S9^|ke!-*e;O+UAT4TGxIJhr_>K_6 z&5l(VW5IWZ7;c@c!WawwL5Sg=%PNeq;JZQ$cW_o=j0N8lVz~9Q3S%r73tJ{%++A9Q zF&6yY5W{V$RTyKzw}%*RNUg#c3&!G(N$b$sd>IQK5o0VE6VQea_s&+OWi0snA%=TQ zt1!lb?+!8C@H!l`b|!7$S*$d!ofY0;Z8K`g{C$y&+14Nl@|N}>L1J2iG#>Mwxe)0B z46;qEB(hx`q)}E9X=;N^R}=9;@tyd9Lr(0XhdXP4zu8&%;4g1FSIgnm_VS zh?;gl{9XNTW~nE2Q*zkj`j3AXitG{`Ku3phI@n!+9eem$OvK?l6(hYBRV3eIn1|%5Mf&*pGmCx{e*-b0&6h zF*03kPR596Sz#iyi>O)!Ua)Uti{%6}0S4MQa47g2%A+&Y*JuZSXYuTbA8(At?M)4G z3yj`cQjQ!e-&Q0i=|Qg}$c`qwbd+_Og^f>uYrTjq3`f`XBGTGLr$vme?Ur{! z$-1?@YwO0xxKa7r$hM|JR9d%4fYYHUU+JtE-VcSxv~NbRwOTN?LD+w$mQ$|Cz%^K9 z&&+DqHx=L55066OKBVyc=-UxdgLDKrw*a=uqbXYI@TKcFQCdBbfvbgUT;F&Nv5Sw@ zw>VL}F_D>-N`Mlkz_SVx=D1OBMJ#be@DFfFM|IRwI{Vv$qOx^-O7p9TmH+r<$|SucirRKsME zSuhqi4(dhQL{-Ji`R>7|OfgHF4nLgdxIv%2O_5V>#NILN;6iERpaV4Tq4r>t+DN(w z=8@&PA}_jr3BjCgA`}s`J0b!$wnU78Z4fY077(ZGT??tYHIE88i}OpIbr2u5%=rhQ zh%zy0Qplw14P&Q%L)4^qsB{<2IQPRIU^+vR8orP&W}|8AL@%~BB$O3P69?q2VEwZ* z5~#f0b+}G8Ls_t0&TJWEr!c7$p$cKNuCP5!LTsG}7AngWbzbdGz3XT`80)IcCO~iS zinY20u>*m0S01k&(Z|e5fZn7Bw!#m<1T)gNZy2ti5=A)%D?!Pt_w_be$aSuRT2APruoZo!H z2!l^m>7mqtc!BMR?9ysaw;-8RippD?9^C zpWB79-Kip*RVmN5c{&tW!J4E}k|)I@&kRoV8d1=p!rVQ4NO&hG{hcfFC<-o> zFEwthlP&uVW$|#t8_ZnJE)!zhl$!ERErY7^fS#3SJ?&GO(k~%cs9J42eJHpfI+C3;La#6_ie~$2p|Zi- ztM9_;V`mk&K?-oV#z!(U+cdm_kN93V^9V}D$vIfYhTF;r5>+=b^YD@f$x>zEt?6SH zkHHb^wzpC$saLP-Y6aivNQ!M%xmIg8k3-wslQ~q&B4+r#0%IRb#o$_`-LPIG@Z-}Q7ZY~uZ%a(hN$AOhja>hx**%)5&by7$H`|UH4 zAq3(Cw%n~4yRU)L?X=V4@KuInjx!5k0l<-T+;>5ik|-&72^^isy7ZWqmJMyN2CJn- z>#evL0WB@g7;E4JWM3@0NU+nAZnm6ecNxkwrDAQ`$arWI+Txh2?W<%j9H-UP_hxO3 zsAR#F#=6)xOxP4QbOTFBZHH)K)uF@M5tIs=5-5K+v`QRU!TOMbey`(tCgaWVdUVQC zZRDq7@O}yMV`_)pjk6hHA84VU(CyF_Nbj&sqz6;`6oNL9u)TN#(8J#ZSW{+N%JhK}9ojRPlG-`uC z5)J+ZE=g|-)SmZnm%^ySeIGY+1e_&jzQOdO*~ayqsEO_e2+BRZehga6OfOnXbI31V zfm4ZTbuWeB@mX7cY46P)r>C7g{?5(H5|? zDpi21HEHBx<3!G;i%r`8>mVEIT}9um>m2I9g$Sw?575nv$G|G_uF<3&y{)Tji=H4# z>oGG79rHvDm#U_vq19^2yIHH(Z?JLv8jjepDxmR!4{fN{WG3a! zG8|wG(byH3{0LJob4KIOVXftjtMv95gYzDoyUg9AXY_aiANz#P=KZ&a9$*4EN)3Mr z{7u9ktU`6;&zsiiG~h+azRol+TXweb($(4A(AMaU?QG$trL&cnlpcKNuST>CUW~$- z-ECfz7EX(h9ZJ`ub10KySFrPt_C||^4Dbk0bS&u1G2`wnG{HQc7B3j~<`^=>dW>Rc zhtoSw^8+qah%OE&LB$gAc`>s<$A?D%=02r`)MYapk{($u8_d7Jt16ts(TcpZ7Y^p_ zpc5mZVQ=TLY?mSaQH*b$avLUJdXv`mye4t%FWu34)CteCPC?~huaJt#D~nlu+A6&& zbX=JL9Y_){o$A`C`;{T^Jz8vhX&Etl7uK;`XvBH6<~WD=CfxHBPd&70)Nkp@ zYjP=52<(=j=z4FdA+RmR3#X`Iavm$KvP(_`MpD|iOuq?`bg~$9;0;ysC^>>*b8al| zdPKG4sLi;UZYj;9JOn9^`497Xv*h#B|4u$>egAnr$4frJ!>LDqL~XD--BGruh{9-4 z9V_`MojDAc_6LflVXExJ;3~l%IKtaY>t3owg)4yNF|?_=vQ+4_RGdkb&@OnRj-JSf zceJUd=ql4Mqg4MLf92aE-^l*TS87}9vcJOmaa^@NP%+St%+>j#{iQr(Qt(9s?BIew zSMn;r>SY1ObhacPQFQ_M9$(ED-4FPlQpwl2ZL#3$VO+%vcsXWPS3=chheUxgf@z4C z`RK+2#f}3jg<2XndDZrexvb6UchM%w|4z|wx0kIf|7$j>&=e$iQHhSs^<_=(E9JJ@I)!L~H=E{zEc;Z?_Bj!UD zl=X&^teA(SC;;zG>+7`CCj}iLH(F)D>35dL_kAaX2JC9`iZd1khTndnmTEC zS}c)@w3b=!a!E^)OjRd|)w)uWv7vPS&S;*tnKyClq0!AciD{q{)YEwZH3xIU9Fw^IsMeWSM9&H)IUy`M4VY(m z)EEmekgW`d-oIc~iMwpx8!M);`kLeVX*r zF=JMkLmU=m2Y=K#L{UZq>_J8YVD{9!f&lK+ky67%gf2B1ww23cH?Yv<_Mu4(6BR}x z4&%xatzcq*F`)ND5Jz@p(4GWsFd$547*0IXy$o7O5DtIBO4ewB6Od&s9E5PK1)N$UDMH&( zH$t&^3Vd1iL&&bhfT9H9Cn<-ymqAAn)SyAZF}PAJ9_YTcDY_s9;#lpk;y8EACloHi zV74E7zmsQ_?3WP(oF^xlJIrutciMXwhXz1u&`gLmfZ<(fYncr;7-^zOM(OusqjR#z zP%Cp>aWbwjJ1E>J6vw<*Wbbe?#EZg`=4xCi`8a1>1%%W9?+J^VkW$o*Qv*CFeksJ@ z*!&duFcx+?1jhk}VKn*+Hk{*~@tirq$ItBkL}gA13tA0JghbsWSx#^!^r9Y`>Wq(z z*#X|2U|ts^kw_pEd}~gGJrN-kcA_(}cLl70&q0c8Ix!>TbOsH$ml1xt%jqI=k~66{ zYuGzoKr{jo%x4N{3OnV~Lg~rQ_ZN7;yvoJLBJa{&On}T&A+r;W);C3)>h*E$O-K(DH>ZVxn5lbZR>qOQXAlyV*~7;PRgU^aOS;1Zw#^>zhCi)2I=dAGu9N2OdE4WXM6iO1Fkl{4SXTDA*!X41Lq5lK0?Y4^TVAvfgj>BczHXtY9K7u@x&n%mR z5dU<>xAc0fjPxM;BBd*P5}ydtg6QS+>`-@uxV&6mMkgCn@$9+=FQww_onR}uC*$xi zqACMd0+TM7AVNBp;%vtB35d;Ikl? zcEYVs!9Wsb%|V&<248g@s8UE;+J+unXNb%-^JWf41>7jYHFGqRXhTu;xtH)-#92FB z?y}TyGx5PSBQ>%xP$_j;k+OHS!5gb=J>63=F>onzfb9fWf@@Zpna$wFJjn#E%mSd; zAFIx{#$@8bQK-nJ?3d;`TOqGIERQ{Q#{C_#)FX9}c7ax2)-~GP-;>U)LwK7T0Z@@j zXq|u5BX#zs^1m3RR-OOduwb3CgENr@J=%aq>lLP)=ZP{*X}gYc3c~nvIQn<4(#~_Sm)!t3E%4kmyJzR1nM2tzex5 z3#D5xmag0M{;SV#R<2wBBe_XbT%IH8;ENlWhy3Rq*RA}pf*O*0eXGFAOLZme`!{&ezcr^ULA42@35U=3}K>0AV zBpOCch?oiLV68atWrkKnwma#~<1q^Y^WB2V;$*Tw?LfWY^&kCpLel|8Ew@_B0>{T2 zsV7OsidJYy;TQx>mC{7d#MKQm42J&{oK5)zp^Z;X!@1pMaRYP}$vuohXlN^^y<^}D z5VOZXG07e+p$_N0G04@tuh=WIQqN=d4znTICkk%`6&S8|+sa7WO68etGgO3VP}&RF z3I-D_&k6~bLP9+UxPfiJ*a`!ex}d|FQBhHZXj;$);6W?J%v`XKLOaC18oXOY6wG@? zSE7sA(kg8-hOIPWWAybmLI{R5>e6 zOr0xr`!Fad7z>2*j)$LynF#FUK^Gkj8fg}fG4Ecl2?-v>qj<#0!BxOu?7*1Tz#;O` z!G{v`VL(%{+|LFjh4Bb#KTbLobnNs9C5Ca%m9fK}AW|uGIGcl&(xAx36VILJO)rtdOsC_LYbRcrZ9LWFTlW1t zh)#&*x(D*{8S2_AZK&G|+H&yPkcy_xa=`M^LRbRpk zT{)&>vr(V#23bq995K3c(VkW>=}tnNV6w==<%&eY#e2)#C?j( zwjr~1c_W2mb2Ytpjf$bV$SQS4Wn4Jq@c#=QrZ}^~R5CG1(A;F%+kwfY8)CsU2I8x` zDfuL*9=>z_W1@~==*1HdPqblLC*(7m9+STjU#V5=$EaA&@?tU912d(bXK~8Z#{$hn zyEYEGVFqxzqtq(zDt)U~^CTn@*yPZU;z^!iw*$c57{#L;*PR3t} z&N0lPpnq1{ENKEv1!gPAS$d|^--mQC=PGGVXD0Q1MAw=aKW>9+*AFK?8O&rjo8Dm< zsYem)mQm__Nh>nAJvh66hFVOc)`624CPx+5C`&#&3q0x00>@m;oegd1&a)j280OEy zY44copAF0zDw8UIt56ymvo-ZhHi0|Pi>%V0m_$dfIPLpnpv%x%O z^C8qS{e5Abv8j}26@DBIXla*^FZZ?}J>B43`7nR2gmf$hn z>@MX6^CMXn8)j0*@|rfKwj6n%coBR9e74(Z#y7j2G5B1!<6PT4)@hM_FxPgEbJFIn zqb!)AjCY!@?VjK?Tsn_)upUIem#m(ZZ)O6UcCVQUvlPr8}KYEFHQHQv1~NXtlfY2Y?)F56l1 zc@{VOfc_xv`H%Bmi$TM9%)!Z8gz5Ku@m?VML--3k;xdXCqsQX{M_~dkSRWdg$SYpt zoyRL?6n$Q?&aseJtSCW9>`<0(m8X-I19q%4nO66&)R{GKFvGb>u?P?4cA~*@kkS`9xtC2WMKwC=bD1h`HVS5 zEi?kSjsR~lBQMWct@5Uug6zyOg4v}?FrN{OvW%*P)&zptiDFnLilM8*g#yeHw-rw! zJX0+2qF!bJlSj?b7?)0#y9+c>(TR5aOhRRFJda|Z=Q03oMjC)ZB_ zeiz_T{V<5Zrc;USZpWrZS9v%n?`56`uEM%FiR}GhV#rx5bM{@ZcmG0rP~H|L?3KXU0~DlxN2FvA zFmoIUCc)pEf}L)q)qon53!4Hjs7cxdeDHz$g`EDK5gBuniR?wNEvq{-cq3L`t_`q0 zk2$Q)RUl zMQ<5xzvwpDQFo@Z@$22$&g9qEwt_f_hBe8}M#tj17S<9i91LfuGtrMF_vG3wLFiwO zJML;ouHBxGyYcQY+;u$)h4t^w$5nXjTyfDik-*wx2>Lqgsv(}e2yHVI*Am&##=DkC zruYQPsU;!~Sn+Y(C%(y$;#0VduRRWNRsY{n9BV<^TAzyd;$=IOToNq>M{V4F5m$vDf-A-acK^#18+8+{X8#eCYq8wx+00iEsF%Q} zsX8>(O8rdD->B-*^w(MHr)t|+U5Zq;AE%<1ycBv@R`6tuB? zfgKHXwn!?bbXcTCSQl{mm&z1Zt@taH`7kOSx8kouYNq(4+*8NFw#Z?R)qf2xMd>Fq zMRt^EkvT<&LS3UT2WetuXVh9eoW$1RY7Jo@j4nh38N(!xuOM(JD+AOLf`fq~eX9~- z5(#vokm$Y@bezg%7nhMx(P@7YM838~x-{#36Uvs>+r)0b?v1%IT+p0iI8|hK@Nu1j zHbU~I?w?c`bSKa>`MvxD7!AKj0*)r z>P(Teu%}1cj!&8Bn%l_$_eX#QZ_yEDOW&xh{-3jW#v%|lgI()j3zM$c(E*;YGT6lc zMtxy}&t8zv?#+mRWzb7leKKvZrb39K~F=V#{M zVc^trO5dg^ldyAT?M{UZH`)IqMzonp$GR?{^915ys<3$x2ome~!92p5vBfy(TMM*` z3|Z@)DOM^?tZ%X3IeHk5Jt(8(LZ_zdAQlpOFSV{EUjL0SC8r&8Ims8@e#kpD@dPV#j@@@J~tH%kLyAQ?u^|g{CEfX22=ouwOOd z%+T=Qu!}U-F7wcn6gs_~UvrOirK9Y-)0w6Kh4?D+ZnAl@miLvf`OW;Qn^_+fvo^t7 zyHg>}YXBqPT3T*T7Joo}OkRukWJ_qn%}JrGZJnxiL9E5(`<#TfDM8Ka<++~1#_&m0 z&#gTwHvr23=W^RmbC})Qg1aus*&GzK2BuU{m(xoA+Y?db=rtM#7DX{@col{9Gg?9~ zChN%?$YqDu5P22AIaJ&(t&_pXbVC^QhW!#rP_Zly=VkOr1C0n&9!JU3UXkEPEj14%t(m!!3E)8Yi&V%EMi)N03jjJ6^rI|~Y%JPl&i zsI=Dn&@aDHyhd@+0W!M03XCm6MsE_;jng|N`&C!T#-82@VJ1wKd2D$n1U5{CFoWCv zngf~RB7ZN7C*f{_6x&w^&5UZQs%zC=6Ey|)>s-ZXl!u1~C(cJGUh>tCkv`l+G#2!E z^3iW7z-z^$&h1*#p!(meY07jvIvcQ0^G-UPO?XV<18m(&{;FHlxGKcEvdv${wLc|? z-F^*GLbGz7yFB4k7*Pao9zWy zaJScA=I$&X&FSq{9QFdzx3wR559~s}sdBk66i3TaUmEl@Z>H)ugppPL=F!}NFPy}f z@w{kq3P=CsE&LAj+VtL>26jRJR69;@xj7^6vW|5tI(ty}9W2*$8eHj2y_IOjG_$!@eina?;7ToJ`Lt3Od|sTe!(qHsk7)77F=XEPr1PS#lstqpYC zYXs@+W-_X>X}AraO0~x%P3O<4m8uFqZGabhY6 z`5ba^ACsm>pOvO(WNFr+^YupO4=I=pRrKLn z{5oZeib8A&_!;}Wxai8YaV_1az^x4@xWj)q-4w2;yE>ZuK9lGUn;%&XM{f|_&M4Qk zIsLinW=F!ecDax-r#(B45yh}gSuUvPJ)3bw%Kd{mx00fMwIvT`R4QZcOx*?3hw3r# zIvRS?@$X4xN{8u*|ADHL_9Qn9IAMSlB|FsIWi!*v4PC@xeX-npP}OV1SZMr3+?|pz z&A~iAu;=I1=IG#(*wK_W3>c~h)0KnF@KB|BeNhzp0ai7r4#~gTXV(v;iCpQNH~K)A z$fW%K+8b5Zsry;;8C?sSN=mp7rKn&=$7h?AP8cFC?k4sQ?;7ZpRY@v*>>DYoIX2On zAfeq~mgG4SF0#J~b6pN7tdl;O^hd8uTegaTlzz$X=3fbakG0KSaz2HbP8D~hHLJ26 ztDEVNMTDt#whmah8|jKO7S-$8*LVzqx2 zj~)aLJBaG!Qaew{O&`ID1IH2iw5M-#6>1z^)O2*QjZr>+16Ul&XpOR`d@8AY*pF#_ zRGl0S`5fu_=wm65v{SyvQ+9dnp3-K_=_&)8xauSq+&B};O+VAq)~CHxn3Ah7Oc|E9 zbIMSLg|qVc3+1ySPnyCWSLl%02{jFZcgG_Qq5t* z-R47s_RjXE$CC@zr@fQ}UbJ~mHvgh~RTryN7s;YSF{htJb%aHTh?_ndw-dZ4`e~Ha zs;m#fSd*NAp@biC7@y?x7Uff)lg}};@;SDh&z{OkKBM#I(-ZxW^4zEPaJhG_d5P*h z$nkWK3)L%|kCUU(21ToH+El17Yvk$|HI*`cTUI!r+i}8 z8AaD+&>0g_^cB59qsFnyLD8XcOp2amn->Sy0MrE;sy1_L5(4Bu9F#_eUtWQ*`%DtM zF6sN!YxLGmnVXl+TjW}x-p#9rf;O&5k>aIX5)I~@`f{Ki3*ITL`3PoNJukVnZgRKD zo?}%k%J+5R@bz6@ubu0~xChoJocX8JlbFnyIKpJs{G^q&lj`W)B-WbO^sb{NqeIZES6D6To9K4B+n zThxl!9(f7wG5nF_RN|N7X!Hfg%Y-SjzLycyNhs)dYva-JjNeJU4EZYBj;YqNMTe;o zh$4V8fOzP-_e>f~c+LdJ62UmI4)<~8gR&~%FY9rf? z4{eXO?nbU;fywgM=Clba`0brGX~(M+UEw;lp{eaZR2a~6^2Yc`{m;+FS|-Owse-$3*0 zS;;{Rl4Jyjwe$ro)tlKi{i5ZQ+NG7|UxR9&HkxqR{1*|r6X~osOLI1$9ciSmS1zCg z?`W6psdn+}u==_NG6vXX4i(tRhdsQOWHR{kMaBcnVp*Z8h1nT1`@xSz>3GW?L{gXH zN5+z0Fg%CuC?77v_hQDXzihXI?UfJ`r4M6JMMzHWQnz9jWw)?iu)!lrF#OfTw`lW zGG@j=_ez$niZWk}ltC%+D~t4SXE4_mr{v}rr{oHA2CZC&1+3c=v%?=@RQuE#5V70aI6xWqNP- zE5npr8K!Yz)R5NetQ10Ii>JEbj{mH9%w%OKEY~*4;EbZ1eG^}Zu@u_+EGi~3y=Q!+ zz5-zhKeAnvnhxA}gtLsP2|M2?jFIXHiqTh^+Qlh7yBV6C6@Ax(Bpan< z7wzNc>5QN6Q9c|TKZ6wDQ(J4N&d~Fo9EM-=>Jo6>IwE=A6l}he^?}|k$cB?675XW%ZK5w7+8ray~*`IcmkY6Sn=0k%$lB`c7Yb|0^$D*Bca&Es@wTAn& zRs)}4aeHVG^1GFTP8y-0C4p z%{I2={AhgRrd0vjvT-OE6l!xRh1ziUMq?)SQKI*z+9#9#!R~hZ97ZMmk@^Ryq5l6& z|A0kJ!YpA*l_aFCf3P8S($1nMNYD^j>G;+TcH;(GY7bg!wr<@6ooZ&&J$SVx z=FB0Dg`?)E8A$oyf23y6IAWF}fD{#iR5G(7z~YH-vSBm%7qTnoDes3`0Vm@#gG8|G zSZl5Ui>u-2fac@hTMT-v=Ba7ocjl>NgO83!*9PAbZyunjrjw6Dn)A8Rv#Z^=>Z!f) z>(l2TZCZg}7A6W~mNu#vehnaa!`}ClN zoaS*|b?aI$sqU-+pa^5Y=zTNDP9VQYW(XCi(^lMWOYP`GV{avr$>Z}b(K7Vbaa?lk zM4T&DsE>9+XE%>^C6_uIk~ddqpPXa@B2&D3A>{dmbg2~{0wwFTuk-id5EBT;+C=jb zuNCHQQH#mdXStfPEY?Y4c(}r!4`XpB+E$W} z!NsLgqPl?|_+shfjYYi&CU#A7dYdbu{anSz&5JDi^R~fxaw62L)HhvjiyE@2>!OZP zyu=7iRIi7puL8SK%EgDN#lm<*KaBoHw6}gO4H3*U9!_Xq$u1A{+f{E8Ki5kAX~pASSnYGuQ&?2F(vm8tav)k_-qohTLEnQF{ew|$`grrLO>a|FsCP16BQlB&t}@1V3oJ<+ zjuuAE6)(n}%GeWJ-7Y>^JA&;*Xt>GO;Xlwj`8IM~>m1hn3+2AH)_jY7^Ub&F+k8EU z(bA#9Qr%-a7&5i6XEn89EjKiJ2P^T>s*tuhz(1 zwKddvcarqEleYB=*8b(O!A{sOD7EW`qL{lyD`U7PR~?FGBh5_Ezp{2u$7(&L^Bbq4osbUoq9ZDCWtlQm&8M>jP#4JA-+ zs)ZZnL6N>NR~@M8>6%Z9BdJ2Fm8G0ppQjUZVRh^ET*50(i4W{{>bj@or#8!^u4p)q z4Mw*Z>rSeRq&sSEO3JsYYOLZVE#e%>CRK6V5&Eu%5V$I5#`8u3F{AfV>eQ7awdvIJ zNOmlrZ!ipN+dB0V+}6T5uV9M(2`jc!FtnyNw0C1ebxn0|ue^QcmbAK$Z+N2W-ovL4 z?Oolwy2kYWH+^AFM{;3;_e?TZIjG#V=;p0uSPpZ*snO`9n0n$R}D1p3}(MuYv* zPkzd;{&4P6Fc6l~{?Q|!O624$@Cq=TAXjSjm>ZH4KGAm9Wh3J}yVEAGc29#Fy=~_( zPf*w_fw{JDwm1wIfMO?)Qcz{aNVcZS84^5Xt?8~Jg?}|<7s$hSOwLqa@@K6uS0*p!5hESO9t@g;O zr0f21vV-*HuFHn{mQtYv05fc;CXXgx1q5EkSNl55)A-WXOfyf(F0{Y?V=BGyFh_hZqk&zRMy_^2u7jydkg^B2U~ov*3wU7)&Bf|2WFP&? zOEVHNmgCv)oTtf%!5O68*nz3Fmon8p(3xqrUe8Qo7Unds_;_EVGKvG$lCG_*!&XbX zbkVs)gXlK%K_sF&AOYDgW%9Sirit`=fia@{*qYc`i2{#D)e+GsbEXWZ)e#sSy2=n= z8`6NMw!=GNWfl(`WM?ZeaJogyy<`X>9VUt`FLW=(OubnWlJbu|TjFV&8o9>)w$if9 z60m>tF0eX~N=q6WwH3@0kG6(+>T;r8Rx^C(@AQa*_VJTTS$^ec=xMG%7kXG^enH>f zX>LyAEKGB?gl~EJ%X~F{N`6ydN%v9sS!=@+8DAOo{qo!iI0A9jvjQw0$53B6luE#0RG1RYLwzjkSmq7zmd?Tnn!dccL0^?kj16hT zqp`FYR)1g*!-742z-w34Umdh75J^v{>R^-ILDdHp`oq=-5z%yFQI#tj&rW(o=z}YF zITKe`5}UPFwWKF1vHqZrpuA;-gI938Mpt#`2sY(_+sFR0acsoe$g^f)(l#BCYM>;M z_V}dMNGF)=hr%d;x!ztHj-3!l_3?=zgS|=m8+HAc4L;e z;&?xg09GC>>`7xGsq7xwr(EsZRo%x%vR0MFef(#v2cqge<&CI6bE&xx5WKbYP)mO8 zE>AB#7;7B10a@=St*frnSZ$S*DshO91WCyZE(%uehj(Lo?#K{bW7odbeOd7jE*e}^ zTRRl{D}3?v;Z#p9S6yV*@J(3LoqtlFi>8Dbl1mSi;aW=A6ED+pntP4f@|xU^4O;Xu z&2RbUTL>FvYKqQd&BKOS>p`tYrk>!ZZ{lh&^Y)gMW>`+p&v@1%dgPJee}BF#m}G?5 z{)bYqHfHiab=H4lGUV`G%Rzd_`RmVTp~tMwRj*&tAgzt7*>^o32>V+{1@s>n`gcez zc>I%je7WQCJ@fe6j>nJ8<6U@oLFv&a`eLt@}MK8=U>RyUj@&_BXEzgZ9JX zJ7Z!gmJL<~YACdsqur$AwtgD1>8OlbxL^PAiCZ1$e zMknPVJd-)6>n^@Xe5xDzdC$}{qEo>~ZLOc3r0D@&#HDVivG^ata@ZXQ|7Gt+V$BV1QkDGptoIs7M2q)v1&0H z97jnP!J*<`$&-yK-Gp*4XKH7${)^8g?og@70;^Ii`+`j@cPQ3)$60nUbs@uEBTa(* ze&N*-IV@eJX{#g7IJJD$bF2313KS%|2YU6CZNt{fS>&Z8vw1z+DlwryJJU{y_fXkc ztf!qjflgz8vD$A#x0b+Vgxa3d;KJ}$=|ZeSz>R|oOFk$r99qQexyb8s19kcFPF;qj zbN80XPhi`1$#ucX#6PGm^FDTOUYPgxZQteeT^-eDcuulE6w|J8)#ctv3bcSK2`kD( zxrdZxu)A95?*bQX1VAH(wb6Q!+HiMNuTmbJv#@xc*!;eZbUtb6I4AY6eb;kJC`Qw>`9Fz&*40ttq{a!M=jOp-)xiKX zkuqpTby7W^%74>8Q^@gsnwlf&wjnVDiW<3w^kQAKe~j9;#PElVS8@-XIXz%B<f~FCb-J1hZ#|ySjFd&-6#y$ z8(LVN*FEWSb6+D!^c;{SojoN$T&1x+OB#U|c(G(Nle-aaQMZdZ)6|9~_|2yAIa$*G zpC)`tXdu;Btrlv;%X2sReOh&EP3Y~|?xRf%IVJjnR@dCoV3Z4_tFNW%nzCvFWfd#o z#t_A{`P7@=8d?MY00Kwr#~R=$v)ikn9LJn0qe zPK=*l&0I=ucU`urQXkDt9!{5UtTM0MJ!{8?);X92t*zYGzPFG!yQs01ujXdKWp^bQ zB^Av#Li1-7UaRE$8t3vzwh2W0%k>qTmolLhc#(mRdDhP|!2=8%N2L+QnSy4#QenTv zAy)mWF#R&?a|`l&4Q6ngD;Yu^m0_3$9(w~uwi!7w#-_U!tfH}w1P!^-h-uNZ=r|=Z zix8%+G}1r8T&dt{6dm?91J46I^mPV4ZSN>L_)iU7FL0-UJIAAF)8gFdSHRy`&W#?n zF^V={N*eFRANO0o8Abb_j{85|{rlhHJ~lVH_(^v!O#AB%#Qm@x& z)HxFuyD^5*&r>=YMIC!-;dN+;tD&+(B@#f75tQ)#@VxEUHsDd;L+k{>QVj17xKfAt zgk$k&;xD?1pRaOkdlyu&Y;jUf>2DBxH!2?VJkdM9$KSb?Ddnnyx{Ar4kg9irmr5%1iQHqy-zXg zGIW&#iuW+Gr&K|bdkc`(*8Q|){}Sv^A^j_w6~ra+N*JBP>RGpWUVv{}_W>0lWPZ#M z;a1OV{7dHIk3JRtrE~FDX=A;o^fA>mo1WEAg@5^6d}){OG5ss%;-koz!q@r3nPNx% zdHYP#C(vxZa&A;c{4Q-2G2g5nHtg>Y`n8-rmHMi=Nuv#yqRPib&Q)CJsf#XTL|s*8 zfo|F`fY(D7Subc)Ys~41v`OZy5{oh1vvYse-vzsj!qWd~X}{fS4#ROojb;oFD3-!r z=H+>ZIP(m4!@D={pGrVEnKNaUfCKE}Sh%Sn>gir4R-hE7=@hitOoL4NGWqCUnv3d5 z#@Nti7_I868{+F;`%}?owXj!IAC3QTN%v5Xu06YFTF-@6Dr*+4*UY6=7ssEHR&B00 zDVVoboM-0G>)N?_75_JR%^Fo&bCb8Gg3wVF-RAioS$2;eR6Y0(%K53ykUUZ3yC~Z- zazE0x>|3;g@;XTkr=6${iR*0am#F|`ZmB76?x5d^OZRlSgME??i#mjbJ9mM%+m&2!wYB1u&^!0d z<+5AhYjjlZ!{t#dyZZIUR=eu~d)M>6x2LjUcdK1C ziJ`x!vh5wpc56py|{MGzrJ3h}%@mUoR=W^Nz7m z8kJ$AeWPWNxosMX+?q1$@<3ZYx;r05$n2_8gE zZ#PE=b^5t@Q0E?8oDy9R74nSi&G*_M^dbIw|u~(xF-T=g_X^?wU(J% zUZP+Rbkf;QNc6}HewNH|x)3V8;)g2nQlb!~!bXi}bSILM)Nu4#gU|Ifs<={kF!>Z~ytHU)O;idHBl6+cER zR1$}T`ZAn~v6=>^bX24t#U*jJ}?A zzImS|oFc@GGP{gqf9MS9D1Ba0qs*kn>oAy+(KEiDR64d0Ap<%JdT%^>$jX`IsZd09 z47+H@oRNx`n^KS$pE4cPF21~r&9{>s>Re~waLlAedYMji4L`os3+Kk9tsV-|Zt}lf z`TNkO3Z`~BGvh!h*(5v$vSTl&kF9#bdv8VBvdOqp(o&cJfp@)TjW)UA8zreBNT&-LvL9 zW*2H#r%>}{Yjd~SH??+e*Dod+8wbpr*&nFG5GN#r$n^d_mRs+IZX@%r(7uyT(;OVh z3c`)j-UQ3C;#=E(aV-QWGQgzj2^)w`C zO{Ny+qDnAOTM5=lEOKx2#nx#$gBtxtHso`>jJx8sZpx8YfuaN6?y&Z26V%4T>Qhnt zev*!nT~u0IIWCbA`bzvaII)Nme~|B3xfp+lFC!>T`IVvxB-L)TS@cz_lcF4Mw>zP0khq%Z52z_UK&B&wg&?U{)A995?#L$h zF3M5gP;&2L0Z&y$(fd`_)={dYrz>YK(uV%lDTx>7jX}t&@f-PS7h4cM}cs1)^ ziLM8z+%O|0v)hImYZ1UiUsFE3Owd8=Q&}wFd9)*@X+O9lQ+OklOAfPb#5`Xu2w5 zRqreK{-f$W7ay$NltY{3Lb#$}71pt3D!ggKGY0bmf3C_D;ya1vjjy&BUQu`^;;xMK zqZ{ydG!=v=&23|^7H(hn^u&bSN7@o(Ff8;pS~(u7c{v$SXc~UMsG(O_+{<{G=2>Q^ z&9jcgbzt%hQ`6`qV8h~`BES-3U-K?*^xd1#=i{!^=y1D(+4;25d1FEpL>@RhTX84Z zu5vnOr{RY?4|SDHRbW zCuj#tp;WCLWNn2QO*MFGZ~6Zjpa}xx;5HKeeF9%&VB~sJxoBU~-lnvi zhcX%K1>nY!MCB;Ke4qRjN%e*VF#5*4aX3NpoITR_LRwTQTA3jTV$nSup1vOTCC7or z`usp+-BV>Rjvad(tf<%4(aXr+`$}rm*3O5P3fHi$kFo}hcI}x?)m%57Isx+<#UG++ zkv5(E6E7sWq!83BJ<7B9K5cK)aQJoZA1+C#l??+)ZqQAJHuhR8^fyM5w3*Q^V%$$s z*U=tjOU)IGJME6eT#*`OOdQN49OjDj`E0^xT)0Z{8GPV;ro~XgWLpCpw0Z2!#0fm6 z8f^2}J?3vb_U8r$9>Z25a})=ljBPw+z91{Q0 z0)dbibztJt)*Qy7Hl*Ful~{^j> z`AzcuMpv7NLfQn?Nb%r2Ln;6py*O``PF_xtZ2S&l)+9P-`qO8Ug;x#X@@@Ib+ zeXHF!m0O5zcMfE&hwOd;9gNACUI^WCLtt>%bV?W;8mvlZWn=y1Rpi5d5Z+@8n6NdK zHq)V&=v%uA4L=xLc?nrWKGE^8qS@$s2o2cRI51sXduBR|0XxUs)eEz}_v3d#-?xpv zR6q8StSE->n|K)*bH03AwOOQL}h zrU0wgL8wa4Suv7<HdX*T!6n{dpqKt><)Au(}v~JmhJE zgvGmyXbG`4JRCMR6&uG?nq*X+Z_J&87PhX??R4hU__2BFgQ|Qmi z!Bu6bs|C?ME!6lk`ZI;TtX}dtNVz8W28unxw2ap?vl$42vFX@Br?vrXRO`PPe&iv@C z+_kSeioCz4ygM1C4kPV(0OnL~5lZ(^`jpGOK^$Gx&NC_2D1O$adG?C=%W`ffi@wGx z&(O7EQYY)0HTybbtJ1#FiC41ywHI?yNFh`vOrg5GWzYFv(n)8}`D-UKJO7}%qrF`! z{}Io>lW3a|(J`}UIxg!(*)ttBcg(7XZu9HbAlBe}ro?$x{I!QRN%L37T)*bFS(Wg_ zACbBE3qfS`{cip;i<&7W!wjW(mr)seqw2d}KgL_7)aw_;pv1v=G=IA6e-iCkwbdV$ z?j6v(u}yEMrRKLs7{uBgw3PWl`i%EaF8QUr?JQ%p^G?cJT`WOwAHIZf?s{nYr`dgq z>SD|}zms(zmWj-zTd}t6YO{}~fD{vRWTs(cWkByFkr--Co&P`r{i+b1!}s#}X*jl% zKwpQ4?(O0sDEOhFb#PMz1^ci`UT9!NPbjZke6pHUvN(39>`{umAhX>jt^^lX^aIEJ z1Od%OoPn8CmSNeeXd)=oTgb;H4a^leFt=n_0#n#o>OH zSR%>0xsXEM46pcjdI1RySX#R0z?sf25|4T;9TGwOVyX0WQb}1QiF({W*neS1gb6tyaZouLBT_5%^zl}93B5y|1-s?;#+bw4(OzHY_ z(sqf3^t|7yrHvFCtv@qor|YahaN5m?-7B6ftbbX`BY?Ut!EF*92OCOfJ)st*NIFjD zB-4I7N(cx>+9$|JXFPa*RPPfDxUCt<);;>kmm6EcyQ_0kH&J8j*Kp~~06cD%hsvz= z=#Q)q)#88fw!M)si+ePS{b{*4ShX-pT(czjD24DmvFDwOP6=t{?D^$srojXw%B`G) zb1Kt2}sUAj(h$!{MCbPIc2$H23_;t~wBHW7GieLcaQciD~M?W^& zr!3Nx;@B~u8S850rj%rD|Baqwt@!{sCGR4lhfgmQjb<1s7ylzU*=CfD3!}$Ik>trL zmE>SVrm!9ZbDbn&3NS)3?G{Y8iLR$Z7u>70sY>ekR?u!Z40e?6QXiy$xQ{+{FdMmWRnfCz3Rf0jg4)sMPog5oshfjkcM1DUzK&!(!8bMhQNa z#&x9eQ`PID1=bW2fonAGlgH8EeHi(6eRNZ)Sie=JAy9_XzPY+T>FVLRfn)n`15YO?Dohx0v# z|JQ~86ZlR@zSCPD8hJ30t!8BV(yG?J{d4+qdkA7LTI+ zTq!z<_0KQ5+Dtd4`bt~AM1_PT8JDdUhX*G120b?tTDQJ`5Y6&fbNoHX9GJ)xUgSv^ zn5FYdtJqU0-#3)UNw-)(lc+jg!w_MuR_`6|?iKO3K#j=nZ$!n+3u(||yoypvPR5y< z3C4`AUQIYD%-p6nFWo(>cO~gGt}fP3BuA+;FaladX||CT9P`)!S4cylW_EV+LXf7s zbYKjx4>X?E&Zx4-j11Avl}gdCpzYtBr_|||k)iignZZWj9_5xm5E1MeN??=RuLw5-YhH29#}P z%Z0iQ(~@}WZMi7=Wq0}2o-sqzTXcJHbriO^hSRjU>Jrdg5I>K>UJ!`vE7@`Y{7s>RUT)b0pDR2Aj= zrrmcB$f_0Qr6yRX%}P| z4FMJ-{U81{Zhwq_yQo;-2df8i)yDu7R38TrUVU!>MXK)wpaH$U20%&IuK}Q@qWZOr z!_)N^zc(l%mP@my}e5&~-a=3DnD(&eneD;cNk zYLreFQ|3zS549@w=o*V#jKA24*SI2TjS^y!G>InBY&brwLs+#Sn%09VnkMYK%o4qC z?H*`CAd_nyrNo^^djFF67gnD!`-RFR%u!j}IvtEAyQ<2%wXGXc@QxJxh7^2n3Vt93 z?@GasrQq^tC;d$+__P#!QwrXhg6~ejZ%)DYr{K?~;3rb>lPNg2S3*PlOI3h&l%EpQ zYg23h9*jZmVE`VVk;j4TLhquDr_F`$XA?97@c4YI@ZfTT6Jr1#4<#N3;PI8j!vH)UPCN|20eE~Z@h||7e@r|Kz~k$QhXHte zBk?fcz+7CSF2?dJ8Vi=MKP|XQ#!ii%_)9Rhsun?&6K?<>-%LCVz=I`*V;F$Pw-OHn z@YtPr7=XvO6AuIMcr@`a0FUp;Lwn9b^b&gGuWWwLPs`f_WyMo2taxgFN7v6aE)HIo z4Ug-=4s4e6H;!g;BfRoG?9be~<%VjnN!OM)87$SWQ;S~5^>7S1~sHPJG;t9d=mnlJCap`!m#PtIgI~1c;?8{lL72{We6LVoE zIWz2u7U!erH!AxKwSX$LwnW^fX0o(Voh2Zn`a05|ITL~6+OgqvGiLxiSsard^+O8Y zsgNdjcF@3X9WT_gx>3hFs0v9?&lT#~-KhI@P!*D(UM|#gx=~qRBm^iVLERzLbGuRZ z@1QCqL4BD}&+A6r)In89f_jfo&+kUv+(A`Hg8ELOUeJyD^bV>*64d*JdSN%}0UcC@ zB&c5&>P6kC2X;^ulAt~+)Qh`O59**QBtiX!P@mt8I?+K@NP_x1p}wFSbxQ|TAqi@E z4XBrNqi*e>DkMRz3H8!$)Pp;y3Q17c3-z*Y)I&O`3USo_TgA#eEV`PF^g3s3PT8AZ zg+p0DVZJw4XnsxXD%I5ZAfR|lK0?vvZY^Ybaqn3F`Oc!w%$wA9YS9{a{~5{_8E<8$ z7N$#fD!=txS>Jw!O^?LPNXpmb;%^wRDR;}y36FQ-(vUs*O@L{6X&^@y<8zk*;Qm6m zk0iLr2P)I@67Ik0%d1ZLX+cN_e;EQ;9fklw1Tb3_){_{c+U&&Sr64+eAwHG@8%=C& zE7S5)(0|Mgl9z&htDtV`3-mn{$!lH`<;t|ViIP*4 z?rM{lq97CUoDBdM#j1kDTb?|Eqsp|rgv*V0$29=lqHqx$Rcy`Sx{5`O%lYN!ZK%$a z2%aem=byk~xqzga8#fcMturiq^@K7|Iw~4mT!^`a;d!&ys!YpEc~|sR4H>Www*540 zo8s8_K76$HVEe%wy315){zyOU(JDJd$ExAUe-Cwt35#$n#x0DOI?%Hu*pF*>L1-FCXfgngg^7m&cq~dh4A5H_tc4@E8(C?5BRO)g zq&;Y*b%F@}R}os;vJ)H@c!NZ4vKGDQKE}m3CLFR#wcma zHy7V*zf<-*&2P-E0*vUfJ}w~^!(FP*y_>)NOmgq0N3u~FS*k`ITI(at{~*(uE0Qty za)2j`himX-yIonkQz3C35@xRK#yLVbY{kJ*NIWW>tGaQH6b{>Ta1;{n1x{u1zvVGW znw7P~P4?@oDTbTBx3AYbTlPxST%g~z#dr;oCfT`H+^5fQ9#*AW)s`lad{z1<5dyG` zQM;9!SlFvX13d6y7L%ltR;BEWN0N!R+tCg!XL8&b-$_MIA~C2;vRkQ43nLfv9tb^# zel~=2*61QH1;LlIgXEL$SU+) zb5Gn0Pzjh_p4`DbEtQn{R&^u)!Pxx48v2U zCeP1vj#YE*@d}dq7^|9*m@%D(C zr+0^(`rA2u*nCzD4g{Z-E%#Y9xG?yv?xKcET8*$?-pX{GvkSbbMYF7|O743Xq_X;= zookyG0Wn9${>G219hXh#de z-k${fX-nat$P|hvZtAxE_^jk-K(k{Hrfc`oWJ0l92mX_8n<4 zXyabi>bLLm)`)#qwDz&@%GO5vu4)}(-_@;S?OX3{o#sHLb+H3|t(F7*t(^`GwC-|X zVe3r}ENZ<=z)mqohop~M;Bf1+_8nArADnj&)$5wcUY*t@9mN)Vfl@PIX46IP0gY`1)8qV#EKiAN5!p9gO2_?4(~~(*?Wk_>Cf+ zWBI&RQCr@uepM`)seetl^(a0V%0>cZrI*h@AuO1X$fl-}-Z!>XoYN6%$wpb>W}L$-6a-h)ZWc}r9spiwlo($W!oYxpbFhzw=dPd#9Dv3|tC z%L!!7P=DsZY%mQvb$suM3-B%0FF2TehWTA|@Y_S^oXuuI(nDr8Sv-7OI9< z?AktpCJ2;Hyi43?6%Jvm4tpOo6EmT$X*`j*PCWco9-I(#br*RjY*w)ng0AZ#Z@U#M zA+Kd&iR%FLb~z7rsb6WuN?gY$#j@SG6>Qb6?aK!yc8kiSOv^W^ zLX#pmRf%i6<(!npsY+a@Sk6glJm_}DZY|qES>nrfZAYU9?L<^&!hO_2^d4FcArEq!ZN}{t&lzb2CcM@V81>|8 zR&S^F99O?!Qy;%O+Nu~D3KueG9HFq?ySP*OJfI^C>&!Nmink6i>u}Ox#MTEFD}>58$Ymdji}gE zbh0Uq=T|p!^;=Js zC9$5;R14fwEw#NUY)|dfTp`|@5rEw^h7xaLHVTJstPHFD$$a?r0+m7A`C5r%e%4C2 zGkrk9MP7)1AooyF;(-4*hX=XsbK)=iQ-`-J!qg4!y2B^mpB%*LR0B} zGu@#_c8A{D9lEV6baW?uxf|h>ZiE-kK{&G;;kG#l7j`4OXb!^V-3YhOL1=X&{K*`I z9o-0b%t5%V8{x%s5MI`WP~WG!67KE}9qSIguRC;Ycj$+^L)UbNKG+?)S9j>H?$CX^ zLx0vCI%=VG;nD6c{A4#;Z-Um_jaJ;Zt6!{3=e1MA>H3+r5>|fgSpT|KjTpWxpI)JG z$!_+cW{bApoRS|KO*ZR#noX|eLCp1f=2{Nvz~`dp314&F=;!`?q)B4 zhE!)($JhuaC>RN3sdAnbmcOn3T>fz>^m5RoJ)r35)Otu&b^BH&iUmh&fhqa4Ycwgxp zV3jGh+Mph;6F&p+7)v}15TA+9`>hVA#t95I*QmP{v5um0@n7>h>o_VP!GLg`!Ygj5 zL^&xDWxZdLlL6YtEwJ}YIEJIW?4_eJS+fyS#bdTLik9=ghJSVCP5dJeh#H5-3)m+2 z^BuJBL_BWajqxJ;#_>`19gVNI??}uU1Ne*MCH5`bOQgm!?Q!MEWN?69$U3wSPW05wt6;}pJHG$DSyvYCUi z<`{mXTNvE;8^AS=i!0W4MMVNWY@YTkKYxfRx|i38tDJ=Je&RopftXfG43gzx=Dk{| zy@u`UifU=;IIsPVBbn`uhZ6VO25r#(gW6o zis>sE`}CKLKL$$1IYR~2o9auQNm+=D(T`9`&$tC4MOF6)seY*j+W+}@>VLL7@lV3i z?%A;7&h|^t~(utTEC)F!g_Lfc5>~{HN3We*ugB(RV=P8TIOc@x+}# zcyMGLjW4$_#*JuPZ&LP-s&39$bzrV>dD$eki=x&Y4A#ihzX?0B>@ry_zOPRER{i;R zyx)}e#?p3YZcCB~>@x-X@F@0AX>YjXFuC;HJQ^o&63m634Hu>!9<-O@Pr$tC*hsZ! z^nR$^vtdGSy$XF~LLBn;1pv%aNX~E{_%J7a+Yl zqFUtk>xYMGgSCK&_V_?M7LKTF?|aW}cwV{Z3fG*5*K^;q8@^hex3#I7g<5cF%s!E? z{$^N8p{B7-S`>I!CimxOr-sE4@@$1{Qpje7Xygqc$14Qw~@GTB=yjG}BJA9Pj8Hb-G_*RD*zY8|8x$_t~Ur4ds zd90kbwVlVwDK_@dZF1h;c0OB9$!0wCcscKAJD($`Y5x!}DVzEkkw4&NnsZ--wY zcpryfDR`~JuM&K&!><;+&f(VxUhnYTf@6nYEBI*+zfSO0hhH!FV29rz_%MgxD0n}I z?-4xX@Sh1j-{Ch2o^trl1)t^cn+4zE@Lvc%+u?f!Pdoe;!RI)9pWuBReyiX$4!=$C zAr8M?@CJw9A^1>-|Bv8thuiDu@4B@YN3gL~zsL zp9;Rl;hzb<*5Q8<+;aHmf+rpRSHagg{0qU?JN$2gZ*cgRf^T&A-v!^~@UH~l?C`Gz z?{N4xf{%3gKLj7`@NWf=IxqdF;Boi=o#1CU{C@?HIs9LO&vW>{fmeIfC*^&Jd;ebW zp$}f-i7?biLK2hJ&uRn$%!axYeWvmjplGVbrD7 zq~_l%_!5Uv6IPR&KU%eFQiD;BRg)TwcAc8kU{p}mqy{e%e3iqC1z+tj`gdwl!$JQ} zO=>XOR%%j%(bZ9t8q5i}n$%#D%QNiar%&~-;&ipx#py{mo_m=m#!yHLy6gGbj6g1iz zjAUISticG0G{PE;U`L~{!ANa1+8T`DMI*Suh+b4BkEyAVz^I4@BY9C?1|xS7zQM>t zl&`_;Ih3!#>|d0x!E9TUufgnIl&`^TS~Rj7%-%(_i@^s9?sfPe!D9|j2!5tl$rix_ z@pnb%R>5l>K3MR+4j&@;=J;{pJVWp~4j(G`FozEVMqaO*njC+zZ{meDR^O(p7yp>8 zQR{1Ll5$grgZJ`xB1g>G`|bwD5Emq6(#ex<(4b^Rh5RFT?m);_ssB38BX{f5TU$5d zG1yc1(DV)L^agwKADX@qpxV>l39N;%S_oo8`sC7E6t9^3(DW^eSH#|$eRKI;ADW&q zkk?*5G(D}vP~a{V%e{kKN21K@kbAM$)H4c{t0#J`zM?OXg)s%_@5|kFS?R2P838jA zOQk?!sT@cw4RitniKRdyg5i9boirCC%7N4}B{NdXfz)!fCs2yscS31-s94PPRw+>Y zgh+K7^U+1nxI{E!mZ~|7`Mvl@1k2XdAt(U8LbVz`@rmqvS6vXF#AkNU$sTlyg8Zni zD6MGD4DaVcV*F#0w6^YvZXmz?kY_}z5^dJ+)7+>MA~iXU=$Lr1c96 zUPkcq<_0fsJ!!!!2tIvoa8UX-h4Ub|HF-3`pQY(`8O%Mol*178XCBtaG@D}tES2e7 zY2|XC>|6biGN9(fohgiqB&xWjsTYF~|Aa7#P?~y4$2C%#dTGbCtTcrxWP-W8H1($) z*NW2A%R8=>rKvkRu2rR}yE?AbrKwkRT=m}4)GJfYN@?meVS{e`)G9Dd#|G z>h6?tVQK2MDd(cn)a%;Lps(LpmTT?>gRB@YwJNa*f>t#U1SNNkdZJbi@zh*ia=z+= zBl5c@AEs9OCm-NywP~XJ)Z~@oN%B4rDeY?7o ztrj;g4hdJWRAgelVbj)nP9%F$In&ZwjQP0HYNh#46lNWX@~oiskuIWs`xHbWJ)gRX zYL;xXK8gfU(#Ijhp~JfnS#w5AniC%o!&MPA=1dm37=uKkT<8gz_6B++dz?d0x!UiR zJFEQ?HtL1K`q>98=C^k|W}w0~KG-;x@6`A@b5D(GvC-`>`- z9oMqn)(IU~UvH9~#`9_)bi1fGD?}h_{dPjMzR4wFP3akSWJ%pub zcouer^A8S5lsIp12-u|)7MZ)?Tw?4UrQQ;%g_Hjx-e-WS_N`x+l*D9txk$PmBcgTY zXbQsN6w<^sNJFWOhu0=!mEB~WWG3d8(@xtsKW@#M_w> z@4<|Cm1kt5@2HG;S7*d~bw<1oWW@VgM!Y98;*B4gtzM4Jh<8m!yfXTM`Wv)Gc)47 zIwRhL8S#Fb5pU$kY~{E-Bi_3*;ysZOZ{;(y(RX%6yq9OhyFVk|Z!+S=M`bI=r5W+= z&WQI=M!dz(%0}NQ8S!405$}PFcu!`;+j?}ia@>#+@4<|CzsiVr;4#_gJ2NBR%QND= zDT(WyHH7Bi@@b z;ysoTZ{*q8%5hRgyxTJ3eJ~^5Pcq_Fj?Y$(Lo?!Cml5v+8Sx&;i1*u!cpILRt-Qx) z#Jeja-X}8R{VpTkh7+=tmGSZh3?~aUk z4`jsqMMk{CPtI13of+{yn-TA~8SxG|B^!O$WW;-OM!ZKe;$fpL)4AGsM!d^2;=L&& z-j_4t{Z~f3iS60SdtFAn`!eD^lo9WD8S%!So2?v|XT*C)M!ZKd;#E$|M&H>P@!p&f z?}?0f%b%Bxz7sOyy(A;v{TcD1)3edHH6z|F8Sy@t5$`t{@iv^1tsEC-#Jeja-u)Tz zex4C;&6(NCu{|T+D>LGKIV0ZhGU7e`tZe1DIwRg2GU9zSBi;`);tifXZ#fFsaSZpU zYu!&pEsW|%*9N0n%mr~Q8@buewsit*WT3nHP2w(>PRb<8q8L@F>2Yt2l?*qz5n*4h zL)e$w5`1$_6iNB!n<$Z1qDfRlE0|s`Hjj`qDmRbhyDoZc#k#0A`Ap!Q$D+X!pQMM3 z%tXS#W0w^Sh`A2J)n_b{tsojILX|?38yuD3Xre4+38G6=X>w1Z(pMh+9n>~aiK(nB zH%V7kwmO+$h8*pma2hY*LSZAoZzgX-Xj&rhI;UynInQa*M-@qt*m1Uuhl1FDA4P zh@aCA_q*M#n-tF7?mbjFi7qaB_VL%qESRr1J*-t|;H{+mlV?LurI?$315`xCDSZ+v zn>`b%_Zd~t5H<^>?`Jhsq=tIDhO8ZjL%f};Bd@NB2Z-qvW54~W>X8!H2=5pd&*`oT zdkAm-O6Y67grZ{ldwgys-0#)1WNsxi4lR{KiB$Y`PhAojYvv6Ps{t!XxEG&`&Z8{U zS9S8-P*-oHl8X81dsJneg29y7HR%lu)7Wq3M5+T%xTqSn9)!&JdyuhH-YWii-Nj#T z{SqC`Xtnqa{P$AbLIFXyiP91 z-@>^LgWZpzTH82t*b+1|7bm2WG=4oK8n!g0V%JI4Oka<}q?YhdDF<}2lIGh^doM_S ztY;lR(PNbUJIXV9G-vI8a$@Sj`{RP>eeaKY7F&N@5PjsMQ7>_=+?VjJTe&-BrS2#_ zwjdrmA%4tK&Glmwu~F{52SWqcgE|FL_?*foegXs{Sm_jHMbtZd`ao~_uFE!kB~2H$ zCL*-N-G2Il=y|6nG~}ZR`oyScFcK>Ei$z9j$MIqwqY7B3FpkG~m02Sh-u2P`T)dt9 z>7b2#eIO7p+zuakL>SL?3_W34{La@XYN+GW@HeH#vI0J)IykZ%KTqY^MR_VkuM9&o zqYpxRHE2a^kb&M*xW)wa(#NjvEtTWlL6JQ!<}#ycn>%W(Xa z&r*Ck5y&tVTMv8olK3}ClxBZa&!VDVx!&7&Ao{^ClQtfRe)gaCR;*i_(Ew|-%aY59)Ah<6H;g<&YWx;)U za9m%@|pV@b3?!0A}~`2)*s_*@vl6_Pi zQTX>VE%KC1KE?<-z@}F29L7`kJu+8c=Cv9OyIno=W?J^i;>BWvn@M7F2R}QNBc#wy zxoDj4-jpx5;b~@NPPZO^tW> zCRi6?KDcZ#>nk>|DlglWx4~h*!93d3?tfNWlU?1aXQGEl`C_>k3?aJ_Wa*i!Zw*Dg zUNU36ozsvVl`Bhz3Oqnl9@#ZiRp|F;%e#A=h2d8nld9AQjo82JmXoiM6fjD zKkCWRSHYzpFRX7HKhC~ajc=JK5Kt}EFAgg3dZf29@vmT3%hl2&NwzWp%Un_79bw-0 z{RY9jqdc+G(DY8UROBZks~`cGb&ds=0pv9Xh|(Ley^ENEFR{njkkYoXen=g z#8dc@?^3W)O|LFNk-Ju{js37XWO1rX+7YUQo>9mkN!I&g9w6eN#>-+xu_rK2< z{oRbh(5mVxOeL0_?Nj{F*auHz|IYIjtE;Q^c#}peXPRg|FS_Jw@%|cG3?2^fQ;cD` zXfN7r&tn)C{d^1y>!ZBArTkrudAaz9nzeHAkNKe3-{5LROf$2#*GrSU?1F!B_mc(2 z>mN84S4G?gyEX&`?o9P@=P6!b1hZx7F#vjWr;GbH_Giy2?t~o*_AKE}TDDNL5>L|F zm9_PF<}KF$FIE5lAl;&QtB6=z-w*;Wn;oz|1YABlU_1m|F+1RCA>hi{0b?QHs@VaJ z5ODSEfc-*1b9TV~A>f+X0T+jWYi9>s8Uk9g16~jUCT9m+9s;hL9q{}RaQ*Cn%R;~n zvjZ*(0XNPLxFQ7HG&^8*2)KE6z?u-SV|Ku32$-53uullMWp+S41WeBk*gFKw%nsNq z1l&41U~LH4IXhtA5b(m;0cVDQ+hzxx8v0)-d^b{?zxYtrLJFaUrPqr#d z)}!>@2S#e~PP*coMZi0X!;`o3 z4cFcn6ViFK{$J#QDaSt{M=ty1ry;zsUT~@i4JHuHC>jnA^SJru9gt9KzL?+U zOZ0OJxlUh09yxn8BOcJOY7gd2Q+0(A#1jvS7>_ygRt7_RVf8*674K9dzLa#!j zt_|A*ZVj{^M#@cY^cOcQ_u{lYip`ga6yFGGA75l*>}i~vl-m%o5uh5ey(8C6Q%NW! z-~3aOVAC-)#7x3%y1!OoL^k_J%%cj5PsDEn_VpG}6sBEX&+zr*+6BuGTQEcwFW8ow zf)t)iCbdHIYVdviJpe21tG3Ba!9InlV<}6;9yn$bj+CpW2_+XFuTQ`Un9o(I|3BW| z1g^^B`yZcY9=Pnt1q2ioT)+$5%jyEIxTCq?nwqAW<&t_8+%G7oxo-&KZfb5VpR(Og zSy@?GSz4JHsaY=hF-t2eQ`7(ZoSAz8t?&Q${rneRdhWdEoS8XuW}j!CdD`jiPx`EV(+HjXxRwLmJK3g~Dr zOBZYI97L(Bcj04EchDnMuRE$BO)iT7A1;l+@E~vfDx!~bDK$u3K7!WF)z(qR&o|n( z9UhKQKOZOdHT)G+4LigXQDI)*)Ht#}qBg2$@$<=z7f;nJ9%UI5lu_I2uNDR=A^b|J zT1wzONa`S{jPZJ-dQ+9elYK#%sfrgD+hNg6HPBBaHFUq(>ZhtHW~ubCgMcbBD1460 zohZrx<=tWw3SYX=1EH-^xgWE79g93>an^;2^`gLAL?B!4RwZ3zWK&5GJr?GzT7>qv z?>JtDx8f6&s!4fqJ&8n^%4yc0EU*PMs95G!M?a^Z>XG$?5Zs8(l4AdTNJW|J4irW*qF~pZ} zXM4g*&XNZsO;m;!W?W=N2wwBXoz0GOst+HCaEW(@vpB6NAd~A}Ex0P^i%AkAY$~Zi zRnDh^`(++);#}j;?eiF7fW zqg2(2uGCPo9=z+koaE`IYIeY5h1-K2@L1{gU{Ra?t3c|7WOo+Y$eM+ZL$ng} zMy_dti7{*^PL;0hV7qvz$Ne&v$YiwA9q>Z0L@#?kLFteI*s&g8jV2}<=}!7lS)u6^ z#UdkYBdOVuUQ*10UUn`M+XL{8bC~f-7UxtFFzH5byDx4lk4#QX%9XC&2<@<cfGFYJaFXba6nJ{Nm|k01@qCuz_d4z@i?Y3K-&9LPBlp6YsQ*bhyzom>n?! z%98Gfwy|DlvK8iiT*=@^>-c2UqZHNlC>nLIw{(%)HiYJ0J~1^gw5ZP!#ncE;ET38x zwggYupv5DUnDZU@SDEyt zp-wp0!on(8)wo!+Qeh=v^|uBv1J^=e`>29u8t$DzTr+_uFZaO;N;iDc>k;3|JYYzt znO)6f)Im(}nr3=oMg#3B|GwIMVeZ^TSZk>C&rxSg7L3oVOOa_)g;+y;qwd2jfM#;z z?~EnX@1L_6p)B>cxl=4_sQRtAQv;FN9kp2}revyE+lB>{g@$=#Cb~kEBQCheLWhW* zv|1I`u!^vnN?wJHtgzO!jif*kf2(hvC+}55StBZ}5&whsRWz!ajd+o{oD``VRb)l9 zN3{WSL^>sIctx>m8j$^$k@-I_MCHp(ikECm%HvclI|msIAe5a)Miu`4NST!l4`6aVL`UDa5B zTNc*nD%x42Re{839`L#|3srg)m5F-39=q3b=O*47pY;Oe#@AY}BI>@d#`J4#ToGnd zskpOeZS2lmf?`;stu}WNCH_->6Dq6;|IhPlO}wkX@a$5c^3*+MtrvB?A}q!l<6BoZ z*CcCF)|)CvF({ERyVZ_-IjnZ8qarN1YObsfRl`!;IYMJjRwbDFUsO74${lLDqqU}1 zSX2KuWqA#qDsoq^A}kj54nOs+vF-v(v!-Qz%-O4TA99y&O-JrBtm)Q_im)cta+jfU z*VL^Ba@R!Vu9@4*nyzG;|2Nrf`cK(yR$*=S581Ugzavn5W&mZjzB_xF*37IkmD$U( zW+8hmtXb9;6=5x_Wv_)&y_GvJ$X-j8z1CIb;GLzs+x$~4ZBt=w!)pECwMuKNJG6JF zZEam)ZT$~fRx&&VscfydNQ=f3D#5naw#Z_(wXHR~BCK6i)vehoi|yUXATRAyUOH5j zgLhly-O()x5AHlW`C8l7I$jauR}t3P+BqWCXVxmr6Ow$aoq3E8>+(-F=~!Xy_ox91gvFAI){z_l&&|Cs)2md>kCp@$C-(3B@xTvTr50c3;{eWHh{YC%RVaTG zIY{mF=qG{d!{82ByXxeeX2cGEKhwvF?>YF>CJ-jE*n;)LW6CIclvokyi={a>nrJ5L zSRJmfM5H;lKs!z&J;VLIFroJ7iv7y!x?;Lq>ERFM!(f1yU@a^utX}yzNaSBgP`X|w z&j6W^g|2@g0i5RJTw?p#k6RFSdHyD=q%}7*u?TtupMqV8 zD_AMa!Xg~cVy!;;V^JPXtiW+TB(fqdfUHP+Y*;hp;_#iyu5%UmbgdfgpW-kF+u$GL zL6!2R>mse*x>RU0^*kOE`$VLLREZF?dn!!YUCqXRU`SFOT4<6*ts%}*q^Q&q))4IH zVOs8!VzpKc&)@o@X}aTmonL1evcrK>sRdDiwxC%UWK2!WX&r)APKFTgp}p5%~MOdNI?0rRd^O1kd&sp zP!(_n4&4hi@PMS~JaIp+GA*DuZ0Aw->T_9Zpz=(g#Lm*RjptS@)f$&JF5ZA>Vxme0 zyWMmi50|-7Ubt^CRo79okfL-OksdGbzCUgN#-^5k;cLWXP1W{=jja#M*>u-JAHd9nWa6p_bJO5>#pwsi&zbGrp<4)O~+TP+OhrJ!dc|#vh{< zQgg0HKpcwb8|r7|J$gtQp*o!FJa=>R%( z>uzlUxLDTD_89yf+fUU9^}7{;J-ldrx);m$`{*ocP||Q@i(?CNZhBV9J{{2<;3loF1j%F@$3^4!C7* zBTJ&kjR*_N#CAVfm6H$S7^%0wN|btwQEo<3Y0L`4fjCvhwKM5pVrXqu%+bOc{kO%8 zvnyHXm(f;mrh__XU+7QASI{}ngLgz&y`;hJz}9+BY%=;gv3rO5f}^=K@u7u+YQI)r z)y2muWsxGb%>40#9XEe#j5W4OZ!N6#kRHyy=)&}28^I{`t@RyH2#Ql>YS9wbKz*uR ztv=zvx-Lj3_5=Olrh2d3;)FJtuFy8>{Ha3IY8d9MVn{SzZvFcZSR|o|t6l{Sw_SJC z6y&}D|A*uM3H+~t|MW-x!$A(=7o}XyKL&m=@N0wr(Qwlr?f;&|Z&TG@Qh$ZHN&syW zlA9B@%|Y9w%1MQc-W1&n?Ef4>;i%eLip9&TTjVi(@Y-~)gw0V#w9ghM%-Ahp@}8Qr zHyD^tsE!r=s_E6uxq=GF%a5lVHBis;a?ro(T_~&W@_e~p4)X~`ZBiW}b;h=F)Lrll zkhj>dy@=pGbv?oL=^z(b59Njdy~O|&7T=9I8A>%%eH?Y5XcKB5bA-yFJ=oLxgN0EP z`R$@}UuCEW^mWlrB@gyCY!K6N=@^K4213R6{z8I3F7OqDw)V*0oX34>Van`c+Df-V!`|chQg2< zg!`o!12ltBKlAuNOKUyILB4@W^CY~w0X8Y|yMgcvK`qbLoV3Arut7W3+XjRo%JEJ=U7yFNih&AII8LkiZm_`^-ST zIvAgXr;#y8_;H764^h8*VC3iUbj(Bdk6Ox!$0qoCUebM-JfqIy6KQxT&;6twUz=oy zs&Rj78=6PbxeRnqe%x7d7U>RM>S;Oar!p}*IMLdSz7o?Ap4Uk+T8us-Xp0|xSYz?-CDnD&I>QM+oTI1b5lg8Vx$6bJ1%d8WKT+sa zrP27idlwwFtt@WWC7M}Lr=eoNgqTX2D+x}`z5_;;E<`;ygtYrvNVUGAjS6cIl`bmq z%3eVA7u7lfC885k9Ratm3y3>Q^}DK~tILQ{cAt_Jc-G0vxffK_@PpJLm|7@WIu?Pa z`P35x`00ZgNjRO!Irim_gE~GwbK;NRc2HEW(=0yD!Pq6n+M8#Zv>qcB&^>!BqIM9y ztzMQ2bkN>b{P3zn@@fbZf3Su|q|%9+NX*B8?!(2~VOm#=*SJ2K4??(02zmArjgT{J zty5X5{z!(S|Dl$4S0iE@VID79RNBan!Q7*vE?Una8(#9{4aXRwp46kMdt|vELNmqz zl}gXR%wtf;)ZM6Js58%4mBT!$>uO6!9aLI(i}0Z;^xd`a6!BP`u2@`X7O3ce) z`X=GPdxbNHDr*ud4y(XsG?Rx0f>iS|M)i-vinm((IM>^4zj%_C+y=>*w z<;ZecIk)B7U~)!+ z&ycV-Gs&xX)>kpsN%+E8r|8GK@EHBzEW(%gCEL*_i7Vsw&VRujdG%ayXctB0tjvXU zRq>|h{W=$)R5QRGGSw;u@s!4ck@H}$U~d~Kz`6g1HKcm$jS5>u$6&AgSKL~X30|sV z0t%!e;?&R?Bz#~q7$9b%| z@xA*=2(D+Di8Q~KDDirBHE*oi0`wMtc;UBD2-ExT@RK-!ngn}zu?N=%XA$*6YE!?e zu<8ezK~Gp2?{ap;@Z}l|qP7yTZm8w1P8`fdNjQrsGMIWlDPQeb!x_>bUAoTVm*0%0 z_0Ku-q(e^ZfCq6CJ44S1)7c(Yv>oJ#xc>EkF8t>ek*?YH052s+Yccxxyv<5$ZZB`V zJ4V6zvAgoa8L4+EE>s_HZpDS}v?ARM<%6`Uo$VqqUH0Ar(`nI`$_-z(M{KZyFD96o zU&343@N^n46KCnu3luKMFT!)$lm>cw&=4&6+@2rrqy}Nn2nTMxz3_~oK3+fb;eL}p z(m@j+oKME*l9D1ln?df}(j?b$*y=?)_q0=w(>$DEY`aMlXQ91ppHOD$=qh~%$zvtn zMf9PGNr;4`GPqkB9UUpn9bIGvB(MQ2d@v{V7B`W>Y?W`yrN1TXeJY9w9kD*JX``c= zA=uHOXy|p(VZf9btcFpgBO;y8sLHKgw!$RGE#RI71q&ax4jU&x)C^SFqU|EuUuljL zMwX-o{GJ}oq�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 z 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 literal 0 HcmV?d00001 diff --git a/tools/Az.Tools.Predictor/MockPSConsole/MockPSConsole.csproj b/tools/Az.Tools.Predictor/MockPSConsole/MockPSConsole.csproj new file mode 100644 index 000000000000..2e4e66b4f5ef --- /dev/null +++ b/tools/Az.Tools.Predictor/MockPSConsole/MockPSConsole.csproj @@ -0,0 +1,29 @@ + + + + Exe + net5.0 + Microsoft Corporation + A mock PowerShell console with PSReadLine that echos the command back + false + true + $(MSBuildThisFileDirectory) + $(RepoArtifacts)..\..\..\artifacts\Tools\MockPSConsole\ + + + + + + + + + + Microsoft.PowerShell.PSReadLine2.dll + + + + + + + + diff --git a/tools/Az.Tools.Predictor/MockPSConsole/Program.cs b/tools/Az.Tools.Predictor/MockPSConsole/Program.cs new file mode 100644 index 000000000000..cdecc1b6e580 --- /dev/null +++ b/tools/Az.Tools.Predictor/MockPSConsole/Program.cs @@ -0,0 +1,165 @@ +using System; +using System.Linq; +using System.Management.Automation; +using System.Management.Automation.Runspaces; +using System.Runtime.InteropServices; +using Microsoft.PowerShell; + +namespace MockPSConsole +{ + /// + /// The handle id for stdin, stdout, and stderr. + /// + enum StandardHandleId : uint + { + /// + /// The id of stderr + /// + Error = unchecked((uint)-12), + + /// + /// The id of stdout + /// + Output = unchecked((uint)-11), + + /// + /// The id of stdin + /// + Input = unchecked((uint)-10), + } + + class Program + { + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool GetConsoleMode(IntPtr hConsoleOutput, out uint dwMode); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool SetConsoleMode(IntPtr hConsoleOutput, uint dwMode); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern IntPtr GetStdHandle(uint handleId); + + static void CauseCrash(ConsoleKeyInfo? key = null, object arg = null) + { + throw new Exception("intentional crash for test purposes"); + } + + public const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x04; + public const uint ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200; + + [STAThread] + static void Main(string[] args) + { + var handle = GetStdHandle((uint)StandardHandleId.Output); + GetConsoleMode(handle, out var mode); + var vtEnabled = SetConsoleMode(handle, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + + var iss = InitialSessionState.CreateDefault2(); + if (args.Any()) + { + iss.ImportPSModule(args[0]); + } + iss.ExecutionPolicy = ExecutionPolicy.Bypass; + var rs = RunspaceFactory.CreateRunspace(iss); + rs.Open(); + Runspace.DefaultRunspace = rs; + + PSConsoleReadLine.SetOptions(new SetPSReadLineOption + { + EditMode = EditMode.Emacs, + HistoryNoDuplicates = false, + PredictionViewStyle = PredictionViewStyle.ListView, + PredictionSource = PredictionSource.HistoryAndPlugin, + }); + + if (vtEnabled) + { + var options = PSConsoleReadLine.GetOptions(); + options.CommandColor = "#8181f7"; + options.StringColor = "\x1b[38;5;100m"; + } + PSConsoleReadLine.SetKeyHandler(new[] { "Ctrl+LeftArrow" }, PSConsoleReadLine.ShellBackwardWord, "ShellBackwardWord", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "Ctrl+RightArrow" }, PSConsoleReadLine.ShellNextWord, "ShellNextWord", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "F4" }, PSConsoleReadLine.HistorySearchBackward, "HistorySearchBackward", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "F5" }, PSConsoleReadLine.HistorySearchForward, "HistorySearchForward", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "Ctrl+d,Ctrl+c" }, PSConsoleReadLine.CaptureScreen, "CaptureScreen", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "Ctrl+d,Ctrl+p" }, PSConsoleReadLine.InvokePrompt, "InvokePrompt", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "Ctrl+d,Ctrl+x" }, CauseCrash, "CauseCrash", "Throw exception to test error handling"); + PSConsoleReadLine.SetKeyHandler(new[] { "F6" }, PSConsoleReadLine.PreviousLine, "PreviousLine", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "F7" }, PSConsoleReadLine.NextLine, "NextLine", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "F2" }, PSConsoleReadLine.ValidateAndAcceptLine, "ValidateAndAcceptLine", ""); + PSConsoleReadLine.SetKeyHandler(new[] { "Enter" }, PSConsoleReadLine.AcceptLine, "AcceptLine", ""); + + + using (var ps = PowerShell.Create(rs)) + { + var executionContext = ps.AddScript("$ExecutionContext").Invoke().First(); + + // Detect if the read loop will enter VT input mode. + var vtInputEnvVar = Environment.GetEnvironmentVariable("PSREADLINE_VTINPUT"); + var stdin = GetStdHandle((uint)StandardHandleId.Input); + GetConsoleMode(stdin, out var inputMode); + if (vtInputEnvVar == "1" || (inputMode & ENABLE_VIRTUAL_TERMINAL_INPUT) != 0) + { + Console.WriteLine("\x1b[33mDefault input mode = virtual terminal\x1b[m"); + } + else + { + Console.WriteLine("\x1b[33mDefault input mode = Windows\x1b[m"); + } + + // This is a workaround to ensure the command analysis cache has been created before + // we enter into ReadLine. It's a little slow and infrequently needed, so just + // uncomment if you hit a hang, run it once, then comment it out again. + //ps.Commands.Clear(); + //ps.AddCommand("Get-Command").Invoke(); + + executionContext.InvokeProvider.Item.Set("function:prompt", ScriptBlock.Create("'TestHostPS> '")); + + while (true) + { + ps.Commands.Clear(); + Console.Write(string.Join("", ps.AddCommand("prompt").Invoke())); + + var line = PSConsoleReadLine.ReadLine(rs, executionContext); + Console.WriteLine(line); + line = line.Trim().ToLower(); + if (line.Equals("exit")) + Environment.Exit(0); + if (line.Equals("cmd")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { EditMode = EditMode.Windows }); + if (line.Equals("emacs")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { EditMode = EditMode.Emacs }); + if (line.Equals("vi")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { EditMode = EditMode.Vi }); + if (line.Equals("nodupes")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { HistoryNoDuplicates = true }); + if (line.Equals("vtinput")) + Environment.SetEnvironmentVariable("PSREADLINE_VTINPUT", "1"); + if (line.Equals("novtinput")) + Environment.SetEnvironmentVariable("PSREADLINE_VTINPUT", "0"); + if (line.Equals("listview")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { PredictionViewStyle = PredictionViewStyle.ListView }); + if (line.Equals("inlineview")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { PredictionViewStyle = PredictionViewStyle.InlineView }); + if (line.Equals("history")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { PredictionSource = PredictionSource.History }); + if (line.Equals("plugin")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { PredictionSource = PredictionSource.Plugin }); + if (line.Equals("historyplugin")) + PSConsoleReadLine.SetOptions(new SetPSReadLineOption { PredictionSource = PredictionSource.HistoryAndPlugin }); + if (line.StartsWith("import-module")) + ps.AddScript(line).Invoke(); + if (line.StartsWith("get-module")) + { + var modules = ps.AddScript(line).Invoke().ToList(); + foreach (var m in modules) + { + Console.WriteLine(((PSModuleInfo)m.BaseObject).Name); + } + } + } + } + } + } +}