FastTrack-GDPR-RequestDsr.psm1
Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue Function Get-ResponseError { <# .SYNOPSIS Get-ResponseError converts HtmlWebResponse error to HtmlWebResponseObject for output .DESCRIPTION Get-ResponseError inputs HtmlWebResponse error and converts to HtmlWebResponseObject for output .PARAMETER Response is the error response returned from webrequest .EXAMPLE Get-ResponseError $_.Exception.Response .INPUTS System.Net.HttpWebResponse .OUTPUTS HtmlWebResponseObject .LINK #> param([System.Net.HttpWebResponse]$Response) $streamReader = New-Object System.IO.StreamReader($Response.GetResponseStream()) $streamReader.BaseStream.Position = 0 $streamReader.DiscardBufferedData() $body = ConvertFrom-Json($streamReader.ReadToEnd()) if([string]::IsNullOrEmpty($body)) { $body = ConvertFrom-Json("{}") } Add-Member -InputObject $body -MemberType NoteProperty -Name "StatusCode" -Value $_.Exception.Response.StatusCode $body } Function Invoke-GetRequest { <# .SYNOPSIS Call Rest API with input variables to retrieve appropriate response .DESCRIPTION The Invoke-GetRequest cmdlet utilizes the header parameter to perform the REST API call to modify a FastTrack migration. The REST API is defined in the URI parameter and returns the API's webresponse. .PARAMETER Uri as the endpoint HTML address for the REST API Headers is a collection of header keys and values required by the API to return results .EXAMPLE $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}/{1}/DSR/Status/TransactionId/{2}?{3}", $global:CsiApiBaseUriFormat, $TenantId, $TransactionId, $query)) -Headers $header .INPUTS System.String System.Collections.Hashtable .OUTPUTS HtmlWebResponseObject .LINK #> param([String]$Uri, [hashtable]$Headers) $response = try { Invoke-RestMethod -Method GET -Uri $Uri -ContentType 'application/json' -Headers $Headers } catch { Get-ResponseError $_.Exception.Response } return $response } Function Invoke-PostRequest { <# .SYNOPSIS Call Rest API with input variables to retrieve appropriate response .DESCRIPTION The Invoke-PostRequest cmdlet utilizes the body and header parameters to perform the REST API call to modify a FastTrack migration. The REST API is defined in the URI parameter and returns the API's webresponse. .PARAMETER Uri as the endpoint HTML address for the REST API Headers is a collection of header keys and values required by the API to return results Body is the collected form data required by the API to return results .EXAMPLE .INPUTS System.String System.Collections.Hashtable .OUTPUTS HtmlWebResponseObject .LINK #> param([String]$Uri, [hashtable]$Headers, [String]$Body) $response = try { Invoke-RestMethod -Method POST -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body } catch { Get-ResponseError $_.Exception.Response } return $response } Function SetDsrObjectValues{ param ( [string] $TenantID, [string] $CompanyName, [string] $LogonUserEmail, [string] $DsrRequestUserEmail, [string] $DsrType, [string] $MigrationType ) $RequestUserEmails = New-Object System.Collections.Generic.List``1[System.String] if($DsrRequestUserEmail.Contains(",")) { foreach($userEmail in $DsrRequestUserEmail.Split(",".ToCharArray())) { $RequestUserEmails.Add([System.Web.HttpUtility]::HtmlEncode($userEmail)); } } else { $RequestUserEmails.Add([System.Web.HttpUtility]::HtmlEncode($DsrRequestUserEmail)); } $CustomerIdentity = (New-Object PSObject | Add-Member -PassThru NoteProperty TenantId $TenantID | Add-Member -PassThru NoteProperty CompanyName $CompanyName | Add-Member -PassThru NoteProperty LogOnUserEmail $LogonUserEmail) $CustomerObject = (New-Object PSObject | Add-Member -PassThru NoteProperty TransactionId ([System.Guid]::Empty) | Add-Member -PassThru NoteProperty DSRType $DsrType | Add-Member -PassThru NoteProperty Identity $CustomerIdentity | Add-Member -PassThru NoteProperty DsrRequestUserEmail $RequestUserEmails.ToArray() | Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov | Add-Member -PassThru NoteProperty MigrationType $MigrationType) return $CustomerObject } Function Submit-FastTrackGdprDsrRequest{ <# .SYNOPSIS Submit a new GDPR DSR request to remove user sensitive information from the FastTrack environment. .DESCRIPTION The Submit-FastTrackGdprDsrRequest cmdlet submits a new GDPR DSR request to remove user sensitive information from the FastTrack environment. In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet. Once a request is submitted, you can check the status of the request use the Get-FastTrackDsrRequest cmdlet. .PARAMETER DsrRequestUserEmail Email of user to remove from FastTrack .EXAMPLE Submit-FastTrackGdprDsrRequest -DsrRequestUserEmail "abc@contoso.net" .INPUTS System.String .OUTPUTS System.Management.Automation.PSObject This cmdlet generates a System.Management.Automation.PSObject object that represents the Transaction ID . .LINK Get-FastTrackGdprDsrRequests Get-FastTrackGdprDsrStatus #> param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $DsrRequestUserEmail ) try { $DsrType = "Delete" #defaulting value for initial release if($global:MsoAdminProperties.Count -eq 0) { Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function." return } elseif($global:MsoAdminProperties["MSO-AdminUser"] -eq $null) { Write-Warning "Logged in user is not a global admin for tenant $($global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName)" return } if($global:MsoAdminProperties["MSO-AdminUser"] -ne $null) { Write-Host "Admin user validated... Preparing DSR request..." $jsonObj = SetDsrObjectValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"] ` -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName ` -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account ` -DsrRequestUserEmail: $DsrRequestUserEmail ` -DsrType: $DsrType $serializedJson = $jsonObj | ConvertTo-Json -Compress: $true Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Request formatted for system request." $header = @{} if($global:v2FeatureFlag -eq $true){ $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())} else{ $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)} $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"]) Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Sending DSR Request." $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("{0}DSR/Create",$global:CsiApiBaseUriFormat)) -Headers $header -Body $serializedJson if($JsonResult.StatusCode -ne $null) { # Error? Write-Warning "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)" } else { Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Transaction Request Complete" } return $JsonResult | Add-Member -PassThru NoteProperty Status "Submitted" } else { Write-Warning "SORRY! - The Logon User is not marked as a Global Administrator... We cannot continue!" } } catch { Write-Warning -Message:"An error occurred attempting to authenticate with this module" Write-Warning -Message: $_.Exception.Message Write-Host "Press the [enter] key to close this process" Read-Host } } Function Get-FastTrackGdprDsrRequest { <# .SYNOPSIS Get the status of a GDPR DSR request from the FastTrack environment. .DESCRIPTION The Get-FastTrackGdprDsrStatus cmdlet Get the status of a GDPR DSR request from the FastTrack environment. In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet. Once a request is submitted, you can check the status of the request use the Get-FastTrackDsrRequest cmdlet. .PARAMETER TransactionId Unique transaction identifier .EXAMPLE Get-FastTrackGdprDsrStatus -DataServiceRequestId "RequestId" Get-FastTrackGdprDsrStatus .INPUTS System.String .OUTPUTS System.Management.Automation.PSObject This cmdlet generates a System.Management.Automation.PSObject object that represents FastTrack GDPR DSR status. .LINK Submit-FastTrackGdprDsrRequest Get-FastTrackGdprDsrRequests #> param ( [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $TransactionId ) try { if($global:MsoAdminProperties.Count -eq 0) { Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function." return } if($global:MsoAdminProperties["MSO-AdminUser"] -ne $null) { Write-Host "Admin user validated... Preparing DSR request..." [string] $TenantId = $global:MsoAdminProperties["MSO-CompanyTenantInfo"] [string] $query = "environmentType=$global:MsoComOrGov" $header = @{} if($global:v2FeatureFlag -eq $true){ $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())} else{ $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)} $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"]) Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Sending DSR Request." if ($TransactionId -ne [string]::Empty) { $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}/{1}/DSR/Status/TransactionId/{2}?{3}", $global:CsiApiBaseUriFormat, $TenantId, $TransactionId, $query)) -Headers $header } else { $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}/{1}/DSR?{2}", $global:CsiApiBaseUriFormat, $TenantId, $query)) -Headers $header } if($JsonResult.StatusCode -ne $null) { # Error? Write-Warning "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)" } else { Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Transaction Request Complete" } return $JsonResult } else { Write-Warning "SORRY! - The Logon User is not marked as a Global Administrator... We cannot continue!" } } catch { Write-Warning -Message:"An error occurred attempting to authenticate with this module" Write-Warning -Message: $_.Exception.Message Write-Host "Press the [enter] key to close this process" Read-Host } } # SIG # Begin signature block # MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBwLcs6UguYBB2C # 1TF8FdYTCUTHWlOW5bvosdL/EZESgKCCDYEwggX/MIID56ADAgECAhMzAAABA14l # HJkfox64AAAAAAEDMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMTgwNzEyMjAwODQ4WhcNMTkwNzI2MjAwODQ4WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDRlHY25oarNv5p+UZ8i4hQy5Bwf7BVqSQdfjnnBZ8PrHuXss5zCvvUmyRcFrU5 # 3Rt+M2wR/Dsm85iqXVNrqsPsE7jS789Xf8xly69NLjKxVitONAeJ/mkhvT5E+94S # nYW/fHaGfXKxdpth5opkTEbOttU6jHeTd2chnLZaBl5HhvU80QnKDT3NsumhUHjR # hIjiATwi/K+WCMxdmcDt66VamJL1yEBOanOv3uN0etNfRpe84mcod5mswQ4xFo8A # DwH+S15UD8rEZT8K46NG2/YsAzoZvmgFFpzmfzS/p4eNZTkmyWPU78XdvSX+/Sj0 # NIZ5rCrVXzCRO+QUauuxygQjAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUR77Ay+GmP/1l1jjyA123r3f3QP8w # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDM3OTY1MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAn/XJ # Uw0/DSbsokTYDdGfY5YGSz8eXMUzo6TDbK8fwAG662XsnjMQD6esW9S9kGEX5zHn # wya0rPUn00iThoj+EjWRZCLRay07qCwVlCnSN5bmNf8MzsgGFhaeJLHiOfluDnjY # DBu2KWAndjQkm925l3XLATutghIWIoCJFYS7mFAgsBcmhkmvzn1FFUM0ls+BXBgs # 1JPyZ6vic8g9o838Mh5gHOmwGzD7LLsHLpaEk0UoVFzNlv2g24HYtjDKQ7HzSMCy # RhxdXnYqWJ/U7vL0+khMtWGLsIxB6aq4nZD0/2pCD7k+6Q7slPyNgLt44yOneFuy # bR/5WcF9ttE5yXnggxxgCto9sNHtNr9FB+kbNm7lPTsFA6fUpyUSj+Z2oxOzRVpD # MYLa2ISuubAfdfX2HX1RETcn6LU1hHH3V6qu+olxyZjSnlpkdr6Mw30VapHxFPTy # 2TUxuNty+rR1yIibar+YRcdmstf/zpKQdeTr5obSyBvbJ8BblW9Jb1hdaSreU0v4 # 6Mp79mwV+QMZDxGFqk+av6pX3WDG9XEg9FGomsrp0es0Rz11+iLsVT9qGTlrEOla # P470I3gwsvKmOMs1jaqYWSRAuDpnpAdfoP7YO0kT+wzh7Qttg1DO8H8+4NkI6Iwh # SkHC3uuOW+4Dwx1ubuZUNWZncnwa6lL2IsRyP64wggd6MIIFYqADAgECAgphDpDS # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIWLTCCFikCAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAQNeJRyZH6MeuAAAAAABAzAN # BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgITOS3T+N # BJ6XWPkpntsDDlQ4GkcOT/56es3t6I+2uN4wQgYKKwYBBAGCNwIBDDE0MDKgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN # BgkqhkiG9w0BAQEFAASCAQDDGcR9///ARtMpwAMVs8H2MG6gwkST5I1mU/xcBwS5 # Z3WNipGg0pAXTELpMGnC8vI46E78GUKFzriyV7FvLtqEg9F0ScwoEq0MRUelEMOG # zwh+sIaXPZP0a5gyws03kS/+07X8EWtjd+dj6LeVo4Glv0xxi9f5IaantRYXwzN6 # 4mDp7oU0Er3Nv7WOwoN42fsLvwl7g+putlbYJdCws/2Xxs55f9MfLLf2lUszJMkM # RDgr56/G6gxUd8t65mFzgs8g/rHc2sqr/7GKR7xglJvmk380u5LCiyNlKa7Cv+f4 # 85ibFN6GHwja8pPBhNKg7JTfcuY15Sj+x0Ns45Rbj7LcoYITtzCCE7MGCisGAQQB # gjcDAwExghOjMIITnwYJKoZIhvcNAQcCoIITkDCCE4wCAQMxDzANBglghkgBZQME # AgEFADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMB # MDEwDQYJYIZIAWUDBAIBBQAEIPOOvmznyH41MiSj6g00mTsmW0dHtNxvCJthsV9Q # 6VlZAgZcPxrRDlkYEzIwMTkwMTIzMTgwMjQ5LjE3NlowBwIBAYACAfSggdSkgdEw # gc4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsT # IE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFs # ZXMgVFNTIEVTTjpGNTI4LTM3NzctOEE3NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaCCDx8wggT1MIID3aADAgECAhMzAAAA0ZjP5DyZJWSE # AAAAAADRMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMB4XDTE4MDgyMzIwMjYzM1oXDTE5MTEyMzIwMjYzM1owgc4xCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP # cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpG # NTI4LTM3NzctOEE3NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy # dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8AzsRMhqn2kikK # hD3zCu0CrZNR/rI/5Mk55+pELW4spLVAS2J5i9pImF9/L+hCWB1+VABr1O6Z7JLs # cLyNQH9h+425uDw/j9NivZcdYhQHS5aXUGrlg+hBI04qTdVXVFiLz7QnOdOCQWWT # 34xuwiDFSTU3pND3zBTUzgtHG2DHuZ9KYCBBQI5h+DppSTrIl2hrNoi2h048t68+ # kzCzZbxtcDB5JdvnPklmJW0eiaBUNLDQBJ+qisRoEe5KXXUJbvcFSh40S1PHF5hK # SSMa2dzsK+7U7N9SXMla5WYOGshZSD9OKiNzR24i6gNYxHx2qrkexW6j2M/OCj8z # cpMqx/8CAwEAAaOCARswggEXMB0GA1UdDgQWBBSD+xJFcDb/Z4m6UIvdycY9VPNq # DDAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEug # SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N # aWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG # AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rp # bVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQA64DLn2qQE9IkemBnRJXoNPZ8i # 2UamL9Syzn2kERwVuBZ4lrlNjXcdzGEFwKpnxtw4nHbwdyaUxDf26Nu0fcGA0+8Y # JqinxW5Ru8r0uLbbn/5DCEhnoC/eGEtQkgQVC2ppiula+Uk5RSTq/A90xnT74jnI # gGQuC9tptzLmy3LHYBGObaMCPxFaVkea9BL87pxnk8pGFF/069NFIZGb5OjMCJgk # qyycHEb+Kk+H/JT0fuqydkn8CXk8lrV/Mehla+jEcGLW2DSBdM9Epq84Zn4ywzU9 # s2Ri63KfeNARfvkLNTWiDRwPhogV7O6O6Y171+1bOo4RggWFdfAX/JWlmsooMIIG # cTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0 # IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1 # WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCC # ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9p # lGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEw # WbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeG # MoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJ # UGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw # 2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0C # AwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ # 80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E # BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2U # kFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j # b20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmww # WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYD # VR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYI # KwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0 # AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9 # naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtR # gkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzy # mXlKkVIArzgPF/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCf # Mkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3D # nKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs # 9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110 # mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL # 2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffI # rE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxE # PJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc # 1bN+NR4Iuto229Nfj950iEkSoYIDrTCCApUCAQEwgf6hgdSkgdEwgc4xCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29m # dCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT # TjpGNTI4LTM3NzctOEE3NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg # U2VydmljZaIlCgEBMAkGBSsOAwIaBQADFQBKXMzSTq/paxECeoaXXVG5drZU8aCB # 3jCB26SB2DCB1TELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEp # MCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJzAlBgNV # BAsTHm5DaXBoZXIgTlRTIEVTTjo0REU5LTBDNUUtM0UwOTErMCkGA1UEAxMiTWlj # cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIF # AN/yEHwwIhgPMjAxOTAxMjMwNTU4MjBaGA8yMDE5MDEyNDA1NTgyMFowdDA6Bgor # BgEEAYRZCgQBMSwwKjAKAgUA3/IQfAIBADAHAgEAAgIEADAHAgEAAgIavDAKAgUA # 3/Nh/AIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAID # FuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQBAFmAG/VUISESOlyHn # iA5f5xGdqaxPJ6hk+Dr1Nf4ZOshZQIa3gd0NV+6/lK+vW4p7+SPABdPNuBITKaAi # 4tZczvHkcKNA6Gi7uLDDiporKhnE7OswAcyH8iFu99iE8VMDbeCubpT1eXDVaXIl # kR40OBW6hLF6qlZLeyyl6Q6kfDtMU1WuW/oMC/s88P0MJ3inl/aSOP5uyR+N6E+4 # WxBqnnnfrnasUueQoTSPcyLReG5hks8FRgOjPoULHWwNxKgVrlpnWXhxrj9o23j8 # rb2Ua4iWFBAlMpGX7qKeJ27fkgu4aRtF2HGAmI2ZF8Ax31+gzYrXZtisjUnAEOC5 # kLpJMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC # EzMAAADRmM/kPJklZIQAAAAAANEwDQYJYIZIAWUDBAIBBQCgggEyMBoGCSqGSIb3 # DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgS7u/whUNBjJ18p+5 # e851XRh8Yx8ZdDDRX6NvVVOcYjQwgeIGCyqGSIb3DQEJEAIMMYHSMIHPMIHMMIGx # BBRKXMzSTq/paxECeoaXXVG5drZU8TCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwAhMzAAAA0ZjP5DyZJWSEAAAAAADRMBYEFPi5Ivcvz//nHMPl # DBnLJWLozE2UMA0GCSqGSIb3DQEBCwUABIIBAOxvZF7jRH55ZNPCI8izYS5Upi4H # Siqp0MIbDeCWjzVAXBGWTBHDO7SaoqdPYtBsKaJVTWy1w01EPmfBV8VaxlIHtN0p # iVneJq8LH5YaPa9CAaGwckORFyJgfudEufk/iXUN57HJED71xQoTOvBcF5VsCUDn # IgQQrmygAEp/ErZY9B2997spQmDAbGFFDg9iZUp/a3mATORNsoyt+Zajbsb+/G8h # 4eq7GdUF1IAqBj8TCDhD2XAxPvzCnD1KJDQZIF83KZqy/YAcg3P6/I1Rrx4gopw7 # bHZtThxlj6sn1XDc2QbszSJ08EaSpDAkM2VYiAimbIVIw0YchltsYOPUJnU= # SIG # End signature block |