PureStorage.CBS.AVS.SPBM.ps1
function New-PfaVvolStoragePolicy { <# .SYNOPSIS Creates a new FlashArray vVol Storage Policy .DESCRIPTION Creates a new FlashArray vVol Storage Policy with specified capabilities .INPUTS Capabilities .OUTPUTS New storage policy .EXAMPLE New-PfaVvolStoragePolicy Creates the default SPBM policy that indicates a VM should be on a FlashArray using vVols. Default generated name and description. .EXAMPLE New-PfaVvolStoragePolicy -PolicyName myGreatPolicy Creates a SPBM policy with the specified name that indicates a VM should be on a FlashArray using vVols. Default generated description. .EXAMPLE New-PfaVvolStoragePolicy -PolicyName myGreatReplicationPolicy -ReplicationInterval (New-TimeSpan -Minutes 5) -ReplicationEnabled $true -ReplicationConcurrency 2 Creates a replication-type SPBM policy with the specified name that indicates a VM should be on a FlashArray using vVols, replicated every 5 minutes to at least two other FlashArrays. Default generated description. .EXAMPLE $policy = Get-PfaVvolStoragePolicy -PolicyName myvVolreplicationpolicy $policyConfig = Build-PfavVolStoragePolicyConfig -Policy $policy $policyConfig.policyName = "MyEvenGreaterReplicationPolicy" $policyConfig.replicationInterval = New-TimeSpan -Minutes 10 Edit-PfaVvolStoragePolicy -PolicyConfig $policyConfig Creates a new policy with the identical configuration of a previously created policy but with a different name and replication interval. #> Param( [String]$PolicyName, [String]$PolicyDescription, [String]$ReplicationEnabled, [int]$ReplicationIntervalSeconds = 0, [int]$ReplicationRetentionShortSeconds = 0, [int]$ReplicationConcurrency, [String]$ConsistencyGroupName, [String]$ReplicationRuleLocalSnapshotEnabled, [int]$ReplicationRuleLocalSnapshotIntervalSeconds = 0, [int]$ReplicationRuleLocalSnapshotRetentionShortSeconds = 0, [string]$TargetFlashArrays, [string]$SourceFlashArrays, [int]$PerVirtualDiskIOPSLimit, [String]$PerVirtualDiskIOPSLimitUnit, [int]$PerVirtualDiskBandwidthLimit, [String]$PerVirtualDiskBandwidthLimitUnit, [String]$VolumeTaggingKey, [String]$VolumeTaggingValue, [String]$VolumeTaggingCopyable, [int]$PlacementRuleLocalSnapshotIntervalSeconds = 0, [int]$PlacementRuleLocalSnapshotRetentionShortSeconds = 0, [int]$PlacementRuleLocalSnapshotForAdditionalSnapshots, [int]$PlacementRuleLocalSnapshotForAdditionalDays ) if ($null -eq $policyConfig) { if ([string]::IsNullOrWhiteSpace($policyName)) { $policyName = "FlashArray vVol Policy " + (Get-Random -Minimum 1000 -Maximum 9999).ToString() } $ReplicationInterval = If ($ReplicationIntervalSeconds -ne 0) { New-TimeSpan -Seconds $ReplicationIntervalSeconds } Else { 0 } $ReplicationIntervalShort = If ($ReplicationRetentionShortSeconds -ne 0) { New-TimeSpan -Seconds $ReplicationRetentionShortSeconds } Else { 0 } $ReplicationRetentionShort = If ($ReplicationRetentionShortSeconds -ne 0) { New-TimeSpan -Seconds $ReplicationRetentionShortSeconds } Else { 0 } $ReplicationRuleLocalSnapshotInterval = If ($ReplicationRuleLocalSnapshotIntervalSeconds -ne 0) { New-TimeSpan -Seconds $ReplicationRuleLocalSnapshotIntervalSeconds } Else { 0 } $ReplicationRuleLocalSnapshotRetentionShort = If ($ReplicationRuleLocalSnapshotRetentionShortSeconds -ne 0) { New-TimeSpan -Seconds $ReplicationRuleLocalSnapshotRetentionShortSeconds } Else { 0 } $PlacementRuleLocalSnapshotInterval = If ($PlacementRuleLocalSnapshotIntervalSeconds -ne 0) { New-TimeSpan -Seconds $PlacementRuleLocalSnapshotIntervalSeconds } Else { 0 } $PlacementRuleLocalSnapshotRetentionShort = If ($PlacementRuleLocalSnapshotRetentionShortSeconds -ne 0) { New-TimeSpan -Seconds $PlacementRuleLocalSnapshotRetentionShortSeconds } Else { 0 } # The user input would be string "yes", "no", or nothing. # We will translate it to nullable boolean [Nullable[bool]]$ReplicationEnabledBool = Convert-StringCapabilityToBoolean -StringCapabilityName "ReplicationEnabled" -StringCapabilityValue $ReplicationEnabled [Nullable[bool]]$ReplicationRuleLocalSnapshotEnabledBool = Convert-StringCapabilityToBoolean -StringCapabilityName "ReplicationRuleLocalSnapshotEnabled" -StringCapabilityValue $ReplicationRuleLocalSnapshotEnabled [Nullable[bool]]$VolumeTaggingCopyableBool = Convert-StringCapabilityToBoolean -StringCapabilityName "VolumeTaggingCopyable" -StringCapabilityValue $VolumeTaggingCopyable $SourceFlashArraysSeperated = If ($PSBoundParameters.ContainsKey('SourceFlashArrays')) { $SourceFlashArrays.Split(",") } else { $null } $TargetFlashArraysSeperated = If ($PSBoundParameters.ContainsKey('TargetFlashArrays')) { $TargetFlashArrays.Split(",") } else { $null } $policyConfig = ([FlashArrayvVolPolicyConfig]::new($policyName, $policyDescription, $SourceFlashArraysSeperated, $ReplicationEnabledBool, $replicationInterval, $replicationRetentionShort, $replicationConcurrency, $consistencyGroupName, $TargetFlashArraysSeperated, $ReplicationRuleLocalSnapshotEnabledBool , $ReplicationRuleLocalSnapshotInterval, $ReplicationRuleLocalSnapshotRetentionShort, $PerVirtualDiskIOPSLimit, $PerVirtualDiskIOPSLimitUnit, $PerVirtualDiskBandwidthLimit, $PerVirtualDiskBandwidthLimitUnit, $VolumeTaggingKey, $VolumeTaggingValue, $VolumeTaggingCopyableBool, $PlacementRuleLocalSnapshotInterval, $PlacementRuleLocalSnapshotRetentionShort, $PlacementRuleLocalSnapshotForAdditionalSnapshots, $PlacementRuleLocalSnapshotForAdditionalDays)) } $checkExisting = $null $checkExisting = Get-SpbmStoragePolicy -Name $policyConfig.policyName -ErrorAction SilentlyContinue if ($null -ne $checkExisting) { throw "A storage policy with the name of $($policyConfig.policyName) already exists`n `n Please choose a unique name." } if ([string]::IsNullOrWhiteSpace($policyConfig.policyDescription)) { $policyConfig.policyDescription = "Pure Storage Cloud Block Store vVol storage policy default description" } $checkforPure = $null $checkforPure = Get-SpbmCapability |where-object {$_.name -like "com.purestorage*"} if ($null -eq $checkforPure) { Write-Error "This vCenter does not have any Pure VASA providers registered and therefore no policy can be created. ..." } else { $ruleSet = New-pfaRuleSetfromConfig -policyConfig $policyConfig Write-Host "Creating policy $($policyConfig.policyName)..." New-SpbmStoragePolicy -Name $policyConfig.policyName -Description $policyConfig.policyDescription -AnyOfRuleSets $ruleSet } } function Convert-StringCapabilityToBoolean { param( [string]$StringCapabilityName, [string]$StringCapabilityValue ) if ($StringCapabilityValue -eq "yes" -or $StringCapabilityValue -eq "true") { $true } ElseIf ( $StringCapabilityValue -eq "no" -or $StringCapabilityValue -eq "false") { $false } Elseif ([string]::IsNullOrEmpty($StringCapabilityValue)) { $null } Else { throw "$StringCapabilityName should either be 'yes', 'no', 'true', 'false' or no value" } } function Remove-PfaVvolStoragePolicy { <# .SYNOPSIS Remove a FlashArray vVol Storage Policy .DESCRIPTION Remove a FlashArray vVol Storage Policy using policy name. The policy must be unused .INPUTS SPBM policy name .OUTPUTS N.A. .NOTES Version: 1.0 .EXAMPLE Remove-PfaVvolVmStoragePolicy -PolicyName myPolicyName #> Param( [Parameter(Position=0,mandatory=$true)] [string]$PolicyName ) $policy = Get-SpbmStoragePolicy | Where-Object {$_.Name -eq $PolicyName} if ($null -eq $policy) { throw "No existing policy is associated with this policy configuration. Use the New-PfaVvolStoragePolicy instead to create a new policy." } $pureCapability = $policy.AnyOfRuleSets.AllOfRules.Capability | where {$_.Name -like "com.purestorage*"} if ($pureCapability.Count -eq 0) { throw "The policy is not managed by Pure Storage." } return (Remove-SpbmStoragePolicy -StoragePolicy $policy -confirm:$false) } #Custom Classes Class FlashArrayvVolPolicyConfig{ static [String] $version = "1.1.0" static [String] $vendor = "Pure Storage" static [String] $objectName = "vVol Storage Policy Configuration" static [String] $model = "FlashArray" static [System.Boolean]$flasharray = $true [String]$policyName = "" [String]$policyDescription = "" [String[]]$sourceFlashArrays = $null [Nullable[boolean]]$replicationEnabled = $null [System.TimeSpan]$replicationInterval = 0 [System.TimeSpan]$replicationRetentionShort = 0 [int]$replicationConcurrency = $null [ValidatePattern('(?# MUST BE 3+ digits, alphanumeric, also dashes or underscores can be in the middle)^[a-zA-Z0-9\-_]+[a-zA-Z0-9]$|^$')] [String]$consistencyGroupName = "" [String[]]$targetFlashArrays = $null [Nullable[boolean]]$ReplicationRuleLocalSnapshotEnabled = $null [System.TimeSpan]$ReplicationRuleLocalSnapshotInterval = 0 [System.TimeSpan]$ReplicationRuleLocalSnapshotRetentionShort = 0 [int]$PerVirtualDiskIOPSLimit = $null [String]$PerVirtualDiskIOPSLimitUnit = "" [int]$PerVirtualDiskBandwidthLimit = $null [String]$PerVirtualDiskBandwidthLimitUnit = "" [String]$VolumeTaggingKey = "" [String]$VolumeTaggingValue = "" [Nullable[boolean]]$VolumeTaggingCopyable = $null [System.TimeSpan]$PlacementRuleLocalSnapshotInterval = 0 [System.TimeSpan]$PlacementRuleLocalSnapshotRetentionShort = 0 [int]$PlacementRuleLocalSnapshotForAdditionalSnapshots = $null [int]$PlacementRuleLocalSnapshotForAdditionalDays = $null FlashArrayvVolPolicyConfig ([String]$policyName, [String]$policyDescription, [String[]]$sourceFlashArrays, [Nullable[boolean]]$replicationEnabled, [System.TimeSpan]$replicationInterval, [System.TimeSpan]$replicationRetentionShort, [int]$replicationConcurrency, [String]$consistencyGroupName, [String[]]$targetFlashArrays, [Nullable[boolean]]$ReplicationRuleLocalSnapshotEnabled , [System.TimeSpan]$ReplicationRuleLocalSnapshotInterval, [System.TimeSpan]$ReplicationRuleLocalSnapshotRetentionShort, [int]$PerVirtualDiskIOPSLimit, [String]$PerVirtualDiskIOPSLimitUnit, [int]$PerVirtualDiskBandwidthLimit, [String]$PerVirtualDiskBandwidthLimitUnit, [String]$VolumeTaggingKey, [String]$VolumeTaggingValue, [Nullable[boolean]]$VolumeTaggingCopyable, [System.TimeSpan]$PlacementRuleLocalSnapshotInterval, [System.TimeSpan]$PlacementRuleLocalSnapshotRetentionShort, [int]$PlacementRuleLocalSnapshotForAdditionalSnapshots, [int]$PlacementRuleLocalSnapshotForAdditionalDays) { $this.sourceFlashArrays = $sourceFlashArrays $this.policyName = $policyName $this.policyDescription = $policyDescription $this.replicationEnabled = $replicationEnabled $this.replicationInterval = $replicationInterval $this.replicationRetentionShort = $replicationRetentionShort $this.replicationConcurrency = $replicationConcurrency $this.consistencyGroupName = $consistencyGroupName $this.targetFlashArrays = $targetFlashArrays $this.ReplicationRuleLocalSnapshotEnabled = $ReplicationRuleLocalSnapshotEnabled $this.ReplicationRuleLocalSnapshotInterval = $ReplicationRuleLocalSnapshotInterval $this.ReplicationRuleLocalSnapshotRetentionShort = $ReplicationRuleLocalSnapshotRetentionShort $this.PerVirtualDiskIOPSLimit = $PerVirtualDiskIOPSLimit $this.PerVirtualDiskIOPSLimitUnit = $PerVirtualDiskIOPSLimitUnit $this.PerVirtualDiskBandwidthLimit = $PerVirtualDiskBandwidthLimit $this.PerVirtualDiskBandwidthLimitUnit = $PerVirtualDiskBandwidthLimitUnit $this.VolumeTaggingKey = $VolumeTaggingKey $this.VolumeTaggingValue = $VolumeTaggingValue $this.VolumeTaggingCopyable = $VolumeTaggingCopyable $this.PlacementRuleLocalSnapshotInterval = $PlacementRuleLocalSnapshotInterval $this.PlacementRuleLocalSnapshotRetentionShort = $PlacementRuleLocalSnapshotRetentionShort $this.PlacementRuleLocalSnapshotForAdditionalSnapshots = $PlacementRuleLocalSnapshotForAdditionalSnapshots $this.PlacementRuleLocalSnapshotForAdditionalDays = $PlacementRuleLocalSnapshotForAdditionalDays if ($replicationEnabled -eq $false) { if ([System.TimeSpan]0 -ne $replicationInterval) { throw "Do not specify a replication interval if replicationEnabled is set to false." } if ([System.TimeSpan]0 -ne $replicationRetentionShort) { throw "Do not specify a replication retention if replicationEnabled is set to false." } } if ($ReplicationRuleLocalSnapshotEnabled -eq $false) { if ([System.TimeSpan]0 -ne $ReplicationRuleLocalSnapshotInterval) { throw "Do not specify a snapshot interval if ReplicationRuleLocalSnapshotEnabled is set to false." } if ([System.TimeSpan]0 -ne $ReplicationRuleLocalSnapshotRetentionShort) { throw "Do not specify a snapshot retention if ReplicationRuleLocalSnapshotEnabled is set to false." } } } } #internal functions function New-pfaRuleSetfromConfig { Param( [FlashArrayvVolPolicyConfig]$policyConfig ) $rules = @() if ($policyConfig.sourceFlashArrays.count -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.FlashArrayGroup) ` -Value $policyConfig.sourceFlashArrays } $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.PureFlashArray) ` -Value $true # Replication if ($null -ne $policyConfig.ReplicationRuleLocalSnapshotEnabled) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotPolicyCapable) ` -Value $policyConfig.ReplicationRuleLocalSnapshotEnabled } if ($policyConfig.ReplicationRuleLocalSnapshotInterval -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotInterval) ` -Value $policyConfig.ReplicationRuleLocalSnapshotInterval } if ($policyConfig.ReplicationRuleLocalSnapshotRetentionShort -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotRetention) ` -Value $policyConfig.ReplicationRuleLocalSnapshotRetentionShort } if ($policyConfig.targetFlashArrays.count -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.ReplicationTarget) ` -Value $policyConfig.targetFlashArrays } if ($null -ne $policyConfig.replicationEnabled) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationCapable) ` -Value $policyConfig.replicationEnabled } if ($policyConfig.replicationInterval -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationInterval) ` -Value $policyConfig.replicationInterval } if ($policyConfig.replicationRetentionShort -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationRetention) ` -Value $policyConfig.replicationRetentionShort } if (!([string]::IsNullOrWhiteSpace($policyConfig.consistencyGroupName))) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.ReplicationConsistencyGroup) ` -Value $policyConfig.consistencyGroupName } if (($null -ne $policyConfig.replicationConcurrency) -and ($policyConfig.replicationConcurrency -ne 0)) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.replicationConcurrency) ` -Value $policyConfig.replicationConcurrency } # IOPS Limit if (($null -ne $policyConfig.PerVirtualDiskIOPSLimit) -and ($policyConfig.PerVirtualDiskIOPSLimit -ne 0)) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.IopsLimit.IopsLimit) ` -Value $policyConfig.PerVirtualDiskIOPSLimit } if (!([string]::IsNullOrWhiteSpace($policyConfig.PerVirtualDiskIOPSLimitUnit))) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.IopsLimit.IopsLimitUnit) ` -Value $policyConfig.PerVirtualDiskIOPSLimitUnit } # Bandwidth Limit if (($null -ne $policyConfig.PerVirtualDiskBandwidthLimit) -and ($policyConfig.PerVirtualDiskBandwidthLimit -ne 0)) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.BandwidthLimit.BandwidthLimit) ` -Value $policyConfig.PerVirtualDiskBandwidthLimit } if (!([string]::IsNullOrWhiteSpace($policyConfig.PerVirtualDiskBandwidthLimitUnit))) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.BandwidthLimit.BandwidthLimitUnit) ` -Value $policyConfig.PerVirtualDiskBandwidthLimitUnit } # Volume Tag if (!([string]::IsNullOrWhiteSpace($policyConfig.VolumeTaggingKey))) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.VolumeTagging.TagKey) ` -Value $policyConfig.VolumeTaggingKey } if (!([string]::IsNullOrWhiteSpace($policyConfig.VolumeTaggingValue))) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.VolumeTagging.TagValue) ` -Value $policyConfig.VolumeTaggingValue } if ($null -ne $policyConfig.VolumeTaggingCopyable) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.VolumeTagging.TagCopyable) ` -Value $policyConfig.VolumeTaggingCopyable } # Local snapshot if ($policyConfig.PlacementRuleLocalSnapshotInterval -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.LocalSnapshotProtection.LocalSnapshotInterval) ` -Value $policyConfig.PlacementRuleLocalSnapshotInterval } if ($policyConfig.PlacementRuleLocalSnapshotRetentionShort -ne 0) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.LocalSnapshotProtection.LocalSnapshotRetention) ` -Value $policyConfig.PlacementRuleLocalSnapshotRetentionShort } if (($null -ne $policyConfig.PlacementRuleLocalSnapshotForAdditionalSnapshots) -and ($policyConfig.PlacementRuleLocalSnapshotForAdditionalSnapshots -ne 0)) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.LocalSnapshotProtection.LocalSnapshotThenRetain) ` -Value $policyConfig.PlacementRuleLocalSnapshotForAdditionalSnapshots } if (($null -ne $policyConfig.PlacementRuleLocalSnapshotForAdditionalDays) -and ($policyConfig.PlacementRuleLocalSnapshotForAdditionalDays -ne 0)) { $rules += New-SpbmRule ` -Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.LocalSnapshotProtection.LocalSnapshotForAdditionalDays) ` -Value $policyConfig.PlacementRuleLocalSnapshotForAdditionalDays } #create policy return New-SpbmRuleSet -AllOfRules $rules } # SIG # Begin signature block # MIIjUAYJKoZIhvcNAQcCoIIjQTCCIz0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU/BwmuhBKGGui0CSfHcR82R40 # 4zGggh12MIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDANBgkqhkiG9w0B # AQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIwMDAwWjByMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQg # Q29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA # +NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUut4/6kkPApfmJ # 1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5oYQjZhJUM1B0 # sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrEsq5wMWYzcT6s # cKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1TqSp6moKq4Tz # rGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNzQYIH5DiLanMg # 0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/BAgwBgEB/wIB # ADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMweQYIKwYBBQUH # AQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYI # KwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz # c3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0 # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaG # NGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD # QS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0 # dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYE # FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6en # IZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8JSl2qB1dHC06 # GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4kgU4QpO4/cY5j # DhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscnKqEpKBo6cSgC # PC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESlE/DmZAwlCEIy # sjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6ZMWM9CBoYs4Gb # T8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSaZFHvMIIFNzCC # BB+gAwIBAgIQC4jZOitkx57ksuMgsWXX0jANBgkqhkiG9w0BAQsFADByMQswCQYD # VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln # aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29k # ZSBTaWduaW5nIENBMB4XDTIwMDczMDAwMDAwMFoXDTIzMTAwNDEyMDAwMFowdDEL # MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDU1vdW50 # YWluIFZpZXcxGzAZBgNVBAoTElB1cmUgU3RvcmFnZSwgSW5jLjEbMBkGA1UEAxMS # UHVyZSBTdG9yYWdlLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC # AQEA6nefE6+A0nNMY82xtkQb+akwI0oxLqEbRY65bE4re+CVQV2xP89/7FIAXooq # jxNOvrtWicWTGOZjBdAFEXXAUEyu9CkWFOXGLV3/QkcEfY3e3Z3jypa6h1EznSEp # 3wSQEIVbigi6jR2s7NDnDoSDAKnzcGcSZ8Nz7akXFrN8PAmg3gy8a/rwm2Ko7ClR # ZUHj1C/OMPXUqiN0Q4FyAsaeFmvg2PX2twxo192WRdNro1dkKNfmDvym2ss6MXcq # gFEjBcZtHDv3e/i0BjT24Jm1C27IVYZzVf28dqmVfPo7l8bLEHsVKgrRf0VzS2wI # R08gXiMrohf9tv3AbvtPk7ZaawIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5 # eyoKo6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFJOwFn7S4Lj6QdNnH6tpm3FMFWJI # MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBu # MDWgM6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNz # LWcxLmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNz # dXJlZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEF # BQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQG # CCsGAQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu # Y29tME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln # aUNlcnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIw # ADANBgkqhkiG9w0BAQsFAAOCAQEAMVAa7mXxhBHf0dTzf6LKDncN8KnzB59KBvd0 # KvXZc6FoLHGi2Wg6XBSP+9mdDMMYOkohqstSk7RD+reT8xiptrIkSMcVcTog1Z3e # JjYTK8B7QsSpuu2lo0RWA5rdvqMJ+lVzbbjteTq+uicP4T/EDwv2q+iPAgpXQD8y # r084ExDWJtMfhvy0cxh555xx88rvFWOhJnXYiFtjaO9dp7f2TnZRJ44rmB98jc9E # BR/8GLOi/BhyPiiU4nBv8JIHVP1E5zIt8/9PhfpenmiWBbuuP0YLnzrqRhswtJaq # jJirYNLYojmINrbvdcpEKGK1AitsnuOjFadLI7bc696Y35lUATCCBY0wggR1oAMC # AQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMC # VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0 # LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIy # MDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8G # A1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9 # WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+p # VxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7s # Xk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW # 7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9 # iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuap # oGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5L # HucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGy # shG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QM # IR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1 # P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsC # AwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1k # TN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4G # A1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6 # Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8E # PjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 # cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwF # AAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2k # iHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je # 1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJM # QBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwC # A8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaH # lv1b0VysGMNNn3O3AamfV6peKOK5lDCCBq4wggSWoAMCAQICEAc2N7ckVHzYR6z9 # KGYqXlswDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp # Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMY # RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4XDTIyMDMyMzAwMDAwMFoXDTM3MDMy # MjIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu # MTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRp # bWVTdGFtcGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMaG # NQZJs8E9cklRVcclA8TykTepl1Gh1tKD0Z5Mom2gsMyD+Vr2EaFEFUJfpIjzaPp9 # 85yJC3+dH54PMx9QEwsmc5Zt+FeoAn39Q7SE2hHxc7Gz7iuAhIoiGN/r2j3EF3+r # GSs+QtxnjupRPfDWVtTnKC3r07G1decfBmWNlCnT2exp39mQh0YAe9tEQYncfGpX # evA3eZ9drMvohGS0UvJ2R/dhgxndX7RUCyFobjchu0CsX7LeSn3O9TkSZ+8OpWNs # 5KbFHc02DVzV5huowWR0QKfAcsW6Th+xtVhNef7Xj3OTrCw54qVI1vCwMROpVymW # Jy71h6aPTnYVVSZwmCZ/oBpHIEPjQ2OAe3VuJyWQmDo4EbP29p7mO1vsgd4iFNmC # KseSv6De4z6ic/rnH1pslPJSlRErWHRAKKtzQ87fSqEcazjFKfPKqpZzQmiftkaz # nTqj1QPgv/CiPMpC3BhIfxQ0z9JMq++bPf4OuGQq+nUoJEHtQr8FnGZJUlD0UfM2 # SU2LINIsVzV5K6jzRWC8I41Y99xh3pP+OcD5sjClTNfpmEpYPtMDiP6zj9NeS3YS # UZPJjAw7W4oiqMEmCPkUEBIDfV8ju2TjY+Cm4T72wnSyPx4JduyrXUZ14mCjWAkB # KAAOhFTuzuldyF4wEr1GnrXTdrnSDmuZDNIztM2xAgMBAAGjggFdMIIBWTASBgNV # HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBS6FtltTYUvcyl2mi91jGogj57IbzAf # BgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYw # EwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzAB # hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9j # YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMG # A1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2Vy # dFRydXN0ZWRSb290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG # /WwHATANBgkqhkiG9w0BAQsFAAOCAgEAfVmOwJO2b5ipRCIBfmbW2CFC4bAYLhBN # E88wU86/GPvHUF3iSyn7cIoNqilp/GnBzx0H6T5gyNgL5Vxb122H+oQgJTQxZ822 # EpZvxFBMYh0MCIKoFr2pVs8Vc40BIiXOlWk/R3f7cnQU1/+rT4osequFzUNf7WC2 # qk+RZp4snuCKrOX9jLxkJodskr2dfNBwCnzvqLx1T7pa96kQsl3p/yhUifDVinF2 # ZdrM8HKjI/rAJ4JErpknG6skHibBt94q6/aesXmZgaNWhqsKRcnfxI2g55j7+6ad # cq/Ex8HBanHZxhOACcS2n82HhyS7T6NJuXdmkfFynOlLAlKnN36TU6w7HQhJD5TN # OXrd/yVjmScsPT9rp/Fmw0HNT7ZAmyEhQNC3EyTN3B14OuSereU0cZLXJmvkOHOr # pgFPvT87eK1MrfvElXvtCl8zOYdBeHo46Zzh3SP9HSjTx/no8Zhf+yvYfvJGnXUs # HicsJttvFXseGYs2uJPU5vIXmVnKcPA3v5gA3yAWTyf7YGcWoWa63VXAOimGsJig # K+2VQbc61RWYMbRiCQ8KvYHZE/6/pNHzV9m8BPqC3jLfBInwAM1dwvnQI38AC+R2 # AibZ8GV2QqYphwlHK+Z/GqSFD/yYlvZVVCsfgPrA8g4r5db7qS9EFUrnEw4d2zc4 # GqEr9u3WfPwwggbAMIIEqKADAgECAhAMTWlyS5T6PCpKPSkHgD1aMA0GCSqGSIb3 # DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7 # MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1l # U3RhbXBpbmcgQ0EwHhcNMjIwOTIxMDAwMDAwWhcNMzMxMTIxMjM1OTU5WjBGMQsw # CQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxJDAiBgNVBAMTG0RpZ2lDZXJ0 # IFRpbWVzdGFtcCAyMDIyIC0gMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAM/spSY6xqnya7uNwQ2a26HoFIV0MxomrNAcVR4eNm28klUMYfSdCXc9FZYI # L2tkpP0GgxbXkZI4HDEClvtysZc6Va8z7GGK6aYo25BjXL2JU+A6LYyHQq4mpOS7 # eHi5ehbhVsbAumRTuyoW51BIu4hpDIjG8b7gL307scpTjUCDHufLckkoHkyAHoVW # 54Xt8mG8qjoHffarbuVm3eJc9S/tjdRNlYRo44DLannR0hCRRinrPibytIzNTLlm # yLuqUDgN5YyUXRlav/V7QG5vFqianJVHhoV5PgxeZowaCiS+nKrSnLb3T254xCg/ # oxwPUAY3ugjZNaa1Htp4WB056PhMkRCWfk3h3cKtpX74LRsf7CtGGKMZ9jn39cFP # cS6JAxGiS7uYv/pP5Hs27wZE5FX/NurlfDHn88JSxOYWe1p+pSVz28BqmSEtY+VZ # 9U0vkB8nt9KrFOU4ZodRCGv7U0M50GT6Vs/g9ArmFG1keLuY/ZTDcyHzL8IuINeB # rNPxB9ThvdldS24xlCmL5kGkZZTAWOXlLimQprdhZPrZIGwYUWC6poEPCSVT8b87 # 6asHDmoHOWIZydaFfxPZjXnPYsXs4Xu5zGcTB5rBeO3GiMiwbjJ5xwtZg43G7vUs # fHuOy2SJ8bHEuOdTXl9V0n0ZKVkDTvpd6kVzHIR+187i1Dp3AgMBAAGjggGLMIIB # hzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggr # BgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0j # BBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFGKK3tBh/I8xFO2X # C809KpQU31KcMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdD # QS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz # cC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2lj # ZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBp # bmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAFWqKhrzRvN4Vzcw/HXjT9aFI/H8 # +ZU5myXm93KKmMN31GT8Ffs2wklRLHiIY1UJRjkA/GnUypsp+6M/wMkAmxMdsJiJ # 3HjyzXyFzVOdr2LiYWajFCpFh0qYQitQ/Bu1nggwCfrkLdcJiXn5CeaIzn0buGqi # m8FTYAnoo7id160fHLjsmEHw9g6A++T/350Qp+sAul9Kjxo6UrTqvwlJFTU2WZoP # VNKyG39+XgmtdlSKdG3K0gVnK3br/5iyJpU4GYhEFOUKWaJr5yI+RCHSPxzAm+18 # SLLYkgyRTzxmlK9dAlPrnuKe5NMfhgFknADC6Vp0dQ094XmIvxwBl8kZI4DXNlpf # lhaxYwzGRkA7zl011Fk+Q5oYrsPJy8P7mxNfarXH4PMFw1nfJ2Ir3kHJU7n/NBBn # 9iYymHv+XEKUgZSCnawKi8ZLFUrTmJBFYDOA4CPe+AOk9kVH5c64A0JH6EE2cXet # /aLol3ROLtoeHYxayB6a1cLwxiKoT5u92ByaUcQvmvZfpyeXupYuhVfAYOd4Vn9q # 78KVmksRAsiCnMkaBXy6cbVOepls9Oie1FqYyJ+/jbsYXEP10Cro4mLueATbvdH7 # WwqocH7wl4R44wgDXUcsY6glOJcB0j862uXl9uab3H4szP8XTE0AotjWAQ64i+7m # 4HJViSwnGWH2dwGMMYIFRDCCBUACAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8G # A1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQ # C4jZOitkx57ksuMgsWXX0jAJBgUrDgMCGgUAoHAwEAYKKwYBBAGCNwIBDDECMAAw # GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG # AQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFIhgBctLD1ZKq/ImYTuZDr0RtrNuMA0G # CSqGSIb3DQEBAQUABIIBAKXkiVHiiJg6PWad4yqA1thtUeeW6HAqj4Y680ffHjC+ # 05rBIguX2JNKb5cKmWqJQcXCAWz1ykHq7FXw75W/HRrLiSePVk0sB2OJOpO3dmOk # iabosaScsFAPQ4dUxuay6/029DeYxvrzICc7Zic7KzzyLh1fKJP1WWXdLIv2ihsT # MCGelLEL3j51DM/MMNedYHUxKlZQR1Irm+vJpIgkYWukAhAid+TJ4oLOLktsu3Xe # A7QXQ19oygQt3GllaWEfOSfxf63ZcPYbkm7St1LijDmEhHZWEcW8Ucl/2VRW479y # yvhs48kkF3rnJPfCspEfQZwOSfB0zd32bbYFdeg+oc+hggMgMIIDHAYJKoZIhvcN # AQkGMYIDDTCCAwkCAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNl # cnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBT # SEEyNTYgVGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFl # AwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUx # DxcNMjMwMjAzMDExMzU0WjAvBgkqhkiG9w0BCQQxIgQg0+SO+UhfhoEF2E8i/HML # hyeHVoVU+i0F5rBePJvmLRcwDQYJKoZIhvcNAQEBBQAEggIAiNdbKC9KIDIGoJ5a # hME7+yyE8v0b9KB+rzCwju8xsSUtyBM+H/aQvnFRl6CUVssghhaZWnQz0d0VlXtq # OEILs23WRUM1y9rifZoa0RqTN0ocHx7SBZSnf6YrKRLUskznuuYQfElQvAAZFBZE # 8baMvAfg7SyAp8qzrwOdBxlKJTMX7Zz8fSDVyWV1JQNAKncj3gN6NzygQ28SV9wX # ziMvN4UuNSPNyMfHSjb4lOnzJTavbjtD4Iyn1Q0PTXzW2x09XIRvXrdhN+Y9yVR/ # FZWh+o5mYgjo4kcyzt8KBRhz/0ROe5XTyjEur93tUADLA09vj8Hs7ycB9Uz1f/1j # jm2krGhVrPWqTcdjlGZVNXCeY1ADkXHMvwU4WvwLllh72zd4tNz4Xnk2XJrmt5KO # Ubw7qAFaACXncaqQwyH7qF5Gl97rzIpczgKptxDN8th+DSmmQNh16mRk8O6fl5Vt # p6AI6tYp4CNWmgjvmdQVPo5w16Rfjws2CEvp+6URavyeCgIkdz549YWOMsLRYsNX # NWzoTMrchEEoVwuHMaqt3lnYYzOa0V9O30JQ504i9vxS32H8S+obl6nfxJHEbkJ7 # 4YcQze0FvNmoI6/m7sBRhO69m1GPXLU4A2+EivJuLNa4/3VqPwlE3QCDhVFA0UEn # nw/c8sr6OK45IL1SvLYjLtPMouM= # SIG # End signature block |