Chaos.Autorest/custom/Initialize-AzChaosWorkspace.ps1
|
# ---------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ---------------------------------------------------------------------------------- <# .Synopsis Stand up a ready-to-use Chaos Studio workspace end to end. .Description Stand up a ready-to-use Chaos Studio workspace end to end. This is a first-day workflow cmdlet that runs the five setup steps: ensure the resource group exists, create the workspace with a system-assigned managed identity, grant that identity the Reader role on each scope, evaluate scenarios, and report the discovered scenarios plus suggested next commands. Discovery and evaluation run under the workspace identity and cannot enumerate resources without the Reader grant. Pass -SkipPermission to opt out of the RBAC grant. Pass -SkipEvaluationWait to run a single evaluation attempt instead of waiting out Azure Resource Graph propagation. The default Reader grant enables discovery and evaluation only; most run actions need additional permissions. Use Repair-AzChaosScenarioConfigurationResourcePermission after creating a scenario configuration to inspect or grant those permissions. .Example Initialize-AzChaosWorkspace -ResourceGroupName rg -WorkspaceName ws -Location eastus -Scope '/subscriptions/00000000-0000-0000-0000-000000000000' .Example Initialize-AzChaosWorkspace -ResourceGroupName rg -WorkspaceName ws -Location eastus -Scope $scopes -SkipPermission -SkipEvaluationWait .Outputs Microsoft.Azure.PowerShell.Cmdlets.Chaos.Models.IScenario .Link https://learn.microsoft.com/powershell/module/az.chaos/initialize-azchaosworkspace #> function Initialize-AzChaosWorkspace { [OutputType('Microsoft.Azure.PowerShell.Cmdlets.Chaos.Models.IScenario')] [CmdletBinding(DefaultParameterSetName='InitializeExpanded', PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact='Medium')] param( [Parameter(Mandatory, HelpMessage='Name of the workspace.')] [System.String] ${WorkspaceName}, [Parameter(Mandatory, HelpMessage='Name of the resource group. The resource group is created in -Location if it does not already exist.')] [System.String] ${ResourceGroupName}, [Parameter(Mandatory, HelpMessage='The geo-location where the workspace lives.')] [System.String] ${Location}, [Parameter(Mandatory, HelpMessage='The list of ARM resource scopes the workspace discovers and evaluates.')] [System.String[]] ${Scope}, [Parameter(HelpMessage='The ID of the target subscription.')] [System.String] ${SubscriptionId}, [Parameter(HelpMessage='Resource tags applied to the workspace.')] [System.Collections.Hashtable] ${Tag}, [Parameter(HelpMessage='The role definition name granted to the workspace identity on each scope. Defaults to Reader.')] [Microsoft.Azure.PowerShell.Cmdlets.Chaos.Runtime.DefaultInfo(Script='"Reader"')] [System.String] ${RoleDefinitionName} = 'Reader', [Parameter(HelpMessage='Do not grant the workspace identity an RBAC role on the scopes.')] [System.Management.Automation.SwitchParameter] ${SkipPermission}, [Parameter(HelpMessage='Run a single evaluation attempt instead of waiting for Azure Resource Graph propagation.')] [System.Management.Automation.SwitchParameter] ${SkipEvaluationWait}, [Parameter(HelpMessage='The DefaultProfile parameter is not functional. Use the SubscriptionId parameter when available if executing the cmdlet against a different subscription.')] [Alias('AzureRMContext','AzureCredential')] [ValidateNotNull()] [System.Management.Automation.PSObject] ${DefaultProfile} ) process { # Emit errors through $PSCmdlet so PowerShell attributes them to the cmdlet and # the caller's own command line. A bare `throw` raised inside one of the private # helpers below reports this file's path, line number and the private function's # name instead -- none of which the caller can act on. See DEV-040. function New-AzChaosErrorRecord { param( [string]$Message, [string]$ErrorId, [System.Management.Automation.ErrorCategory]$Category = [System.Management.Automation.ErrorCategory]::InvalidOperation, [object]$TargetObject ) return [System.Management.Automation.ErrorRecord]::new( [System.InvalidOperationException]::new($Message), $ErrorId, $Category, $TargetObject) } function Assert-AzChaosAzResourcesAvailable { $moduleName = 'Az.Resources' $requiredCommands = @('Get-AzResourceGroup', 'New-AzResourceGroup', 'New-AzRoleAssignment') if (-not (Get-Module -Name $moduleName)) { $availableModule = Get-Module -ListAvailable -Name $moduleName | Select-Object -First 1 if ($null -eq $availableModule) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Initialize-AzChaosWorkspace requires the $moduleName module for resource group and role assignment operations. Install it with: Install-Module $moduleName -Scope CurrentUser" ` -ErrorId 'RequiredModuleNotInstalled' ` -Category ([System.Management.Automation.ErrorCategory]::NotInstalled) ` -TargetObject $moduleName)) } try { Import-Module -Name $moduleName -ErrorAction Stop } catch { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Initialize-AzChaosWorkspace found $moduleName but could not load it: $($_.Exception.Message). Update $moduleName or resolve conflicting Az.Accounts versions, then retry." ` -ErrorId 'RequiredModuleNotLoadable' ` -Category ([System.Management.Automation.ErrorCategory]::ResourceUnavailable) ` -TargetObject $moduleName)) } } $missingCommands = @($requiredCommands | Where-Object { -not (Get-Command -Name $_ -ErrorAction SilentlyContinue) }) if ($missingCommands.Count -gt 0) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Initialize-AzChaosWorkspace requires $moduleName commands that are not available: $($missingCommands -join ', '). Reinstall or update $moduleName, then retry." ` -ErrorId 'RequiredModuleCommandMissing' ` -Category ([System.Management.Automation.ErrorCategory]::ResourceUnavailable) ` -TargetObject $moduleName)) } } function Test-AzChaosScenarioRecommendationPending { param([object[]]$Scenario) foreach ($item in @($Scenario)) { $status = $item.RecommendationStatus $isCatalogScenario = -not [System.String]::IsNullOrEmpty($item.CreatedFrom) # Keep in sync with generated\api\Models\ScenarioProperties.cs:178. if ($status -in @('NotEvaluated', 'Evaluating') -or ($isCatalogScenario -and [System.String]::IsNullOrEmpty($status))) { return $true } if (-not [System.String]::IsNullOrEmpty($status) -and $status -notin @('Recommended', 'NotApplicable', 'EvaluationFailed', 'EvaluationCancelled')) { return $true } } return $false } function Get-AzChaosObjectPropertyValue { param( [object]$InputObject, [string[]]$Name ) if ($null -eq $InputObject) { return $null } foreach ($candidate in $Name) { $property = $InputObject.PSObject.Properties[$candidate] if ($null -ne $property) { return $property.Value } } $properties = $InputObject.PSObject.Properties['Properties'] if ($null -ne $properties -and $null -ne $properties.Value -and -not [object]::ReferenceEquals($InputObject, $properties.Value)) { foreach ($candidate in $Name) { $property = $properties.Value.PSObject.Properties[$candidate] if ($null -ne $property) { return $property.Value } } } return $null } function ConvertTo-AzChaosCollection { param([object]$InputObject) if ($null -eq $InputObject) { return @() } if ($InputObject -is [string]) { return @($InputObject) } if ($InputObject -is [System.Collections.IEnumerable]) { return @($InputObject) } return @($InputObject) } function Test-AzChaosErrorObjectHasContent { param( [object]$InputObject, [string[]]$Name ) if ($null -eq $InputObject) { return $false } foreach ($candidate in $Name) { $value = Get-AzChaosObjectPropertyValue -InputObject $InputObject -Name @($candidate) if ($value -is [System.Collections.IEnumerable] -and $value -isnot [string]) { if (@($value | Where-Object { -not [System.String]::IsNullOrWhiteSpace([string]$_) }).Count -gt 0) { return $true } } elseif (-not [System.String]::IsNullOrWhiteSpace([string]$value)) { return $true } } return $false } function Format-AzChaosWorkspaceEvaluationFailure { param( [string]$WorkspaceName, [object]$Evaluation ) $status = Get-AzChaosObjectPropertyValue -InputObject $Evaluation -Name @('Status') $errors = @(ConvertTo-AzChaosCollection -InputObject (Get-AzChaosObjectPropertyValue -InputObject $Evaluation -Name @('Errors', 'Error')) | Where-Object { Test-AzChaosErrorObjectHasContent -InputObject $_ -Name @('ErrorCode', 'Code', 'ErrorMessage', 'Message') }) $details = @() foreach ($errorItem in $errors) { $code = Get-AzChaosObjectPropertyValue -InputObject $errorItem -Name @('ErrorCode', 'Code') $message = Get-AzChaosObjectPropertyValue -InputObject $errorItem -Name @('ErrorMessage', 'Message') if ([System.String]::IsNullOrWhiteSpace($code)) { $details += $message } elseif ([System.String]::IsNullOrWhiteSpace($message)) { $details += $code } else { $details += "$code`: $message" } } if ($details.Count -eq 0) { $details += 'No detailed evaluation errors were returned.' } return "Workspace evaluation for workspace '$WorkspaceName' returned status '$status'. $($details -join ' ')" } function Test-AzChaosWorkspaceEvaluationHasRbacPropagationError { param([object]$Evaluation) $errors = @(ConvertTo-AzChaosCollection -InputObject (Get-AzChaosObjectPropertyValue -InputObject $Evaluation -Name @('Errors', 'Error')) | Where-Object { Test-AzChaosErrorObjectHasContent -InputObject $_ -Name @('ErrorCode', 'Code', 'ErrorMessage', 'Message') }) foreach ($errorItem in $errors) { $code = Get-AzChaosObjectPropertyValue -InputObject $errorItem -Name @('ErrorCode', 'Code') # Chaos.Workspaces.Worker/ErrorCodes.cs emits this when discovery cannot read scopes under a just-created role assignment. if ($code -eq 'ResourceDiscoveryPermissionError') { return $true } } return $false } function Assert-AzChaosWorkspaceEvaluationNotFailed { param( [string]$WorkspaceName, [object]$Evaluation ) if ($null -eq $Evaluation -or $Evaluation -is [bool]) { return } # Keep status list in sync with generated\api\Models\WorkspaceEvaluationProperties.cs:246. $knownStatuses = @('Pending', 'Queued', 'InProgress', 'Succeeded', 'PartiallySucceeded', 'Failed', 'Canceled') $status = Get-AzChaosObjectPropertyValue -InputObject $Evaluation -Name @('Status') if (-not [System.String]::IsNullOrEmpty($status) -and $status -notin $knownStatuses) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Workspace evaluation for workspace '$WorkspaceName' returned unrecognized status '$status'." ` -ErrorId 'WorkspaceEvaluationUnrecognizedStatus' ` -TargetObject $WorkspaceName)) } if ($status -in @('Failed', 'Canceled')) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message (Format-AzChaosWorkspaceEvaluationFailure -WorkspaceName $WorkspaceName -Evaluation $Evaluation) ` -ErrorId 'WorkspaceEvaluationFailed' ` -TargetObject $WorkspaceName)) } } function Invoke-AzChaosWorkspaceScenarioEvaluationWithRetry { param( [hashtable]$EvaluationParameter, [string]$WorkspaceName, [bool]$RetryRbacPropagation ) $retryIntervalSeconds = 15 # 21 attempts: the initial evaluation plus twenty retries, so five minutes for # just-created RBAC assignments to propagate. Sized from a measured 222-second # worst case on the scenario-validation path; this discovery path shares the # same underlying ARM RBAC propagation but was not separately measured. The # previous 90-second budget was under half the measured figure. See DEV-041. $maxAttempts = 21 for ($attempt = 1; $attempt -le $maxAttempts; $attempt++) { # Re-attribute plumbing failures to this cmdlet. Without the catch, PowerShell # names the internal generated cmdlet variant and this file's line, which points # the user at a command they did not call. See DEV-044. try { $evaluation = Invoke-AzChaosWorkspaceScenarioEvaluation @EvaluationParameter } catch { $PSCmdlet.ThrowTerminatingError($_) } $status = Get-AzChaosObjectPropertyValue -InputObject $evaluation -Name @('Status') if ($status -in @('Failed', 'Canceled') -and $RetryRbacPropagation -and (Test-AzChaosWorkspaceEvaluationHasRbacPropagationError -Evaluation $evaluation) -and $attempt -lt $maxAttempts) { Write-Verbose "Workspace evaluation for '$WorkspaceName' failed with an RBAC propagation error. Waiting $retryIntervalSeconds seconds before retrying evaluation." Start-Sleep -Seconds $retryIntervalSeconds continue } Assert-AzChaosWorkspaceEvaluationNotFailed -WorkspaceName $WorkspaceName -Evaluation $evaluation return $evaluation } } function Get-AzChaosLatestWorkspaceEvaluationIfAvailable { param( [hashtable]$CommonParameter, [string]$ResourceGroupName, [string]$WorkspaceName ) if (-not (Get-Command -Name Get-AzChaosWorkspaceEvaluation -ErrorAction SilentlyContinue)) { return $null } try { return Get-AzChaosWorkspaceEvaluation @CommonParameter -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName -ErrorAction Stop } catch { Write-Verbose "Get-AzChaosWorkspaceEvaluation failed while checking workspace '$WorkspaceName': $($_.Exception.Message). Continuing scenario recommendation polling." return $null } } function Wait-AzChaosWorkspaceScenarioRecommendation { param( [hashtable]$CommonParameter, [hashtable]$EvaluationParameter, [string]$ResourceGroupName, [string]$WorkspaceName, [bool]$RetryRbacPropagation ) $deadline = [System.DateTimeOffset]::UtcNow.AddMinutes(10) $intervalSeconds = 15 $evaluationRetryCount = 0 $maxEvaluationRetryCount = 20 # Twenty re-runs at 15 seconds each: five minutes for just-created RBAC assignments to propagate (DEV-041). The 10-minute deadline above still bounds the whole wait. $knownStatuses = @('NotEvaluated', 'Recommended', 'NotApplicable', 'Evaluating', 'EvaluationFailed', 'EvaluationCancelled') $warnedUnknownStatus = @{} $lastErrorMessage = $null do { $evaluation = Get-AzChaosLatestWorkspaceEvaluationIfAvailable -CommonParameter $CommonParameter -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName $evaluationStatus = Get-AzChaosObjectPropertyValue -InputObject $evaluation -Name @('Status') if ($evaluationStatus -in @('Failed', 'Canceled')) { if ($evaluationStatus -eq 'Failed' -and $RetryRbacPropagation -and (Test-AzChaosWorkspaceEvaluationHasRbacPropagationError -Evaluation $evaluation) -and $evaluationRetryCount -lt $maxEvaluationRetryCount) { $evaluationRetryCount++ Write-Verbose "Workspace evaluation for '$WorkspaceName' failed with ResourceDiscoveryPermissionError. Waiting $intervalSeconds seconds before re-running evaluation." Start-Sleep -Seconds $intervalSeconds try { $null = Invoke-AzChaosWorkspaceScenarioEvaluation @EvaluationParameter } catch { $PSCmdlet.ThrowTerminatingError($_) } continue } Assert-AzChaosWorkspaceEvaluationNotFailed -WorkspaceName $WorkspaceName -Evaluation $evaluation } if ($evaluationStatus -in @('Pending', 'Queued', 'InProgress')) { if ([System.DateTimeOffset]::UtcNow -ge $deadline) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Timed out waiting for workspace evaluation in workspace '$WorkspaceName' to finish after 10 minutes. Re-run Get-AzChaosWorkspaceEvaluation to inspect current status, or use -SkipEvaluationWait to skip this propagation wait." ` -ErrorId 'WorkspaceEvaluationTimedOut' ` -Category ([System.Management.Automation.ErrorCategory]::OperationTimeout) ` -TargetObject $WorkspaceName)) } Write-Verbose "Workspace evaluation for '$WorkspaceName' is '$evaluationStatus'. Waiting $intervalSeconds seconds before checking again." Start-Sleep -Seconds $intervalSeconds continue } try { $scenarios = Get-AzChaosScenario @CommonParameter -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName -ErrorAction Stop $lastErrorMessage = $null } catch { $lastErrorMessage = $_.Exception.Message if ([System.DateTimeOffset]::UtcNow -ge $deadline) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Timed out waiting for scenario recommendations in workspace '$WorkspaceName' after 10 minutes. The last Get-AzChaosScenario attempt failed: $lastErrorMessage" ` -ErrorId 'ScenarioRecommendationTimedOut' ` -Category ([System.Management.Automation.ErrorCategory]::OperationTimeout) ` -TargetObject $WorkspaceName)) } Write-Verbose "Get-AzChaosScenario failed while waiting for workspace '$WorkspaceName': $lastErrorMessage. Waiting $intervalSeconds seconds before retrying." Start-Sleep -Seconds $intervalSeconds continue } foreach ($scenario in @($scenarios)) { $status = $scenario.RecommendationStatus if (-not [System.String]::IsNullOrEmpty($status) -and $status -notin $knownStatuses -and -not $warnedUnknownStatus.ContainsKey($status)) { Write-Warning "Scenario '$($scenario.Name)' in workspace '$WorkspaceName' returned unrecognized recommendation status '$status'. Continuing to poll until the wait timeout." $warnedUnknownStatus[$status] = $true } } if (-not (Test-AzChaosScenarioRecommendationPending -Scenario $scenarios)) { if ($null -eq $scenarios -or 0 -eq @($scenarios).Count) { Write-Verbose "No scenarios were discovered for workspace '$WorkspaceName'." } else { Write-Verbose "Scenario recommendations for workspace '$WorkspaceName' reached a terminal state." } return $scenarios } if ([System.DateTimeOffset]::UtcNow -ge $deadline) { $PSCmdlet.ThrowTerminatingError((New-AzChaosErrorRecord ` -Message "Timed out waiting for scenario recommendations in workspace '$WorkspaceName' to reach Recommended, NotApplicable, EvaluationFailed, or EvaluationCancelled after 10 minutes. Re-run Get-AzChaosScenario to inspect current status, or use -SkipEvaluationWait to skip this propagation wait." ` -ErrorId 'ScenarioRecommendationTimedOut' ` -Category ([System.Management.Automation.ErrorCategory]::OperationTimeout) ` -TargetObject $WorkspaceName)) } Write-Verbose "Waiting $intervalSeconds seconds for Azure Resource Graph propagation before checking scenario recommendations again." Start-Sleep -Seconds $intervalSeconds } while ($true) } $common = @{} if ($PSBoundParameters.ContainsKey('SubscriptionId')) { $common['SubscriptionId'] = $SubscriptionId } if ($PSBoundParameters.ContainsKey('DefaultProfile')) { $common['DefaultProfile'] = $DefaultProfile } # This dependency is unconditional: -SkipPermission avoids New-AzRoleAssignment, # but resource-group discovery/creation still needs Az.Resources. Assert-AzChaosAzResourcesAvailable # Resolve the resource group before ShouldProcess so the confirmation and -WhatIf can # disclose everything this operation creates. This is a read and is safe to run under # -WhatIf. Previously ShouldProcess named only the workspace, so a user who typo'd # -ResourceGroupName was not told a resource group would be created, and then it was. # See DEV-045. # SilentlyContinue covers the expected not-found case; the catch re-attributes anything # genuinely terminating, such as an auth or subscription failure, which it does not suppress. try { $resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue } catch { $PSCmdlet.ThrowTerminatingError($_) } $mustCreateResourceGroup = ($null -eq $resourceGroup) $shouldProcessTargets = @("workspace '$WorkspaceName'") if ($mustCreateResourceGroup) { $shouldProcessTargets += "new resource group '$ResourceGroupName' in '$Location'" } $shouldProcessTargets += 'a system-assigned managed identity' if (-not $SkipPermission) { $shouldProcessTargets += "a '$RoleDefinitionName' role assignment on $(@($Scope).Count) scope(s)" } if (-not $PSCmdlet.ShouldProcess(($shouldProcessTargets -join ', '), 'Initialize Chaos Studio workspace')) { return } # Step 1: create the resource group if it does not exist. Announce it rather than only # writing it to the verbose stream, which is invisible unless the user asked for it. if ($mustCreateResourceGroup) { Write-Host "Creating resource group '$ResourceGroupName' in '$Location'." try { $null = New-AzResourceGroup -Name $ResourceGroupName -Location $Location } catch { $PSCmdlet.ThrowTerminatingError($_) } } # Step 2: create the workspace with a system-assigned managed identity. $workspaceParams = @{ Name = $WorkspaceName ResourceGroupName = $ResourceGroupName Location = $Location Scope = $Scope EnableSystemAssignedIdentity = $true } if ($PSBoundParameters.ContainsKey('Tag')) { $workspaceParams['Tag'] = $Tag } try { $workspace = New-AzChaosWorkspace @common @workspaceParams } catch { $PSCmdlet.ThrowTerminatingError($_) } # Step 3: grant the workspace identity the Reader role on each scope. if (-not $SkipPermission) { $principalId = $workspace.IdentityPrincipalId if ([System.String]::IsNullOrEmpty($principalId)) { Write-Warning "Workspace '$WorkspaceName' has no system-assigned identity principal id. Skipping the RBAC grant. Discovery and evaluation may not enumerate resources." } else { foreach ($resourceScope in $Scope) { Write-Verbose "Granting '$RoleDefinitionName' to identity '$principalId' on '$resourceScope'." try { $null = New-AzRoleAssignment -ObjectId $principalId -RoleDefinitionName $RoleDefinitionName -Scope $resourceScope -ErrorAction Stop } catch { $PSCmdlet.ThrowTerminatingError($_) } } } } # Step 4: evaluate scenarios. Wait for the evaluation and ARG propagation unless a single attempt is requested. $evaluationParams = @{ ResourceGroupName = $ResourceGroupName WorkspaceName = $WorkspaceName } if ($PSBoundParameters.ContainsKey('SubscriptionId')) { $evaluationParams['SubscriptionId'] = $SubscriptionId } if ($PSBoundParameters.ContainsKey('DefaultProfile')) { $evaluationParams['DefaultProfile'] = $DefaultProfile } $null = Invoke-AzChaosWorkspaceScenarioEvaluationWithRetry -EvaluationParameter $evaluationParams -WorkspaceName $WorkspaceName -RetryRbacPropagation:(-not $SkipPermission -and -not $SkipEvaluationWait) if (-not $SkipEvaluationWait) { $scenarios = Wait-AzChaosWorkspaceScenarioRecommendation -CommonParameter $common -EvaluationParameter $evaluationParams -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName -RetryRbacPropagation:(-not $SkipPermission) } else { try { $scenarios = Get-AzChaosScenario @common -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName -ErrorAction SilentlyContinue } catch { $PSCmdlet.ThrowTerminatingError($_) } } # Step 5: report the discovered scenarios and suggest next commands. Write-Host "Workspace '$WorkspaceName' is ready. Suggested next commands:" Write-Host " Get-AzChaosScenario -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName" Write-Host " Repair-AzChaosScenarioConfigurationResourcePermission -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName -ScenarioName <name> -Name <configuration> -WhatIfMode" Write-Host " Start-AzChaosScenarioRun -ResourceGroupName $ResourceGroupName -WorkspaceName $WorkspaceName -ScenarioName <name> -Name <configuration>" return $scenarios } } # SIG # Begin signature block # MIInbgYJKoZIhvcNAQcCoIInXzCCJ1sCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDWhqLosr8CznkC # xYLwNP3Utqs2rOZlDYw8ZTFP23GqpaCCDMkwggYEMIID7KADAgECAhMzAAACHPrN # xZvoL37EAAAAAAIcMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQxWhcNMjcwNDE1MTg1 # OTQxWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDVsZfgOKmM31HPfoWOoNEiw0SlCiIxUMC0I9NMWbucKOw/e9lP # oAoehQVu6SG65V4EPzrYsnBnFPNoi4/HoOdjhz1qkrEt4I6tEcxXU6oOeY9zGveC # /3iBeuhLYxM3M/PkcUoebF+Nednm8OkdSPoDu8imViHPQq/8CQUu0WRR4rE+dMRf # rpVqfmNi2qWCX94T4MsepijGVkwE//tJg0ryAiYdHT34LSnlG/RSBZmQRGWZ5g8j # qnKjRParSqMft1gvjuUTVgtWNZfgcLFSK5Wa0myrq8OPcgTGGsRgun+tnSS+IxDT # xVsAPH1OzvPjwomguByhUe/OcvUN0D5Wmp7xAgMBAAGjggGqMIIBpjAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFNoH7a2YDjOSwpkp6DHcmUS7J+0yMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxFjAUBgNVBAUT # DTIzMDAxMis1MDc1NjkwHwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEw # YAYDVR0fBFkwVzBVoFOgUYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # bDBtBggrBgEFBQcBAQRhMF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDI0LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IC # AQAUnEqhaRXe0T3hIJjvdQErEkrA/7bByjn6t5IArODkkRjzkYwtKMc2yYj2quaN # rLutWw2YZcngKPy1b71YyDJQTy4NDRwaSh9Tw5thrk3NmcPrAHia5vtcBJ1CgtKK # 7mQbIcQ22d/N3813ayCDDFewu1+jsZmX+r/aTEqaOM4TVxVtRSkuCy8nAXKuChOK # Li/zA4XuH8iEYqIsj2YoNaeSxVmeGiERXpKdo3dDmYi0kO5w2D8VS4c3+9h6gElY # BaAAg/dYErBg27qT3vv0zRDJhJufvCNylA8S7/+8H5E/PV5cng6na9VV/w9OV3qu # uND6zdGa2EX38Glp50F9AIQk3p2xXmcvorDeM4XJ7UlWYBi6g80J1SSOQnInCYFE # msfUNn3+1AaTJKSJL83quKArTac2pKhu0Yzzzrzo6HrsRiQKzpnRBb1/dMa6P3hz # 75XbMRBctNsFhZC07WCmjExdLg2eHW5uV0TY8D5+6wozJf7vF3+WHkYPO85Z+BC6 # U4FkNbYNycZ9cE4j1tXRdyDCfml6c0HWPHjNVDObrv9lKt3qUqFpX38VCqVCyNOO # 1UcXfQiVjJw32U2WUKZjt/neJKHEBsm9kFsLuWzkQ53+qcaSaytmsCnk2gOglrlD # 5d3kKyvvAw+rzm0lT8K38P6PLxfZQHhu4W8dV7Av8N2ZmDCCBr0wggSloAMCAQIC # EzMAAAA5O7Y3Gb8GHWcAAAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoX # DTM2MDMyMjIyMTMwNFowVzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQ # Q0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeq # lRYHNa265v4IY9fH8TKhemHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo # 0dtS/EW6I/yEL/bLSY8hKpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATv # QVL4tcf03aTycsz8QeCdM0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a # 1uv1zerOYMnsneRRwCbpyW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1 # FyQfK0fVkaya8SmVHQ/tOf23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfO # GSWHIIV4YrTJTT6PNty5REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7 # ttOu1bVnXfHaqPYl2rPs20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJ # uz2MXMCt7iw7lFPG9LXKGjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxS # CwyoGIq0PhaA7Y+VPct5pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOm # VQop36wUVUYklUy++vDWeEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3 # SkE/xIkgpfl22MM1itkZ35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPX # LQaUEggxMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBP # oE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAw # TgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOC # AgEAFJQfOChP7onn6fLIMKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D # 5W4wMwYeLystcEqfkjz4NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBY # nbu0+THSuVHTe0VTTPVhily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSI # vgn0JksVBVMYVI5QFu/qhnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6 # aR9y34aiM1qmxaxBi6OUnyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4w # PKC5OmHm1DQIt/MNokbbH3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7 # RTX8AdBPo0I6OEojf39zuFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK # /fg8B2qjW88MT/WF5V5uvZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSK # YBv0VisCzfxgeU+dquXW9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkw # YTu/9dLeH2pDqeJZAABVDWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVT # Ql0v4q8J/AUmQN5W4n101cY2L4A7GTQG1h32HHAvfQESWP0xghn7MIIZ9wIBATBu # MFcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIc # +s3Fm+gvfsQAAAAAAhwwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZI # hvcNAQkEMSIEID3Ofwe5/GHZ+VAaXmpSOSmoYIY8mE5GxM+XkJTmy875MEIGCisG # AQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAP6sZFPXWjhYYnY5Lklgl # Neq6SbYpqh+da/+TrskjB1eLvNfxvm5/F8jFmalL0328+nlDAS1pgxcbSsUGBbCB # 4/CzHy3vaVUp/0hjF2LsfN1/OP/kmjYdLNvTTI4tzAsaU07Tu31i5PZvOFKyVmlU # /MYOBiaJGVARBUxxxaNa+DajE+ekR1hZIVQZZ5nZ3tbm4nxCcPCui9LUic3tHFsa # omY/dDf8VK1e/WKVZOq5y9y2X1yjyM5klgY8nTT41J1pRlU9uNgLMjU6Zy27JY6n # iKQP5xEdxGr8hgM+QIX1QIxPZEw3HnZLMnkEUZ9I/TZvnDTf21r9gP1dwW3sL5BB # VqGCF60wghepBgorBgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheC # AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIB # QQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAQKNl1AYjSpI+DUtdQ # UCbvhub6w73GOfd3bXOTqROJpAIGatzUyxNZGBMyMDI2MTAyODAwNDM1MC42MTda # MASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0 # ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0MzFBLTA1RTAtRDk0NzElMCMG # A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKAD # AgECAhMzAAACHUvAkoc4hX45AAEAAAIdMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29m # dCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI1MDgxNDE4NDgzM1oXDTI2MTExMzE4 # NDgzM1owgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr # BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG # A1UECxMeblNoaWVsZCBUU1MgRVNOOjQzMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxN # aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAorSgaAA8oOl4ph574zw29egUN8DDepRHLX8FM1zHNJmXG6Kr # SqUKwzcKafopuYdPTETTCvb9aJfESuAU0iGNUFI/D6R0kvdfpe2oPX+E3sbTQvGi # 4JPH5qdIYUaJ45V/4bqe8eNvbWzpC+ZKjH193DeiI1XAI918JoQmBhlEXo/Ton17 # 21luZJgincsf5LjMY3jX84WyXUSX3dsS7h/7xVI+w1yjg7pa+0y3o/me2Tsv6UJU # dSTQap5ORGSfCnclnP1z3IiiWIWr3Vo7aIPWsgJzq3m5GxpxUHCQk8qzUhk50y/u # B+LGE3WIK2C77iy9iFsSfSLUnyMEzGRDW9mXHT4PH7Ozz6CHqQEiNvwcHqlvlCh1 # pHQh1NXQSAqOoVBs5mi6easf6yxWTfe5DrR79503r8pU6VqC2Y9XMRU4wH9QbYXY # sIUZ33Jmndy22W1LBDAbxBPQHCBlncGDU3BgdhVUVLe80mggFO98FdkWho67w4kP # dCTRkvdvkY8PrQYE/nQjHXCa0g7LcMttZb6ejMHfQ+tUWXv6+nZ4Ynkr2OkaxclF # Cw4RIYNMWD26AWbQj/WEdzga18fKtw66L5gzXPza6jFBfPJeKE3H8QAuwpirmH4m # s+5nUjNNQOmNgqJn0U1+3Yn7ClswD79YN0r3fdbYBMDApBZJpNlK7q7HXRsCAwEA # AaOCAUkwggFFMB0GA1UdDgQWBBSEWfBxNEamZtXm8gl92Yq80jfxXTAfBgNVHSME # GDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1l # LVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsG # AQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p # Y3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMB # Af8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDAN # BgkqhkiG9w0BAQsFAAOCAgEAkdweB4yxvLspLKq0D+miyD4Q0EcxVFpNZuJxiR54 # gWRkeTDDuymNeB03JhlsBpbwSYJ5uZSgDBCvwHED2VL8lJpFlOprJzxsXWC2NTfA # +O+PO5Fk5jw6LHh6jeBADDEdQAx3Hqi7Zm0JwvQ93z5f6dtxkm29WqOcHYXRXfAQ # wy1hSrLXyfeblqR66jpP/9n0fCkWU4ggsUjQpQ2Ngj1DV09J4Y3y7p9Nd81+Xs6q # Yo++7RKm8qiB/5NDeigOLjlAeFgiEXIRUJW+mJyqpQw+OORlaqcFjR8Hu0G+/7bM # dek68YX+kPpDBk7Ue+I/xgiYJ1xcDRBn/vczLtN72+RIlD4UgXYLuBSCk//pDEPX # 5z39Cr+rkc6E4Y28FPk4BhloAyvp628P4xfElQY8TcxraUbZShypocE6ny95D1K1 # BkltZmrHVKCxmglnuOlM15NKIrXFlXCzdqpCtIwQ417wNAVF/QDPvzzbumPdTi6f # b0tLbScYobV6zvbBsMsKEME4Tj1b9oIXC8dybJq4nbboEXYpRwi1QAbpSNrn+PxG # W9uf1q63FnMJu4gm3Oh63njW/iVf723quzyHrSijWMgY0HiRiHQi0Jyu0h8MdhRU # p7mxbmLQckPiOFwAlIaUN/k725y/aLWpkRU6fqmLlEOyH5WpyLd23AYy9r8v+Qob # a6swggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEB # CwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAe # Fw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGm # TOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/H # ZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDc # wUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62A # W36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1w # jjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCG # MFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ # 1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP # 8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFz # ymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHz # NgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3 # xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsG # AQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/ # LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEG # DCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYB # BQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8G # A1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQw # VgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9j # cmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUF # BwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQEL # BQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfC # cTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AF # vonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l # 9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn # 8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5m # O0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyx # TkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4 # S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9 # y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM # +Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhw # RNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4C # AQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0 # ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0MzFBLTA1RTAtRDk0NzElMCMG # A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIa # AxUAuoO+BKbfXzqyfi9GLEdWHkCLeT+ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzET # MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T # dGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAO6LR3YwIhgPMjAyNjEwMjcx # NTUzMjZaGA8yMDI2MTAyODE1NTMyNlowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA # 7otHdgIBADAHAgEAAgISOTAHAgEAAgITdzAKAgUA7oyY9gIBADA2BgorBgEEAYRZ # CgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0G # CSqGSIb3DQEBCwUAA4IBAQBH27TriJgKpr/V/Lx+FVFCRRSw6nwPE69yHCef5MMa # o+c3Oki50ea3aPENPh5ZNAyOFOMFL9p8pxzTqf3xT9IB1Np656QXcpucoxk564T/ # vPRr7O7+gpa4yo5Lbs1uJM4TchNtkz31inRTZn0AwNhCtw37RIbEKGyVBGBZNwMq # axO2ZAZdj9tQ2sJTG/zRm5ZPqRoJ3vC7Rq+f9De+WFh/mMAc+RcmR82/1t5Ta3AC # 9LIzTabqz6hSeONj90xPCCp9hGGtV0KHheuWYYfICGhIVTyFLsrYSJAx2kT4WEkk # QyjNYfQ920tACEQUHqBQHY50YbfIHME7kTI7n0g1BYQXMYIEDTCCBAkCAQEwgZMw # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIdS8CShziFfjkAAQAA # Ah0wDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB # BDAvBgkqhkiG9w0BCQQxIgQgem45UB7lthogCdhTampjdHfEwvvnzetfYkGe8kfu # LfcwgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCCxtpXMXEiLJzrqM77ep4rT # NwrMOj6gpWN9hZvpj5QFUTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAACHUvAkoc4hX45AAEAAAIdMCIEICiATKfom7WC5GuVKNy2iB3w # niyJpOVGf8c+0LuQYM5mMA0GCSqGSIb3DQEBCwUABIICABbPvOzivNERhQSSkSac # ViicqDZmWaaamRM8WDifKl3JwvsXG/WPi7vCR2mq2gqcjdQUhol2NGfEbOCvUcHB # 895yo/RtlD1OyX8e6SQTnXdo9NsrG73xyMUeOEExh80+PgU24QlPll+DZ/X4dkwf # +AWBcCdWjQbpkjSh/Q3hvrkSvD+m5ZpKjTTXcXPRJDrwziIg+y4aGM2l9WVLDEpp # 2QsGZ+pwGDv31113r2fgqhsxzT9b2g3vm22uYAc0ipmKsMXhe/dTKX5IBen+DVyG # C9HWEJbULV4OXF5YZ9s6Yecctq6G7vDbg6O7Pd9hg2DdC0k+KNi2vmwcKcBvaY0l # 3qjydcA60KWefNetRrVxeWIU5r6QZ3shuIpPym77ksTJcCPCXIHQ/kmNjUi9KH6q # C3QKNFVlPnP/eIS4mHAK7UKUegdcJGeLzvFhaiP0uGHuwmazDxt/8zTWrW3mQhs4 # p9FzzacmL9x8TMffjBxjmZcVqCmBkgxUxI7Clvb2y8Ic38unWtAVMRwslY6iEf3y # 3nYuEAz5CzN3kT3pqhiLsFez3Gjfvc+1D52o/5/du9S2jx3rgA1bylBfyNV42R+l # 6yTyI6wlEWsLRQqTa80/aN9IkmKqR0PH2+nNO1WbE/fE+TEpibendBNZvfIjc8OP # 4ps7RGt+wlrxP0PvlgeLvmGc # SIG # End signature block |