Public/PrivilegedAccess/Update-EntraOpsPrivilegedConditionalAccessGroup.ps1
|
<# .SYNOPSIS Update membership on security groups based on EntraOps classification which can be used for targeting Conditional Access policies. .DESCRIPTION Security Groups for the different Enterprise Access Levels will be updated based on the classification of EntraOps. Objects will be assigned to the corresponding Administrative Units based on the classification. This security groups can be used for targeting Conditional Access policies. .PARAMETER ApplyToAccessTierLevel Array of Access Tier Levels to be processed. Default is ControlPlane, ManagementPlane. .PARAMETER FilterObjectType Array of object types to be processed. Default is User, Group. .PARAMETER GroupPrefix String to define the prefix of the Conditional Access Inclusion Groups. Default is "sug_Entra.CA.IncludeUsers.PrivilegedAccounts." .PARAMETER RbacSystems Array of RBAC systems to be processed. Default is Azure, EntraID, IdentityGovernance, ResourceApps, DeviceManagement, Defender. .PARAMETER RemovalSafetyThreshold Fraction of current members that may be removed in a single run before the sync aborts the group as a suspected upstream data issue. Default is 0.5 (50%). .PARAMETER ForceRemovalBeyondSafetyThreshold Apply removals even when they exceed RemovalSafetyThreshold. Needed to reconcile a group that drifted far from its desired state (for example one over-populated by an earlier run), because such a group can never converge on its own - every run recomputes the same oversized delta and aborts again. Review the delta from a normal (aborting) run first, then re-run with this switch. .PARAMETER IncludeObjectDetails Include object display names and detailed API errors in console output. Defaults to ConsoleOutput.IncludeObjectDetails from EntraOpsConfig.json. Object IDs are always shown. .EXAMPLE Update Conditional Access Target Groups for EntraID, IdentityGovernance and ResourceApps RBAC systems with assigned User and Group objects Update-EntraOpsPrivilegedConditionalAccessGroup -GroupPrefix "sug_Entra.CA.IncludeUsers.PrivilegedAccounts." -RbacSystems ("EntraID", "IdentityGovernance") .EXAMPLE Apply a cleanup that the safety threshold blocked, after reviewing the reported delta Update-EntraOpsPrivilegedConditionalAccessGroup -RbacSystems ("IdentityGovernance") -ForceRemovalBeyondSafetyThreshold #> function Update-EntraOpsPrivilegedConditionalAccessGroup { [CmdletBinding()] param ( [Parameter(Mandatory = $False)] [ValidateSet("ControlPlane", "ManagementPlane")] [Array]$ApplyToAccessTierLevel = ("ControlPlane", "ManagementPlane") , [Parameter(Mandatory = $False)] [ValidateSet("User", "Group")] [Array] $FilterObjectType = ("User", "Group") , [Parameter(Mandatory = $False)] [string]$GroupPrefix = "sug_Entra.CA.IncludeUsers.PrivilegedAccounts." , [Parameter(Mandatory = $False)] [ValidateSet("Azure", "EntraID", "IdentityGovernance", "ResourceApps", "DeviceManagement", "Defender")] [Array]$RbacSystems = ("Azure", "EntraID", "IdentityGovernance", "ResourceApps", "DeviceManagement", "Defender") , [Parameter(Mandatory = $false)] [String]$AdminUnitName , [Parameter(Mandatory = $false)] [string]$TenantId = (Get-EntraOpsAzContextValue -Property TenantId) , [Parameter(Mandatory = $False)] [ValidateRange(0.0, 1.0)] [double]$RemovalSafetyThreshold = 0.5 , [Parameter(Mandatory = $False)] [switch]$ForceRemovalBeyondSafetyThreshold , [Parameter(Mandatory = $False)] [boolean]$IncludeObjectDetails = [bool]$Global:EntraOpsIncludeObjectDetails , [Parameter(Mandatory = $False)] [boolean]$ApplyConditionalAccessTargetGroups = $false ) # Get all unique AdminTierLevels which needs to be iterated for assigning objects to Conditional Access Target Groups $PrivilegedEamTierLevels = Get-ChildItem -Path "$($DefaultFolderClassification)/Templates" -File -Recurse -Exclude *.Param.json | foreach-object { Get-Content $_.FullName -Filter "*.json" | ConvertFrom-Json } $SelectedPrivilegedEamTierLevels = $PrivilegedEamTierLevels | where-object { $_.EAMTierLevelName -in $ApplyToAccessTierLevel } | select-object -unique @{Name = 'AdminTierLevel'; Expression = 'EAMTierLevelTagValue' }, @{Name = 'AdminTierLevelName'; Expression = 'EAMTierLevelName' } #endregion # Summary tracking $SyncSummary = [System.Collections.Generic.List[psobject]]::new() $TotalAdded = 0 $TotalRemoved = 0 $WarningMessages = New-Object -TypeName "System.Collections.Generic.List[psobject]" Write-Host "" Write-Host "=========================================================" -ForegroundColor Cyan Write-Host " EntraOps - Conditional Access Group Sync" -ForegroundColor Cyan Write-Host " RBAC Systems : $($RbacSystems -join ', ')" -ForegroundColor Cyan Write-Host " Access Tiers : $($ApplyToAccessTierLevel -join ', ')" -ForegroundColor Cyan Write-Host " Group Prefix : $GroupPrefix" -ForegroundColor Cyan Write-Host "=========================================================" -ForegroundColor Cyan Write-Host "" foreach ($RbacSystem in $RbacSystems) { Write-Host "---------------------------------------------------------" -ForegroundColor DarkCyan Write-Host " RBAC System: $RbacSystem" -ForegroundColor DarkCyan Write-Host "---------------------------------------------------------" -ForegroundColor DarkCyan $ClassificationEamFile = "$DefaultFolderClassifiedEam/$RbacSystem/$($RbacSystem).json" #region Get principals from EAM classification files and filter out objects without classification and objects not related to the RBAC system or object type filter $PrivilegedEam = @() $PrivilegedEam += Get-ChildItem -Path $ClassificationEamFile | foreach-object { Get-Content $_.FullName -Filter "*.json" | ConvertFrom-Json } $PrivilegedEam = $PrivilegedEam | Where-Object { $_.ObjectType -in $FilterObjectType } $PrivilegedEamCount = ($PrivilegedEam | Where-Object { $null -eq $_.Classification }).count if ($PrivilegedEamCount -gt 0) { Write-Warning "Numbers of objects without classification: $PrivilegedEamCount" $WarningMessages.Add([PSCustomObject]@{ Type = "UnclassifiedObjects"; Message = "$PrivilegedEamCount object(s) without classification in $RbacSystem" }) } $PrivilegedEamClassifiedObjects = $PrivilegedEam | where-object { $_.Classification.AdminTierLevel -notcontains $null -and $_.RoleSystem -eq $RbacSystem } #region Assign all principals in Privileged EAM to Conditional Access Target Groups foreach ($TierLevel in $SelectedPrivilegedEamTierLevels) { $GroupName = "$GroupPrefix" + $TierLevel.AdminTierLevelName + "." + $($RbacSystem) $GrpAdded = 0 $GrpRemoved = 0 $GrpFailed = 0 $GrpStatus = "OK" Write-Host "" Write-Host " Group: $GroupName" -ForegroundColor White $Groups = @(Invoke-EntraOpsMsGraphQuery -Method "GET" -Uri "/v1.0/groups?`$filter=DisplayName eq '$(ConvertTo-EntraOpsODataStringLiteral -Value $GroupName)'" -OutputType PSObject -DisableCache) # -AllowNotFound: a missing group is handled by the NOT FOUND skip branch below so the # remaining tiers/RBAC systems still synchronize; duplicates still throw (F-10 safety). $GroupId = (Select-EntraOpsUniqueGraphObject -InputObject $Groups -ObjectDescription "group '$GroupName'" -AllowNotFound).id if ($null -eq $GroupId) { Write-Warning " [SKIP] Could not find group: $GroupName" $WarningMessages.Add([PSCustomObject]@{ Type = "GroupNotFound"; Message = "Could not find group: $GroupName" }) $SyncSummary.Add([PSCustomObject]@{ RbacSystem = $RbacSystem Group = $GroupName MembersBefore = "N/A" Added = 0 Removed = 0 Failed = 0 Status = "NOT FOUND" }) continue } $PrivilegedObjects = @() $PrivilegedObjects = ($PrivilegedEamClassifiedObjects | Where-Object { $_.Classification.AdminTierLevelName -contains $TierLevel.AdminTierLevelName -and $_.RoleSystem -eq $RbacSystem }) $ForeignTenantObjects = @($PrivilegedObjects | Where-Object { -not [string]::IsNullOrEmpty($_.ObjectTenantId) -and $_.ObjectTenantId -ne $TenantId }) if ($ForeignTenantObjects.Count -gt 0) { Write-Warning " [SKIP] Excluded $($ForeignTenantObjects.Count) object(s) not owned by tenant $TenantId" $WarningMessages.Add([PSCustomObject]@{ Type = "ForeignTenantObject"; Message = "Skipped $($ForeignTenantObjects.Count) object(s) not owned by tenant $TenantId for $GroupName" }) } $PrivilegedObjects = @($PrivilegedObjects | Where-Object { [string]::IsNullOrEmpty($_.ObjectTenantId) -or $_.ObjectTenantId -eq $TenantId }) $CurrentGroupMembers = @() $CurrentGroupMembers = (Invoke-EntraOpsMsGraphQuery -Method "GET" -Uri "/beta/groups/$($GroupId)/members" -OutputType PSObject -DisableCache) $CurrentMemberCount = @($CurrentGroupMembers.Id).Count $DesiredMemberCount = @($PrivilegedObjects.ObjectId).Count Write-Host " Current members : $CurrentMemberCount | Desired: $DesiredMemberCount" -ForegroundColor Gray # Deduplicate both sides before diff - an object with multiple role assignments at the # same tier level appears once per assignment in the EAM JSON, producing duplicate ObjectIds. # Compare-Object with duplicates in either side produces duplicate add/remove entries. $DesiredIds = @($PrivilegedObjects.ObjectId | Select-Object -Unique) $CurrentIds = @($CurrentGroupMembers.Id | Select-Object -Unique) # Check if group members already exists for sync, or just adding new items if ($Null -eq $CurrentGroupMembers.Id) { # Deduplicate - same object may appear multiple times with different role assignments $UniqueDesiredObjects = $PrivilegedObjects | Sort-Object ObjectId -Unique Write-Host " Group is empty - adding all $(@($UniqueDesiredObjects).Count) objects" -ForegroundColor Yellow foreach ($PrivObj in $UniqueDesiredObjects) { try { $GroupMember = Invoke-EntraOpsMsGraphQuery -Method GET -Uri "/beta/directoryObjects/$($PrivObj.ObjectId)" -DisableCache -OutputType PSObject $MemberType = $GroupMember.'@odata.type'.Replace('#microsoft.graph.', '') if ($IncludeObjectDetails) { Write-Host " [+] ADD [$MemberType] $($GroupMember.displayName)" -ForegroundColor Green } else { Write-Host " [+] ADD [$MemberType] $($PrivObj.ObjectId)" -ForegroundColor Green } $OdataBody = @{ '@odata.id' = "https://graph.microsoft.com/beta/directoryObjects/$($PrivObj.ObjectId)" } | ConvertTo-Json Invoke-EntraOpsMsGraphQuery -Method POST -Uri "/beta/groups/$($GroupId)/members/`$ref" -Body $OdataBody -OutputType PSObject -ThrowOnFailure $GrpAdded++ } catch { $AddFailureMessage = if ($IncludeObjectDetails) { "FAIL ADD $($PrivObj.ObjectId) to $GroupName`: $_" } else { "Failed to add object $($PrivObj.ObjectId) to $GroupName" } Write-Warning " [!] $AddFailureMessage" $WarningMessages.Add([PSCustomObject]@{ Type = "ApiError"; Message = $AddFailureMessage }) $GrpFailed++ } } } elseif ($null -ne $PrivilegedObjects.ObjectId) { $MemberDiff = Compare-Object $DesiredIds $CurrentIds $MembersToRemove = @($MemberDiff | Where-Object { $_.SideIndicator -eq "=>" }) $MembersToAdd = @($MemberDiff | Where-Object { $_.SideIndicator -eq "<=" }) if ($MemberDiff.Count -eq 0) { Write-Host " No changes required - group is already in sync" -ForegroundColor DarkGreen } else { Write-Host " Delta: +$($MembersToAdd.Count) to add -$($MembersToRemove.Count) to remove" -ForegroundColor Yellow } # Enforce the configured membership-removal threshold. $SafetyCheck = Test-EntraOpsRemovalSafetyThreshold -CurrentCount $CurrentIds.Count -RemovalCount $MembersToRemove.Count -RemovalSafetyThreshold $RemovalSafetyThreshold $ThresholdPercent = $SafetyCheck.ThresholdPercent $RemovalThreshold = $SafetyCheck.RemovalThreshold $ExceedsThreshold = $SafetyCheck.Exceeds $SkipRemovals = $ExceedsThreshold -and -not $ForceRemovalBeyondSafetyThreshold if ($SkipRemovals) { Write-Warning " [ABORT] $($MembersToRemove.Count) removals exceeds $ThresholdPercent% safety threshold ($RemovalThreshold of $($CurrentIds.Count) members). This may indicate an upstream data issue. Review the delta above, then re-run with -ForceRemovalBeyondSafetyThreshold to apply." $WarningMessages.Add([PSCustomObject]@{ Type = "SafetyAbort"; Message = "Aborted $GroupName`: $($MembersToRemove.Count) removals exceeds $ThresholdPercent% safety threshold ($RemovalThreshold of $($CurrentIds.Count) members) - re-run with -ForceRemovalBeyondSafetyThreshold to apply" }) $GrpStatus = "ABORTED" } else { if ($ExceedsThreshold) { Write-Warning " [FORCED] Applying $($MembersToRemove.Count) removals despite exceeding the $ThresholdPercent% safety threshold ($RemovalThreshold of $($CurrentIds.Count) members) - requested via -ForceRemovalBeyondSafetyThreshold." $WarningMessages.Add([PSCustomObject]@{ Type = "SafetyOverride"; Message = "Forced $($MembersToRemove.Count) removals in $GroupName beyond the $ThresholdPercent% safety threshold ($RemovalThreshold of $($CurrentIds.Count) members)" }) $GrpStatus = "FORCED" } foreach ($MemberChange in $MembersToRemove) { try { $GroupMember = Invoke-EntraOpsMsGraphQuery -Method GET -Uri "/beta/directoryObjects/$($MemberChange.InputObject)" -OutputType PSObject $MemberType = $GroupMember.'@odata.type'.Replace('#microsoft.graph.', '') if ($IncludeObjectDetails) { Write-Host " [-] REM [$MemberType] $($GroupMember.displayName)" -ForegroundColor Yellow } else { Write-Host " [-] REM [$MemberType] $($MemberChange.InputObject)" -ForegroundColor Yellow } Invoke-EntraOpsMsGraphQuery -Method DELETE -Uri "/beta/groups/$($GroupId)/members/$($MemberChange.InputObject)/`$ref" -OutputType PSObject -ThrowOnFailure $GrpRemoved++ } catch { $RemoveFailureMessage = if ($IncludeObjectDetails) { "FAIL REMOVE $($MemberChange.InputObject) from $GroupName`: $_" } else { "Failed to remove object $($MemberChange.InputObject) from $GroupName" } Write-Warning " [!] $RemoveFailureMessage" $WarningMessages.Add([PSCustomObject]@{ Type = "ApiError"; Message = $RemoveFailureMessage }) $GrpFailed++ } } } foreach ($MemberChange in $MembersToAdd) { try { $GroupMember = Invoke-EntraOpsMsGraphQuery -Method GET -Uri "/beta/directoryObjects/$($MemberChange.InputObject)" -DisableCache -OutputType PSObject $MemberType = $GroupMember.'@odata.type'.Replace('#microsoft.graph.', '') if ($IncludeObjectDetails) { Write-Host " [+] ADD [$MemberType] $($GroupMember.displayName)" -ForegroundColor Green } else { Write-Host " [+] ADD [$MemberType] $($MemberChange.InputObject)" -ForegroundColor Green } $OdataBody = @{ '@odata.id' = "https://graph.microsoft.com/beta/directoryObjects/$($MemberChange.InputObject)" } | ConvertTo-Json Invoke-EntraOpsMsGraphQuery -Method POST -Uri "/beta/groups/$($GroupId)/members/`$ref" -Body $OdataBody -OutputType PSObject -ThrowOnFailure $GrpAdded++ } catch { $AddFailureMessage = if ($IncludeObjectDetails) { "FAIL ADD $($MemberChange.InputObject) to $GroupName`: $_" } else { "Failed to add object $($MemberChange.InputObject) to $GroupName" } Write-Warning " [!] $AddFailureMessage" $WarningMessages.Add([PSCustomObject]@{ Type = "ApiError"; Message = $AddFailureMessage }) $GrpFailed++ } } } # No privileged objects found for the group else { Write-Warning " [SKIP] No classified objects found for $GroupName. Existing members untouched for safety - remove manually if needed." $WarningMessages.Add([PSCustomObject]@{ Type = "EmptyScope"; Message = "No classified objects found for $GroupName - existing members untouched" }) $GrpStatus = "SKIPPED" } if ($GrpFailed -gt 0) { $GrpStatus = "ERRORS" } $TotalAdded += $GrpAdded $TotalRemoved += $GrpRemoved $SyncSummary.Add([PSCustomObject]@{ RbacSystem = $RbacSystem Group = $GroupName MembersBefore = $CurrentMemberCount Added = $GrpAdded Removed = $GrpRemoved Failed = $GrpFailed Status = $GrpStatus }) } #endregion } # Final summary Write-Host "" Write-Host "=========================================================" -ForegroundColor Cyan Write-Host " Conditional Access Group Sync - Complete" -ForegroundColor Cyan Write-Host " Total added : $TotalAdded" -ForegroundColor Green Write-Host " Total removed: $TotalRemoved" -ForegroundColor Yellow if (($SyncSummary | Where-Object { $_.Failed -gt 0 }).Count -gt 0) { Write-Host " Failures : $(($SyncSummary | Measure-Object -Property Failed -Sum).Sum)" -ForegroundColor Red } Write-Host "=========================================================" -ForegroundColor Cyan Write-Host "" Show-EntraOpsWarningSummary -WarningMessages $WarningMessages -IncludeObjectDetails $IncludeObjectDetails $SyncSummary | Format-Table -AutoSize -Property RbacSystem, Group, MembersBefore, @{Name = 'Added'; Expression = { $_.Added }; Align = 'Right'}, @{Name = 'Removed'; Expression = { $_.Removed }; Align = 'Right'}, @{Name = 'Failed'; Expression = { $_.Failed }; Align = 'Right'}, Status Assert-EntraOpsConditionalAccessGroupSyncSucceeded -SyncSummary @($SyncSummary) } # SIG # Begin signature block # MIIniAYJKoZIhvcNAQcCoIIneTCCJ3UCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD0E/kdL6H8dLj6 # vAsn/SsU6bjsbHokIbIv0Hcpoah2PKCCIDwwggXJMIIEsaADAgECAhAbtY8lKt8j # AEkoya49fu0nMA0GCSqGSIb3DQEBDAUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK # ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy # dGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5l # dHdvcmsgQ0EwHhcNMjEwNTMxMDY0MzA2WhcNMjkwOTE3MDY0MzA2WjCBgDELMAkG # A1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAl # BgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMb # Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAvfl4+ObVgAxknYYblmRnPyI6HnUBfe/7XGeMycxca6mR5rlC # 5SBLm9qbe7mZXdmbgEvXhEArJ9PoujC7Pgkap0mV7ytAJMKXx6fumyXvqAoAl4Va # qp3cKcniNQfrcE1K1sGzVrihQTib0fsxf4/gX+GxPw+OFklg1waNGPmqJhCrKtPQ # 0WeNG0a+RzDVLnLRxWPa52N5RH5LYySJhi40PylMUosqp8DikSiJucBb+R3Z5yet # /5oCl8HGUJKbAiy9qbk0WQq/hEr/3/6zn+vZnuCYI+yma3cWKtvMrTscpIfcRnNe # GWJoRVfkkIJCu0LW8GHgwaM9ZqNd9BjuiMmNF0UpmTJ1AjHuKSbIawLmtWJFfzcV # WiNoidQ+3k4nsPBADLxNF8tNorMe0AZa3faTz1d1mfX6hhpneLO/lv403L3nUlbl # s+V1e9dBkQXcXWnjlQ1DufyDljmVe2yAWk8TcsbXfSl6RLpSpCrVQUYJIP4ioLZb # MI28iQzV13D4h1L92u+sUS4Hs07+0AnacO+Y+lbmbdu1V0vc5SwlFcieLnhO+Nqc # noYsylfzGuXIkosagpZ6w7xQEmnYDlpGizrrJvojybawgb5CAKT41v4wLsfSRvbl # jnX98sy50IdbzAYQYLuDNbdeZ95H7JlI8aShFf6tjGKOOVVPORa5sWOd/7cCAwEA # AaOCAT4wggE6MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLahVDkCw6A/joq8 # +tT4HKbROg79MB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C84oQ3RnX3MA4GA1Ud # DwEB/wQEAwIBBjAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmNlcnR1bS5w # bC9jdG5jYS5jcmwwawYIKwYBBQUHAQEEXzBdMCgGCCsGAQUFBzABhhxodHRwOi8v # c3ViY2Eub2NzcC1jZXJ0dW0uY29tMDEGCCsGAQUFBzAChiVodHRwOi8vcmVwb3Np # dG9yeS5jZXJ0dW0ucGwvY3RuY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQG # CCsGAQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEM # BQADggEBAFHCoVgWIhCL/IYx1MIy01z4S6Ivaj5N+KsIHu3V6PrnCA3st8YeDrJ1 # BXqxC/rXdGoABh+kzqrya33YEcARCNQOTWHFOqj6seHjmOriY/1B9ZN9DbxdkjuR # mmW60F9MvkyNaAMQFtXx0ASKhTP5N+dbLiZpQjy6zbzUeulNndrnQ/tjUoCFBMQl # lVXwfqefAcVbKPjgzoZwpic7Ofs4LphTZSJ1Ldf23SIikZbr3WjtP6MZl9M7JYjs # NhI9qX7OAo0FmpKnJ25FspxihjcNpDOO16hO0EoXQ0zF8ads0h5YbBRRfopUofbv # n3l6XYGaFpAP4bvxSgD5+d2+7arszgowggZrMIIEU6ADAgECAhBX5gfP8LabvnxC # XoItEBa/MA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhB # c3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNp # Z25pbmcgMjAyMSBDQTAeFw0yNjEwMDYwODI4MjNaFw0yNzEwMDYwODI4MjJaMIGQ # MQswCQYDVQQGEwJERTEdMBsGA1UECAwUUmhpbmVsYW5kLVBhbGF0aW5hdGUxEjAQ # BgNVBAcMCUxhaG5zdGVpbjEeMBwGA1UECgwVT3BlbiBTb3VyY2UgRGV2ZWxvcGVy # MS4wLAYDVQQDDCVPcGVuIFNvdXJjZSBEZXZlbG9wZXIgVGhvbWFzIE5hdW5oZWlt # MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAphp2ljSmVsRB6gvkEq7A # DUMENpKZiDFoAfF1ktD1nCwaVyI+bJ0ROjHwAn4iJgS+vlBDPOUIw2GLHkiqUhOg # HSwzg6gj45GNmt6zxsKP0zPlhMB/fb0zmz7/F7e3yfKCXLfhbHuk0Es9gJ+8Wmet # 9StVwwSE/K0MpW06GKA9nPWyE4N/ADwigDIj9rsTKJR4cve9w8G1b3zohpUc/qMr # onab+HVw5r9b3sOBnnaXC6zvrX4fovRz1ztwfWjRjILLoFG6mW/TuK5F2ICD3Rhl # 9R2rJWWWhzTDMsQlzvX+/SaM74q3OFpIVNdhvtmWU9pKUBRAyYMijcDqKEFGSzrc # 8JFmGMpP5TuroWF+N21d3px2eARvW1mV0DCfFAH+Og20SH/gVW6/ltQQEkH/z/Zt # 49ARyJrgESLOQtlMCIYSoKISdkk4ml4VUS1E/PcbzXEYj3a7m6DOxcd3WuY03UT9 # cnk3p0LMN6LeLYAZgVY+HRloZlH+kW2SkOHNuWgtXvZhAgMBAAGjggF4MIIBdDAM # BgNVHRMBAf8EAjAAMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jY3NjYTIwMjEu # Y3JsLmNlcnR1bS5wbC9jY3NjYTIwMjEuY3JsMHMGCCsGAQUFBwEBBGcwZTAsBggr # BgEFBQcwAYYgaHR0cDovL2Njc2NhMjAyMS5vY3NwLWNlcnR1bS5jb20wNQYIKwYB # BQUHMAKGKWh0dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jY3NjYTIwMjEuY2Vy # MB8GA1UdIwQYMBaAFN10XUwA23ufoHTKsW73PMAywHDNMB0GA1UdDgQWBBTBvGyH # MXj1dMbVnxuof9oP4PY7cDBLBgNVHSAERDBCMAgGBmeBDAEEATA2BgsqhGgBhvZ3 # AgUBBDAnMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMBMG # A1UdJQQMMAoGCCsGAQUFBwMDMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF # AAOCAgEAkC165c7/r6y3VeEEpNXas9bQs6ZpKPdJffHkf9xoPi4kWvAIWGc4ocG1 # DJLb18RXiDYShDmT5sb/6I08FeipKi2DNJkuOq6yOTJ3S7+hNFIZCyd6i7WKO8ea # P5I+FAbyJP4+5coZoMg45bUa9JoocaJCm+5n7WiCfN7/EQpClW5Trm4+ZMbp7EMN # F1uLJgGCMnN0SsoUarp7PHlqupMxMC4Uhhe+lAP2ytcSIU81L97/qjrADbLWqICk # 9il5iGM+aZndguq/cmfH9rJj4GRZHWnG6WwnzYD9+KgYlRI6em+/9dq+IRiXe2Bs # thUuIaFW7U2gWw8tBTEYm1UBLHdJx+L1gjJCLs5KT/wy5wU32wZxNDqPUQejUC1x # GvU3cKqmLgRq+yNf3gFVfzqIoggyM3U9wQvnk7nBtCkpjXS2hdx4yxzcmrlWsDHr # z6+6/jeyQySzbYUlFmKnc4n9Mw2soHOajEua5poFARVRS5KgUBuiiQ21YFNYzWBo # qGuECaaAI/C5rGxapMJ3dAOBnHw6NLqBet+ZXBJEccX5y89MLlOQu+jDmJP8HieR # qDLlwfhVZnw4RY8Rus43NZBwhNlVuOUXqocHKmJhKNlekda3qsJj93eQBQOxKJcc # w5O08q9jukpH2+yzFAj+7ll33DuNUgWptogc4Awtbx3glzcEvJQwggaCMIIEaqAD # AgECAhAo8HfBHDa9/l90MkdwJy4DMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYT # AlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMT # G0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQTAeFw0yNjAzMTEwNzM0NTRaFw0z # NjAyMjcwNzM0NTRaMFAxCzAJBgNVBAYTAlBMMSEwHwYDVQQKDBhBc3NlY28gRGF0 # YSBTeXN0ZW1zIFMuQS4xHjAcBgNVBAMMFUNlcnR1bSBUaW1lc3RhbXAgMjAyNjCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALi9zfBw+xI12hi2F9uNQBNO # STkTIi13fuh3DiWybI5392bBfJw6tO7zDs7UqP/rejVf4xFTU3XNOPsuOFkP5SPF # snWwn3VJL+NhNhsuujvYsQtaQnvNo1wk46reTgws1L8OFEdKaxgyqT4zOQx81mLw # NZSqXNU9Rrb9oAJWJF4Mydz+C1ebu0D0+vgM3tqAQ8TU203fqgKCPqIdHloaFqH9 # eyR+8tnpmy2hnnN59ZOtmsuHeRwf5iTOhlhf0d/qqquLOSIGPgGVL1Hj5XBUox2O # E7tQRr+l/xxNbL6OuwBO4Aa2EbuxYg37cpXv5i2/lTL4NASB/duf9W4fjA3Ro+GP # +bC54n2OYiM3Cq8z92ejx8F5HWO2e4/75eC95B9tMw/eq7109GDyW2+2ut5Bn0o8 # MXJTERkyystWbqcnUkomA97qfiDCwvpWuOMdfTOksXe9S+xDxOJaCbiyTivgPulx # cT+tfQTRXBr5UwtPvc+INnafOEilzVHA11tv+pHcylryxBc08cUihf/ttqkZS0bm # x3VxQay8uohaTp0//ECA9vYGW51SKdJMJhXvKyIdBLy8WYNchTt8yRITv9Adxg9J # qGujh+TnP1bW3aQjFtlEl7SzgNeI8OVA/CJAWWUuRT3Au9ToOpHy/flrrknhN4he # Ew7/6ILMv4HSsj0YZ4otAgMBAAGjggFQMIIBTDB1BggrBgEFBQcBAQRpMGcwOwYI # KwYBBQUHMAKGL2h0dHA6Ly9zdWJjYS5yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdHNj # YTIwMjEuY2VyMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u # Y29tMB8GA1UdIwQYMBaAFL5UAi+/QGxzQ86sCSVOnkNEGu7gMAwGA1UdEwEB/wQC # MAAwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL3N1YmNhLmNybC5jZXJ0dW0ucGwv # Y3RzY2EyMDIxLmNybDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8E # BAMCB4AwIgYDVR0gBBswGTAIBgZngQwBBAIwDQYLKoRoAYb2dwIFAQswHQYDVR0O # BBYEFCM5aiirmhKnpKfyH/lFmr+N/oIDMA0GCSqGSIb3DQEBDAUAA4ICAQBm/pOb # rAveTqYFPCSthxNVwBHTW4TfuBQY2KGCdMlH6ALjVPYf2XARNGMTXScR0JQ2/c2L # xLpoHHhRwxFf3d933DhFS165rYj6iPSQKm41rc9AMpTCjMdmai1aK9o870pOzTzL # RhWFVIxm+5Qf+t4V5z14tPoUsAWdfRKD1Zzvzfe5AHlE9rxOZcGROiULxs3Edf7Z # J8RZI0jzD9juj2oEX2XS7BVKuNCK1W0h1mjapv028yqo8UtZh5/1Ib48Yyp88BDY # Shh5PSGUUuS5tYXVfcduIPBe3PdNTYRYdT5VNxkwLgjMzIcr/6SH2fejFJDjnCxj # vXLuarErJg/IdI+hXdGIBDVOGv1zrkF4ktoQvFZIp5DIAYh0GwyUhc87qqn5UaYT # j2+iyiBDSNh7aGCrkuAnqg7Qh7frhX+QhMGeJ9SpLpnG76qN85hLyjvYR6gRYiLT # j8G4fxjqV400/buPw0rBo9yJZyq/8cGdCOLPOYf9qpefTcrZKeO9pg+UJHx8UABb # aTqizRxm8sUSEycccCCFhIit3AI/3wGuSOADeiA676NcQ7+dsP04YvzvdN7pTZNy # g672WpBDJdg0eItHl4yomvNeIOWh1qs4QqOW6TI8Ocsi4uSDTLorxLUDnBTwKQzz # pxd1YUctEgRh32R0J9FkFkeEruJU94RljFr1uDCCBrkwggShoAMCAQICEQCZo4AK # JlU7ZavcboSms+o5MA0GCSqGSIb3DQEBDAUAMIGAMQswCQYDVQQGEwJQTDEiMCAG # A1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVt # IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3Rl # ZCBOZXR3b3JrIENBIDIwHhcNMjEwNTE5MDUzMjE4WhcNMzYwNTE4MDUzMjE4WjBW # MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu # MSQwIgYDVQQDExtDZXJ0dW0gQ29kZSBTaWduaW5nIDIwMjEgQ0EwggIiMA0GCSqG # SIb3DQEBAQUAA4ICDwAwggIKAoICAQCdI88EMCM7wUYs5zNzPmNdenW6vlxNur3r # Lfi+5OZ+U3iZIB+AspO+CC/bj+taJUbMbFP1gQBJUzDUCPx7BNLgid1TyztVLn52 # NKgxxu8gpyTr6EjWyGzKU/gnIu+bHAse1LCitX3CaOE13rbuHbtrxF2tPU8f253Q # gX6eO8yTbGps1Mg+yda3DcTsOYOhSYNCJiL+5wnjZ9weoGRtvFgMHtJg6i671OPX # IciiHO4Lwo2p9xh/tnj+JmCQEn5QU0NxzrOiRna4kjFaA9ZcwSaG7WAxeC/xoZSx # F1oK1UPZtKVt+yrsGKqWONoK6f5EmBOAVEK2y4ATDSkb34UD7JA32f+Rm0wsr5aj # zftDhA5mBipVZDjHpwzv8bTKzCDUSUuUmPo1govD0RwFcTtMXcfJtm1i+P2UNXad # PyYVKRxKQATHN3imsfBiNRdN5kiVVeqP55piqgxOkyt+HkwIA4gbmSc3hD8ke66t # 9MjlcNg73rZZlrLHsAIV/nJ0mmgSjBI/TthoGJDydekOQ2tQD2Dup/+sKQptalDl # ui59SerVSJg8gAeV7N/ia4mrGoiez+SqV3olVfxyLFt3o/OQOnBmjhKUANoKLYlK # mUpKEFI0PfoT8Q1W/y6s9LTI6ekbi0igEbFUIBE8KDUGfIwnisEkBw5KcBZ3XwnH # mfznwlKo8QIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU # 3XRdTADbe5+gdMqxbvc8wDLAcM0wHwYDVR0jBBgwFoAUtqFUOQLDoD+Oirz61Pgc # ptE6Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMDAGA1Ud # HwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5jcmwwbAYI # KwYBBQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0 # dW0uY29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwv # Y3RuY2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0 # cDovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQB1iFgP5Y9Q # KJpTnxDsQ/z0O23JmoZifZdEOEmQvo/79PQg9nLF/GJe6ZiUBEyDBHMtFRK0mXj3 # Qv3gL0sYXe+PPMfwmreJHvgFGWQ7XwnfMh2YIpBrkvJnjwh8gIlNlUl4KENTK5DL # qsYPEtRQCw7R6p4s2EtWyDDr/M58iY2UBEqfUU/ujR9NuPyKk0bEcEi62JGxauFY # zZ/yld13fHaZskIoq2XazjaD0pQkcQiIueL0HKiohS6XgZuUtCKA7S6CHttZEsOb # QJ1j2s0urIDdqF7xaXFVaTHKtAuMfwi0jXtF3JJphrJfc+FFILgCbX/uYBPBlbBI # P4Ht4xxk2GmfzMn7oxPITpigQFJFWuzTMUUgdRHTxaTSKRJ/6Uh7ki/pFjf9sUAS # WgxT69QF9Ki4JF5nBIujxZ2sOU9e1HSCJwOfK07t5nnzbs1LbHuAIGJsRJiQ6HX/ # DW1XFOlXY1rc9HufFhWU+7Uk+hFkJsfzqBz3pRO+5aI6u5abI4Qws4YaeJH7H7M8 # X/YNoaArZbV4Ql+jarKsE0+8XvC4DJB+IVcvC9Ydqahi09mjQse4fxfef0L7E3hh # o2O3bLDM6v60rIRUCi2fJT2/IRU5ohgyTch4GuYWefSBsp5NPJh4QRTP9DC3gc5Q # EKtbrTY0Ka87Web7/zScvLmvQBm8JDFpDjCCBrkwggShoAMCAQICEQDn/2nHOzXO # S5Em2HR8aKWHMA0GCSqGSIb3DQEBDAUAMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UE # ChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl # cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBO # ZXR3b3JrIENBIDIwHhcNMjEwNTE5MDUzMjA3WhcNMzYwNTE4MDUzMjA3WjBWMQsw # CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQw # IgYDVQQDExtDZXJ0dW0gVGltZXN0YW1waW5nIDIwMjEgQ0EwggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQDpEh8ENe25XXrFppVBvoplf0530W0lddNmjtv4 # YSh/f7eDQKFaIqc7tHj7ox+u8vIsJZlroakUeMS3i3T8aJRC+eQs4FF0GqvkM6+W # ZO8kmzZfxmZaBYmMLs8FktgFYCzywmXeQ1fEExflee2OpbHVk665eXRHjH7MYZIz # Nnjl2m8Hy8ulB9mR8wL/W0v0pjKNT6G0sfrx1kk+3OGosFUb7yWNnVkWKU4qSxLv # 16kJ6oVJ4BSbZ4xMak6JLeB8szrK9vwGDpvGDnKCUMYL3NuviwH1x4gZG0JAXU3x # 2pOAz91JWKJSAmRy/l0s0l5bEYKolg+DMqVhlOANd8Yh5mkQWaMEvBRE/kAGzIqg # WhwzN2OsKIVtO8mf5sPWSrvyplSABAYa13rMYnzwfg08nljZHghquCJYCa/xHK9a # cev9UD7Y+usr15d7mrszzxhF1JOr1Mpup2chNSBlyOObhlSO16rwrffVrg/SzaKf # SndS5swRhr8bnDqNJY9TNyEYvBYpgF95K7p0g4LguR4A++Z1nFIHWVY5v0fNVZmg # zxD9uVo/gta3onGOQj3JCxgYx0KrCXu4yc9QiVwTFLWbNdHFSjBCt5/8Q9pLuRhV # ocdCunhcHudMS1CGQ/Rn0+7P+fzMgWdRKfEOh/hjLrnQ8BdJiYrZNxvIOhM2aa3z # EDHNwwIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUvlQC # L79AbHNDzqwJJU6eQ0Qa7uAwHwYDVR0jBBgwFoAUtqFUOQLDoD+Oirz61PgcptE6 # Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMDAGA1UdHwQp # MCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5jcmwwbAYIKwYB # BQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u # Y29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY3Ru # Y2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0cDov # L3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQC4k1l3yUwV/ZQH # CKCneqAs8EGTnwEUJLdDpokN/dMhKjK0rR5qX8nIIHzxpQR3TAw2IRw1Uxsr2Pli # G3bCFqSdQTUbfaTq6V3vBzEebDru9QFjqlKnxCF2h1jhLNFFplbPJiW+JSnJTh1f # KEqEdKdxgl9rVTvlxfEJ7exOn25MGbd/wGPwuSmMxRJVO0wnqgS7kmoJjNF9zqee # hFSDDP8ZVkWg4EZ2tIS0M3uZmByRr+1Lkwjjt8AtW83mVnZTyTsOb+FNfwJY7DS4 # FmWhkRbgcHRetreoTirPOr/ozyDKhT8MTSTf6Lttg6s6T/u08mDWw6HK04ZRDfQ9 # sb77QV8mKgO44WGP31vXnVKoWVJpFBjPvjL8/Zck/5wXX2iqjOaLStFOR/IQki+E # hn4zlcgVm22ZVCBPF+l8nAwUUShCtKuSU7GmZLKCmmxQMkSiWILTm8EtVD6AxnJh # oq8EnhjEEyUoflkeRF2WhFiVQOmWTwZRr44IxWGkNJC6tTorW5rl2Zl+2e9JLPYf # 3pStAPMDoPKIjVXd6NW2+fZrNUBeDo2eOa5Fn7Brs/HLQff5Xgris5MeUbdVgDrF # 8uxO6cLPvZPo63j62SsNg55pTWk9fUIF9iPoRbb4QurjoY/woI1RAOKtYtTic6aA # Jq3u83RIPpGXBSJKwx4KJAOZnCDCtTGCBqIwggaeAgEBMGowVjELMAkGA1UEBhMC # UEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIGA1UEAxMb # Q2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBAhBX5gfP8LabvnxCXoItEBa/MA0G # CWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZI # hvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcC # ARUwLwYJKoZIhvcNAQkEMSIEIHFtDMvwkxaNgZRIDWn79f7wWsCAp2eNxNjNGkn/ # nGTTMA0GCSqGSIb3DQEBAQUABIIBgASG+S5DuozymyE/JHiL0NVtsj+XOlQG4P3i # 7VBk0h+WpMRw8XJzP1aPuzBD/pyqE3zB9qPCnh3hK+s9z9scQS/uxIISsr4DLEx2 # gdzvX8cut2Dab1UK2wsWC1UQ7I5E0SWy6W42ZHUllBMC+86ZoM3Bh5b8KLPLPtp0 # /nQFublnUXA0KVJa6iwaq1UrwUYsItR5heJccLvUETsiNwmaf4HHR8N9hhPqo//a # 45szxO1LPzcHMiti3KeO6HDaDWlJHkJqsQ1IjuJ/uTSgqz8m6U1cgOBXCpKEhQz6 # FDQAAotRR+z1quS5mVdCxYcy8PZiu6Q1GtUrFoOvNQ8vExyiGA154U2pYDIVSR1v # kvTxlegg1MkkRIzrlTAnLPZggaT5R8mGOwd01vaxiJN+ys36GHEEJoMCLVojY78F # DHf4gee5p3W2AJHuMbUeRqs7RyJUHQx09FqHCVKBsFM2F4OUnfaSYBzebY+GEM0k # iAZPt5YdcPosa7YgUAVwClmQnw26PKGCBAIwggP+BgkqhkiG9w0BCQYxggPvMIID # 6wIBATBqMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0 # ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQQIQ # KPB3wRw2vf5fdDJHcCcuAzANBglghkgBZQMEAgIFAKCCAVYwGgYJKoZIhvcNAQkD # MQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjEwMTMwOTQxNDNaMDcG # CyqGSIb3DQEJEAIvMSgwJjAkMCIEIIW+kOEK0kONfMkotq9IsJqyCBd87PiwEmxY # 05EFJcQ8MD8GCSqGSIb3DQEJBDEyBDB8unjhc5CUfwTBseNiFPxDmkyVZPEzjJw6 # Oaj5vigJRrlrPiP2GApFxSGwNLILFBwwgZ8GCyqGSIb3DQEJEAIMMYGPMIGMMIGJ # MIGGBBRXFGhBDKha80JO+RZKUTYQ9NONmDBuMFqkWDBWMQswCQYDVQQGEwJQTDEh # MB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQwIgYDVQQDExtDZXJ0 # dW0gVGltZXN0YW1waW5nIDIwMjEgQ0ECECjwd8EcNr3+X3QyR3AnLgMwDQYJKoZI # hvcNAQEBBQAEggIAbcYbmDWVgUclHpCq7WWZoMfSKrDcMAA1mU4atZP3wOrMkjEK # x/XJkuHtGnw2KWcG+kyw+gZnmmSh3jrSuy73OvZObHff//lvM5X2lSEA/EcQzY4p # t1l/O1elCAfohdjmRVmOmZIFlu0uoFrmzIr8VlW3ueYo4wKtqnn8Le9aDrC3trtv # K9uZuffeuxYZyoD/DADGhq708BvHBm3Y/aCdl8dFhko18crPg5V6rrNnLps3qKxS # XZ/3oQulbO0zo/w90QNc6YSqbBDHllCq6OUcBtrtalHR36OZJjpkrl0AEHyc4EFG # dxFFYrIGDby2CY1gIx+3JpEhl5aEH2QHLJFpnFT0/IheCzfLIw9G0EWTD+Vuyokv # fxFExX+5mdWCeqYWMCWUcldXdMPV1TdwGHjtYTXQZU4qUkg8ZunscxifmYr+Sm4c # FLcgHVIqlC+dOIJrwAvKxSWgYKTKd7FM9qmUvXtuGBYS+5Sp4nJ6MEBeNLC1nOye # Cn+knbKKFblDpYWK+BnNbAT2X+ifmKwjgGT+AsksERyLHrOHU+6XbkfO1ZZ9aYQa # yKPC+n1LtgTZn65SN3lrlAh9a56n4RIRE4dYlAgFVIBf1PpdufAYKR89OA/iOD6D # 0CfVfCfpF1QCR7HIoNSybl6S0qyPVOSB6HHHkbgl9UJD5T629lB1SKQgMfk= # SIG # End signature block |