public/ToggleFederatedOOBConnectors.ps1
|
<#
.Synopsis Script to toggle the global federated OOB connector visibility for the organization. .Description The Set-FederatedConnectorToggle function manages the global toggle for federated out-of-box (OOB) connectors in Microsoft Copilot. It allows administrators to enable or disable all federated connectors (existing and future) for their organization. When the toggle is OFF (isDisableFederatedGlobalToggle = true), all connectors are disabled. Administrators can choose to enable all connectors. When the toggle is ON (isDisableFederatedGlobalToggle = false or not set), all connectors are enabled. Administrators can choose to disable all connectors. The function provides an interactive menu to guide administrators through the process and verifies changes after applying them. .Parameter BaseUrl Optional. Base URL for the GCS Admin API. Default is "https://gcs.office.com". Can be overridden for different environments (e.g. Dogfood: "https://df.gcs.office.com"). .Parameter TenantId Optional parameter specifying the TenantId for which the toggle operation is to be performed. .Parameter Torus Optional switch parameter to indicate if Torus is being used. .Example Set-FederatedConnectorToggle Runs the function interactively with the default Prod environment URL. .Example Set-FederatedConnectorToggle -BaseUrl "https://df.gcs.office.com" Runs the function against the Dogfood environment. .Example Set-FederatedConnectorToggle -TenantId "your-tenant-id" Runs the function with a specific tenant ID. .Notes - Requires MSAL.PS PowerShell module for authentication. - Uses OAuth authentication with Microsoft identity platform. - Modifies the isDisableFederatedGlobalToggle field in the vertical settings. - Clears excludedContentSources and includedFederatedContentSources lists when toggling. - Changes may take up to 10 minutes to reflect. - Requires appropriate admin permissions to modify vertical settings. #> function Get-CurrentVertical { param( [Parameter(Mandatory=$true)] [string]$Token, [Parameter(Mandatory=$true)] [string]$BaseUrl ) $url = "$BaseUrl/v1.0/admin/verticals/ALL" $headers = @{ "Authorization" = "Bearer $Token" "Content-Type" = "application/json" } try { $response = Invoke-RestMethod -Uri $url -Method Get -Headers $headers -ErrorAction Stop return $response } catch { Write-Host "ERROR: Failed to fetch vertical settings." -ForegroundColor Red if ($_.Exception.Message) { Write-Host $_.Exception.Message -ForegroundColor Red } throw } } function Update-Vertical { param( [Parameter(Mandatory=$true)] [string]$Token, [Parameter(Mandatory=$true)] [string]$BaseUrl, [Parameter(Mandatory=$true)] [object]$Payload ) $url = "$BaseUrl/v1.0/admin/verticals/ALL" $headers = @{ "Authorization" = "Bearer $Token" "Content-Type" = "application/json" } try { $jsonPayload = $Payload | ConvertTo-Json -Depth 20 $response = Invoke-RestMethod -Uri $url -Method Put -Headers $headers -Body $jsonPayload -ErrorAction Stop return $response } catch { Write-Host "ERROR: Failed to update vertical settings." -ForegroundColor Red if ($_.ErrorDetails.Message) { Write-Host $_.ErrorDetails.Message -ForegroundColor Red } elseif ($_.Exception.Message) { Write-Host $_.Exception.Message -ForegroundColor Red } throw } } function Set-FederatedConnectorToggle { param( # Base URL for GCS Admin API [Parameter(Mandatory=$false)] [string] $BaseUrl = "https://gcs.office.com", # Tenant Id [Parameter(Mandatory=$false)] [string] $TenantId, # Torus Check [Parameter(Mandatory=$false)] [switch] $Torus ) Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Federated Connector Toggle Manager" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan try { # Use module's token acquisition $TokenInfoObj = GetOAuthToken -TenantId $TenantId -Torus:$Torus # Validate token was successfully acquired if ($null -eq $TokenInfoObj -or $null -eq $TokenInfoObj.Token -or [string]::IsNullOrEmpty($TokenInfoObj.Token.AccessToken)) { throw "Failed to acquire authentication token. Please ensure you have the necessary permissions and try again." } $token = $TokenInfoObj.Token.AccessToken # Fetch current vertical settings $vertical = Get-CurrentVertical -Token $token -BaseUrl $BaseUrl # Validate vertical response if ($null -eq $vertical) { throw "Failed to retrieve vertical settings. The API returned a null response." } if ($null -eq $vertical.payload) { throw "Failed to retrieve vertical settings payload. The API response is missing the payload property." } $toggleIsOff = $false if ($null -ne $vertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"] -and $vertical.payload.isDisableFederatedGlobalToggle -eq $true) { $toggleIsOff = $true } Write-Host "Current State: " -NoNewline if ($toggleIsOff) { Write-Host "Federated connectors are DISABLED for your organization" -ForegroundColor Green } else { Write-Host "Federated connectors are ENABLED for your organization" -ForegroundColor Green } Write-Host "`n" -ForegroundColor Cyan if ($toggleIsOff) { Write-Host "What would you like to do?" -ForegroundColor Yellow Write-Host "[1] Enable all federated connectors (including new connectors (if any))" -ForegroundColor White Write-Host "[2] Keep disabled by default (enable individually via Admin Center)" -ForegroundColor White Write-Host "" Write-Host "You can manage individual connectors at:" -ForegroundColor Gray Write-Host "Microsoft Admin Center -> Connectors -> Connection list`n" -ForegroundColor Gray $choice = Read-Host "Select option (1-2)" if ($choice -eq "1") { if ($null -eq $vertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) { $vertical.payload | Add-Member -MemberType NoteProperty -Name "isDisableFederatedGlobalToggle" -Value $false -Force } else { $vertical.payload.isDisableFederatedGlobalToggle = $false } $externalEntity = $vertical.payload.entities | Where-Object { $_.entityType -eq "External" } if ($null -eq $externalEntity) { $externalEntity = [PSCustomObject]@{ entityType = "External" contentSources = @() } if ($null -eq $vertical.payload.entities) { $vertical.payload.entities = @() } $vertical.payload.entities += $externalEntity } if ($null -eq $externalEntity.PSObject.Properties["excludedContentSources"]) { $externalEntity | Add-Member -MemberType NoteProperty -Name "excludedContentSources" -Value @() -Force } else { $externalEntity.excludedContentSources = @() } if ($null -eq $externalEntity.PSObject.Properties["includedFederatedContentSources"]) { $externalEntity | Add-Member -MemberType NoteProperty -Name "includedFederatedContentSources" -Value @() -Force } else { $externalEntity.includedFederatedContentSources = @() } Write-Host "`nUpdating settings..." -ForegroundColor Yellow Update-Vertical -Token $token -BaseUrl $BaseUrl -Payload $vertical.payload Write-Host "Verifying changes..." -ForegroundColor Yellow $updatedVertical = Get-CurrentVertical -Token $token -BaseUrl $BaseUrl $verified = $false $toggleCorrect = $false $listsEmpty = $false if ($null -ne $updatedVertical -and $null -ne $updatedVertical.payload) { if ($null -ne $updatedVertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) { if ($updatedVertical.payload.isDisableFederatedGlobalToggle -eq $false) { $toggleCorrect = $true } } $externalEntity = $updatedVertical.payload.entities | Where-Object { $_.entityType -eq "External" } if ($null -ne $externalEntity) { $excludedEmpty = ($null -eq $externalEntity.excludedContentSources -or $externalEntity.excludedContentSources.Count -eq 0) $includedEmpty = ($null -eq $externalEntity.includedFederatedContentSources -or $externalEntity.includedFederatedContentSources.Count -eq 0) $listsEmpty = $excludedEmpty -and $includedEmpty } $verified = $toggleCorrect -and $listsEmpty } if ($verified) { Write-Host "`nUpdated successfully." -ForegroundColor Green Write-Host "All federated connectors are enabled" -ForegroundColor Green Write-Host "Users in your organization can now access federated connectors in Copilot." -ForegroundColor White Write-Host "New connectors will be enabled by default" -ForegroundColor White Write-Host "" -ForegroundColor White Write-Host "Note:" -ForegroundColor Gray Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray } else { Write-Host "`n⚠ Warning: Unable to verify changes" -ForegroundColor Yellow Write-Host "Please check the settings manually.`n" -ForegroundColor Yellow } } else { Write-Host "`nNo changes made" -ForegroundColor Yellow Write-Host "Connectors remain disabled" -ForegroundColor Yellow Write-Host "Enable specific connectors via Microsoft Admin Center -> Connectors -> Connection list as needed" -ForegroundColor White Write-Host "" -ForegroundColor White Write-Host "Note:" -ForegroundColor Gray Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray } } else { Write-Host "What would you like to do?" -ForegroundColor Yellow Write-Host "[1] Disable all connectors (including future connectors)" -ForegroundColor White Write-Host "[2] Keep enabled by default (disable individually via Admin Center)" -ForegroundColor White Write-Host "" Write-Host "You can manage individual connectors at:" -ForegroundColor Gray Write-Host "Microsoft Admin Center -> Connectors -> Connection list`n" -ForegroundColor Gray $choice = Read-Host "Select option (1-2)" if ($choice -eq "1") { if ($null -eq $vertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) { $vertical.payload | Add-Member -MemberType NoteProperty -Name "isDisableFederatedGlobalToggle" -Value $true -Force } else { $vertical.payload.isDisableFederatedGlobalToggle = $true } $externalEntity = $vertical.payload.entities | Where-Object { $_.entityType -eq "External" } if ($null -eq $externalEntity) { $externalEntity = [PSCustomObject]@{ entityType = "External" contentSources = @() } if ($null -eq $vertical.payload.entities) { $vertical.payload.entities = @() } $vertical.payload.entities += $externalEntity } if ($null -eq $externalEntity.PSObject.Properties["excludedContentSources"]) { $externalEntity | Add-Member -MemberType NoteProperty -Name "excludedContentSources" -Value @() -Force } else { $externalEntity.excludedContentSources = @() } if ($null -eq $externalEntity.PSObject.Properties["includedFederatedContentSources"]) { $externalEntity | Add-Member -MemberType NoteProperty -Name "includedFederatedContentSources" -Value @() -Force } else { $externalEntity.includedFederatedContentSources = @() } Write-Host "`nUpdating settings..." -ForegroundColor Yellow Update-Vertical -Token $token -BaseUrl $BaseUrl -Payload $vertical.payload Write-Host "Verifying changes..." -ForegroundColor Yellow $updatedVertical = Get-CurrentVertical -Token $token -BaseUrl $BaseUrl $verified = $false $toggleCorrect = $false $listsEmpty = $false if ($null -ne $updatedVertical -and $null -ne $updatedVertical.payload) { if ($null -ne $updatedVertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) { if ($updatedVertical.payload.isDisableFederatedGlobalToggle -eq $true) { $toggleCorrect = $true } } $externalEntity = $updatedVertical.payload.entities | Where-Object { $_.entityType -eq "External" } if ($null -ne $externalEntity) { $excludedEmpty = ($null -eq $externalEntity.excludedContentSources -or $externalEntity.excludedContentSources.Count -eq 0) $includedEmpty = ($null -eq $externalEntity.includedFederatedContentSources -or $externalEntity.includedFederatedContentSources.Count -eq 0) $listsEmpty = $excludedEmpty -and $includedEmpty } $verified = $toggleCorrect -and $listsEmpty } if ($verified) { Write-Host "`nUpdated successfully." -ForegroundColor Green Write-Host "All federated connectors are now DISABLED." -ForegroundColor Green Write-Host "Users cannot see federated connectors in Copilot." -ForegroundColor White Write-Host "Future connectors will be disabled automatically." -ForegroundColor White Write-Host "" -ForegroundColor White Write-Host "Note:" -ForegroundColor Gray Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray } else { Write-Host "`n⚠ Warning: Unable to verify changes" -ForegroundColor Yellow Write-Host "Please check the settings manually.`n" -ForegroundColor Yellow } } else { Write-Host "`nNo changes made." -ForegroundColor Yellow Write-Host "Connectors remain enabled for your organization" -ForegroundColor Yellow Write-Host "Disable specific connectors via Microsoft Admin Center -> Connectors -> Connection list as needed." -ForegroundColor White Write-Host "" -ForegroundColor White Write-Host "Note:" -ForegroundColor Gray Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray } } } catch { Write-Error "Error happened while executing Set-FederatedConnectorToggle. Error = $_" } } # SIG # Begin signature block # MIIojQYJKoZIhvcNAQcCoIIofjCCKHoCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB4JDzpYIX1fjbm # oZyRS3Ytfco9IgdiBFWQ43Bk/wxwfKCCDYUwggYDMIID66ADAgECAhMzAAAEhJji # EuB4ozFdAAAAAASEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjUwNjE5MTgyMTM1WhcNMjYwNjE3MTgyMTM1WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDtekqMKDnzfsyc1T1QpHfFtr+rkir8ldzLPKmMXbRDouVXAsvBfd6E82tPj4Yz # aSluGDQoX3NpMKooKeVFjjNRq37yyT/h1QTLMB8dpmsZ/70UM+U/sYxvt1PWWxLj # MNIXqzB8PjG6i7H2YFgk4YOhfGSekvnzW13dLAtfjD0wiwREPvCNlilRz7XoFde5 # KO01eFiWeteh48qUOqUaAkIznC4XB3sFd1LWUmupXHK05QfJSmnei9qZJBYTt8Zh # ArGDh7nQn+Y1jOA3oBiCUJ4n1CMaWdDhrgdMuu026oWAbfC3prqkUn8LWp28H+2S # LetNG5KQZZwvy3Zcn7+PQGl5AgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUBN/0b6Fh6nMdE4FAxYG9kWCpbYUw # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwNTM2MjAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # AGLQps1XU4RTcoDIDLP6QG3NnRE3p/WSMp61Cs8Z+JUv3xJWGtBzYmCINmHVFv6i # 8pYF/e79FNK6P1oKjduxqHSicBdg8Mj0k8kDFA/0eU26bPBRQUIaiWrhsDOrXWdL # m7Zmu516oQoUWcINs4jBfjDEVV4bmgQYfe+4/MUJwQJ9h6mfE+kcCP4HlP4ChIQB # UHoSymakcTBvZw+Qst7sbdt5KnQKkSEN01CzPG1awClCI6zLKf/vKIwnqHw/+Wvc # Ar7gwKlWNmLwTNi807r9rWsXQep1Q8YMkIuGmZ0a1qCd3GuOkSRznz2/0ojeZVYh # ZyohCQi1Bs+xfRkv/fy0HfV3mNyO22dFUvHzBZgqE5FbGjmUnrSr1x8lCrK+s4A+ # bOGp2IejOphWoZEPGOco/HEznZ5Lk6w6W+E2Jy3PHoFE0Y8TtkSE4/80Y2lBJhLj # 27d8ueJ8IdQhSpL/WzTjjnuYH7Dx5o9pWdIGSaFNYuSqOYxrVW7N4AEQVRDZeqDc # fqPG3O6r5SNsxXbd71DCIQURtUKss53ON+vrlV0rjiKBIdwvMNLQ9zK0jy77owDy # XXoYkQxakN2uFIBO1UNAvCYXjs4rw3SRmBX9qiZ5ENxcn/pLMkiyb68QdwHUXz+1 # fI6ea3/jjpNPz6Dlc/RMcXIWeMMkhup/XEbwu73U+uz/MIIHejCCBWKgAwIBAgIK # YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw # OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD # VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la # UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc # 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D # dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+ # lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk # kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6 # A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd # X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL # 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd # sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3 # T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS # 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI # bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL # BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD # uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h # cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA # YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn # 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7 # v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b # pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/ # KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy # CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp # mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi # hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb # BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS # oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL # gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX # cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGl4wghpaAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAASEmOIS4HijMV0AAAAA # BIQwDQYJYIZIAWUDBAIBBQCggeYwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINPL # uIwOIqwLaOjo+uWF7OhZHF8tSnetfZ8Nz43cD5+OMHoGCisGAQQBgjcCAQwxbDBq # oEyASgBNAGkAYwByAG8AcwBvAGYAdAAuAEcAcgBhAHAAaAAuAEMAbwBuAG4AZQBj # AHQAbwByAHMALgBDAG0AZABsAGUAdAAuAGQAbABsoRqAGGh0dHA6Ly93d3cubWlj # cm9zb2Z0LmNvbTANBgkqhkiG9w0BAQEFAASCAQB5R8L3rULCx+oXlWAt3Rocf8Vx # dyORaoYCpomIQFL56BWunuQ2dfcoxW2NPMQMHCvT1Z4/q2BKqtJ9p7g/xz4pazBI # k01tJCGpYV1d7OP8P37Xrs1LAnwxQDvaCWK4RlX3XFRDYKx3fra2O2V4w6rie2bl # lA16xPtguBvEI7gOUnvqK9stsIsOUtMKFpSGkoDKKRx4inbU3H9itVW4UkDgu8rm # eO3VLyy4G2fw2SZdMoSUkYe0lxP1LD1jekIGODFt2Mjnc5xStCML3zBqfweoT1nI # a2V2UZ0EO6GwcnoXc5Apvet5sSUpGPeUrZaFwhz2O0TdI4MRk7Wyy/F9vHwUoYIX # sDCCF6wGCisGAQQBgjcDAwExghecMIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQMx # DzANBglghkgBZQMEAgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUwggFBAgEB # BgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIKcnA+ZMPglbrYLthO4pesF7 # H8C6/d4DpRJftpzTNKIXAgZpvC24MJUYEzIwMjYwNDA2MTM0NjI0Ljc4NVowBIAC # AfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn # MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYDVQQD # ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR/jCCBygwggUQoAMCAQIC # EzMAAAITsEM1Zs+vlegAAQAAAhMwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp # bWUtU3RhbXAgUENBIDIwMTAwHhcNMjUwODE0MTg0ODE3WhcNMjYxMTEzMTg0ODE3 # WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UE # CxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQL # Ex5uU2hpZWxkIFRTUyBFU046MzYwNS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jv # c29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQD0mXrguhnEMg1IWDP70pLk7O/mbnjx49XNz1FdZ7hPj8ymV+Brh6rX # ZEZ2nlxW+eN17m/F+rZrH+Oe7u9Rbitk3iY5Sbm+H6RxixCVhDncXCAgHecSNxAe # iasbeZl7+jOMVICvoluCUq0h4DJI/MBwXPIB6vmUs1QcES9AwzwE6MzJqkK+HTGy # DjEoVxUQlAsoR8IYF98xkj9qa60cVvcJRNntpWkbYocQVQ2VnW/Awq/FdM9EOdvA # 8bPLKoknOd+ws0dDi9e3a21LU94KgYjSE3U96rzIawhcz2ihzALToMY1Iz/gsDHa # 4q/CZSfo3AtzT62a+fLrDbytkt6OyRF+dVah8S/WZZjSMdScevBIYFLyBU/2BwGz # o/mDQ6kk8x/F1SQddGRww89bSEg/w1tbxblK6nwe7CdIpuOnICUYFR0z9XmtlvSx # maSfvXivpQsYr5wssA3pHcWFfo3SePrgXbstMrYFtLSkllpeOjR4M3PVBzF4gUtS # AX5EGwtgOfwTxwKR7Erw2W3caL3Ml/nnDpR9Nn6TBMzEyoXGHv5N/Hv5oE5tn6fH # 3rUC2KoDLvNVXr2j8tZF0o9l29mf0RLIZtOc9+OQERG/bamtKUROVHDM/puYRU4p # YtZXDG7CHttRZS5RvVyP3fO+21BgZBq3kT0Assk2aW8soKyQHutouwIDAQABo4IB # STCCAUUwHQYDVR0OBBYEFBOeEErH4WvKmFBYxGKkfj2wwUA6MB8GA1UdIwQYMBaA # FJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3Rh # bXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUH # MAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9z # b2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQC # MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqG # SIb3DQEBCwUAA4ICAQCCbFomsapDYPpQmFnpCXZJkU5o24ZtbcvMH4RL6XYEHUwm # 0FFIV2L+FVjfc2nGwlCFDlMtWnQNdg6Qig9BzXusf4hWF6Y7yMK35TojVMjDpxHt # z60Sj8mOnoSoRTVzj+atoyOAeFD6toL85QCb3wDWvhsg8e2wGYtE4aZ4TlcsgVoE # hlYe+HYI5chMo5tdV3nAa0nV1ll3BocAJcXnTqO1r66hR3LMB642VM8tOtnyfKHE # bCT1WHp6INDsJAxZJJrwMlL09ReN6iL29N1Ltkxeq762/pDPfG2gEXn5gUri4T6a # Iaz3QXGbRUraVauYWGORGXnPKgc53Abuyk1iQOiYI81Yi51RCZBgqm38eyyl9xv7 # GmdYgNB0zOATymPW+nAuBYScfsu1Ph1kJ6gOj08rjRHEEPyQonvr2eCQTB/AIPYR # f8xCTv14i86GmcfXYa5UHK9opmTldm+q08403Cvyr+oDfzvsi5bBaCdp5f6munDR # 1n9Au1sYZWuA/5NFCO37Z1xkDk/dfgvAA2GI+zLQ6XhcJ2Ps7EEsW87OwI8M9pWe # Sn518MUb404GKvtqpMnrzrbanKaDVX7qBz/VG/EL/CC9jIbTfd5wmq/Q6fRlE1iv # 6L86TCADcc/VosPRoesSnDqW3TbreJGQK+tx1w5bzDeMLxMm5oZbILZL2MSPODCC # B3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAw # gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT # KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIx # MDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57Ry # IQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VT # cVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhx # XFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQ # HJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1 # KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s # 4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUg # fX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3 # Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je # 1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUY # hEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUY # P3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGC # NxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4w # HQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYB # BAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcD # CDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0T # AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNV # HR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9w # cm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEE # TjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl # cnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOC # AgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/a # ZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp # 4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq # 95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qB # woEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG # +jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3B # FARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77 # IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJ # fn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K # 6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDx # yKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNZMIICQQIBATCC # AQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn # MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYDVQQD # ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQCY # ETxIKPGCNpybLz9UR2Ts3GlHpqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w # IFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7X29DjAiGA8yMDI2MDQwNjA1MDMx # MFoYDzIwMjYwNDA3MDUwMzEwWjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDtfb0O # AgEAMAoCAQACAhagAgH/MAcCAQACAhK2MAoCBQDtfw6OAgEAMDYGCisGAQQBhFkK # BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJ # KoZIhvcNAQELBQADggEBAK7Ijia7vAfuCkGI08/or9gZ9RrmPD0QHS2B4O8suCSc # 0lDnPzMLgfzGnB3HetFtoeGTBZOKL1V8GqyxvgIY6Cra1BY2Gaygk5GUJFIKxo4c # YC19jYN7pCLc14kNNDEWf79WOTb91GMLD6TtsVuhV+0U3bZU1tOYSsnD7KohzaJg # RchnoasqRYcel1edJ48vPNnE5a6DaYef1K44ayYqHDjzek6QVu7yivYrEcLCR5Uf # v9TdOnlQoNvAIi2/Y8MImjrxhvxyGGqRxkOmYH2K1HBehjCX4Ito47AeGD5/U7ED # rdM4+IdCWa3RKI/v9Em7trzuFCrbhZ+pA98xIo30my4xggQNMIIECQIBATCBkzB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAhOwQzVmz6+V6AABAAAC # EzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE # MC8GCSqGSIb3DQEJBDEiBCDy1Cxprzjm8CXdK+asGpCbWQPPUCaZVO3K2R0jaKtA # +zCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIMzhCW0UhTPwngOMDM/idWh1 # m9DFgaV5Qh+nzo5rnFhoMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTACEzMAAAITsEM1Zs+vlegAAQAAAhMwIgQg5rJDC/dk07msyMrxx/7CNJIQ # fjXQAZUsum2lsej6s7IwDQYJKoZIhvcNAQELBQAEggIAGz5JMIb9SGW7+vOL3ieF # CSXV4kqEH32oOW8TEJr8lU/ISf+Kt0iQBZsQ0o/JEJZ16waed4kXB3brQ9QnT9HV # RxiUoYNxGBuFxtrJpcz3rKRnRWD7qIPqQe6wUVrVJo+NBoshEKVmy8OO/Ylp0rSH # 66jnxiNHiwvRGxGxec313MSodJrfvh3vGf6JlTHeagslbhkqlwwTB/iO5Jc8Qdd9 # hI65hg5XBWtGELJ3GR9BRGeMzE1J82bRjUcMsCTJvCS2l4sRq0KSP5X76TuhGbGG # 6VQbFAPHpOix23IQtbuAKZxSXh9mwlTGhmcCSfXKnl8lCw7yteU7FJDoNDKqG1BO # Qo7QLoxN9oAYmUc7bAR1Yoj6Jjy1mxmZ5LIt9TpqUD8muJSHC2YKILqyCyW1UJ9r # Rd6ZiWgw/hp4u5m2t9/Ic47mFuS9taB9HVmp5KClf/DdBEi4QHHCUGUuY2BzE75h # X1G2qmUlQpnOo6XNQCtDU/IdkyhEuRGhfrrEb4EB1rSagZH5wnV++hVMoeFH2cKr # 4A1LHkMdh2d65XjaBdUm4PTh0R4H9DuO5UCXYQNWOhmSdOpqcFbIbnk3nu5piryY # ZQs7mrBjUNjecdNyVd3cMN1bruTOfxlnWo96p+nlul13KDEtbwwlmkUT94wgAo5D # ANEMx5+rIdmef/hIm+aotwY= # SIG # End signature block |