Obs/bin/TestObservability/TestModules/TestIMDS/TestIMDS.psm1
<##############################################################
# # # Copyright (C) Microsoft Corporation. All rights reserved. # # # ##############################################################> using Module ..\..\HelperFiles\Result.psm1 Import-Module $PSScriptRoot\..\..\HelperFiles\TestObsHelper.psm1 -Force Import-Module $PSScriptRoot\IMDSTestRow.psm1 -Force function Test-IMDS { Param( [Parameter(Mandatory=$true)] [PSCustomObject] $TestReport, [Parameter(Mandatory=$true)] [string] $DeviceType ) try { $functionName = $($MyInvocation.MyCommand.Name) $gcArcServiceTestRow = New-IMDSTestRow -TestName "Get status of GC Service (gcarcservice)" -TestDescription "Confirm status of service is running" $extensionTestRow = New-IMDSTestRow -TestName "Get status of Extension Service (extensionservice)" -TestDescription "Confirm status of service is running" $agentTestRow = New-IMDSTestRow -TestName "Get status of Agent Service (himds)" -TestDescription "Confirm status of service is running" $testRows = @($gcArcServiceTestRow, $extensionTestRow, $agentTestRow) $failedAzcmagent = $false try { Trace-Progress "$functionName : Getting service data from azcmagent.exe show" $JSONData = & "$($env:ProgramW6432)\AzureConnectedMachineAgent\azcmagent.exe" show -j | ConvertFrom-Json } catch { $failedAzcmagent = $true $failureMessage = "Error running azcmagent show: $_" Trace-Progress "$functionName : $failureMessage" -Error foreach ($testRow in $testRows) { $testRow = Update-IMDSTestRowForError -TestRow $testRow -FailureMessage $failureMessage $TestReport.Rows.Add($testRow) } } if ($failedAzcmagent -eq $false) { foreach ($testRow in $testRows) { Trace-Progress "$functionName : Running test $($testRow.TestName)" $testRow = Get-ServiceStatus -TestRow $testRow -JSONData $JSONData $TestReport.Rows.Add($testRow) } } Trace-Progress "$functionName : Testing IMDS endpoint" $endpointTestRow = Test-IMDSEndpoint $TestReport.Rows.Add($endpointTestRow) return $TestReport } catch { Trace-Progress "$functionName : Failed with $_" -Error return $TestReport } } function Get-ServiceStatus { Param( [Parameter(Mandatory=$true)] [PSCustomObject] $TestRow, [Parameter(Mandatory=$true)] [PSCustomObject] $JSONData ) try { $functionName = $($MyInvocation.MyCommand.Name) Trace-Progress "$functionName : Getting service name from test name $($testRow.TestName)" $regex = ".*\(([A-Za-z0-9_ ]+)\)" if ($testRow.TestName -match $regex) { $testServiceName = $matches[1] } else { $testRow.Result = [Result]::FAIL $testRow.ReasonForFailure = "Can't get name of service to check" return $testRow } Trace-Progress "$functionName : Getting service that matches $testServiceName" $service = $jsonData.services | where-object {$_.serviceName -ieq $testServiceName} | Select-Object -First 1 if ($null -eq $service) { throw "Can't find service $testServiceName'" } else { if ($service.Status -ieq "running") { Trace-Progress "$functionName : $testServiceName is running" $testRow.Result = [Result]::PASS $testRow.AdditionalInformation = "The service status is $($service.Status)" } else { Trace-Progress "$functionName : $testServiceName is not running" $testRow.Result = [Result]::FAIL $testRow.ReasonForFailure = "Status of $testServiceName was not running. It is $($service.Status)" $testRow.AdditionalInformation = "The service status is $($service.Status)" } } return $testRow } catch { $failureMessage = "$functionName : failed with $_" Trace-Progress $failureMessage -Error return Update-IMDSTestRowForError -TestRow $testRow -FailureMessage $failureMessage } } function Test-IMDSEndpoint { $testRow = New-IMDSTestRow -TestName "Test IMDS Endpoint" try { $functionName = $($MyInvocation.MyCommand.Name) $testRow.TestDescription = "Invoke a web request to the IDENTITY_ENDPOINT uri. Ensure we can receive a token from the response." $identityEndpoint = $env:IDENTITY_ENDPOINT if ([string]::IsNullOrEmpty($identityEndpoint)) { $testRow.Result = [Result]::FAIL $testRow.ReasonForFailure = "Environment variable for IDENTITY_ENDPOINT is null or empty." } else { $apiVersion = "2020-06-01" $resource = "https://management.azure.com/" $endpoint = "{0}?resource={1}&api-version={2}" -f $identityEndpoint,$resource,$apiVersion $endpointInformation = "The endpoint to test is $endpoint. " $testRow.AdditionalInformation = $endpointInformation Trace-Progress "$functionName : $endpointInformation. Attempting to invoke web request." $testRow = Invoke-WebRequestForIMDSEndpoint -TestRow $testRow -Endpoint $endpoint } return $testRow } catch { $failureMessage = "$functionName : failed with $_" Trace-Progress $failureMessage -Error return Update-IMDSTestRowForError -TestRow $testRow -FailureMessage $failureMessage } } function Invoke-WebRequestForIMDSEndpoint { Param( [Parameter(Mandatory=$true)] [PSCustomObject] $TestRow, [Parameter(Mandatory=$true)] [string] $Endpoint ) $functionName = $($MyInvocation.MyCommand.Name) $secretFile = "" try { Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'} -UseBasicParsing } catch { Trace-Progress "$functionName : Invoke-WebRequest failed. Attempting with authentication." $wwwAuthHeader = $_.Exception.Response.Headers["WWW-Authenticate"] if ($wwwAuthHeader -match "Basic realm=.+") { $secretFile = ($wwwAuthHeader -split "Basic realm=")[1] } else { $testRow.Result = [Result]::FAIL $testRow.ReasonForFailure = $_.Exception return $testRow } } $secret = cat -Raw $secretFile Trace-Progress "$functionName : Secret file path: $secretFile" $response = Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'; Authorization="Basic $secret"} -UseBasicParsing if ($response) { $receivedResponse = "Received response from Invoke-WebRequest." Trace-Progress "$functionName : $receivedResponse" $testRow.AdditionalInformation += $receivedResponse $token = (ConvertFrom-Json -InputObject $response.Content).access_token if (![string]::IsNullOrEmpty($token)) { $testRow.Result = [Result]::PASS } else { $testRow.Result = [Result]::FAIL $testRow.ReasonForFailure = "Response token is null or empty." } } else { $testRow.Result = [Result]::FAIL $testRow.ReasonForFailure = "No response was received." } return $testRow } Export-ModuleMember -Function Test-IMDS -Verbose:$false # SIG # Begin signature block # MIInzQYJKoZIhvcNAQcCoIInvjCCJ7oCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCt2XLGMDqdfRTF # ZK3N1JIjmaKJLm1YKzZyzEXQVUkuvKCCDYUwggYDMIID66ADAgECAhMzAAADri01 # UchTj1UdAAAAAAOuMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwODU5WhcNMjQxMTE0MTkwODU5WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQD0IPymNjfDEKg+YyE6SjDvJwKW1+pieqTjAY0CnOHZ1Nj5irGjNZPMlQ4HfxXG # yAVCZcEWE4x2sZgam872R1s0+TAelOtbqFmoW4suJHAYoTHhkznNVKpscm5fZ899 # QnReZv5WtWwbD8HAFXbPPStW2JKCqPcZ54Y6wbuWV9bKtKPImqbkMcTejTgEAj82 # 6GQc6/Th66Koka8cUIvz59e/IP04DGrh9wkq2jIFvQ8EDegw1B4KyJTIs76+hmpV # M5SwBZjRs3liOQrierkNVo11WuujB3kBf2CbPoP9MlOyyezqkMIbTRj4OHeKlamd # WaSFhwHLJRIQpfc8sLwOSIBBAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUhx/vdKmXhwc4WiWXbsf0I53h8T8w # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwMTgzNjAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # AGrJYDUS7s8o0yNprGXRXuAnRcHKxSjFmW4wclcUTYsQZkhnbMwthWM6cAYb/h2W # 5GNKtlmj/y/CThe3y/o0EH2h+jwfU/9eJ0fK1ZO/2WD0xi777qU+a7l8KjMPdwjY # 0tk9bYEGEZfYPRHy1AGPQVuZlG4i5ymJDsMrcIcqV8pxzsw/yk/O4y/nlOjHz4oV # APU0br5t9tgD8E08GSDi3I6H57Ftod9w26h0MlQiOr10Xqhr5iPLS7SlQwj8HW37 # ybqsmjQpKhmWul6xiXSNGGm36GarHy4Q1egYlxhlUnk3ZKSr3QtWIo1GGL03hT57 # xzjL25fKiZQX/q+II8nuG5M0Qmjvl6Egltr4hZ3e3FQRzRHfLoNPq3ELpxbWdH8t # Nuj0j/x9Crnfwbki8n57mJKI5JVWRWTSLmbTcDDLkTZlJLg9V1BIJwXGY3i2kR9i # 5HsADL8YlW0gMWVSlKB1eiSlK6LmFi0rVH16dde+j5T/EaQtFz6qngN7d1lvO7uk # 6rtX+MLKG4LDRsQgBTi6sIYiKntMjoYFHMPvI/OMUip5ljtLitVbkFGfagSqmbxK # 7rJMhC8wiTzHanBg1Rrbff1niBbnFbbV4UDmYumjs1FIpFCazk6AADXxoKCo5TsO # zSHqr9gHgGYQC2hMyX9MGLIpowYCURx3L7kUiGbOiMwaMIIHejCCBWKgAwIBAgIK # 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/Xmfwb1tbWrJUnMTDXpQzTGCGZ4wghmaAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAOuLTVRyFOPVR0AAAAA # A64wDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIJEu # HAbZ6eUOqGj3S5Q211dR3DQPTxzYN9woAU1fxRR+MEIGCisGAQQBgjcCAQwxNDAy # oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20wDQYJKoZIhvcNAQEBBQAEggEAUZFLgIh9koaR9QawqwY+Z02qPK3XX5iHVCnK # /j+8QoxxOB09SoBc2WUW5W/42VG6UWIjMY+udXwlgXFjmJxfOhXGJ5qS8ioKlTG+ # 3kb0uvzc5Es/vQqnUicHH1P6nYLoGaOad9Bqo03U/e69VWZV83ED32MyE71ZUS9p # 0VzNa5rvAx0zpNxdmznlTtmkPean0UV8d+OcM+3kXxVaVYuHB3hwAaLHtntn0gRn # ZpIyEUFUlFAMBhgX1ZZBA0L9FKDIeZ2J4OnMnepPEu2G8WiJS7XPLgiMy5B8R++R # uyaamy9U7dUwetekIy6XZn4jqx7+au/hXTcYHbzkH3kJLqY7laGCFygwghckBgor # BgEEAYI3AwMBMYIXFDCCFxAGCSqGSIb3DQEHAqCCFwEwghb9AgEDMQ8wDQYJYIZI # AWUDBAIBBQAwggFYBgsqhkiG9w0BCRABBKCCAUcEggFDMIIBPwIBAQYKKwYBBAGE # WQoDATAxMA0GCWCGSAFlAwQCAQUABCB4Wx4XRaY3HPqsiyuKEDtT9E4UWF6C0VRZ # wUEpXgWyFgIGZdY1c94OGBIyMDI0MDMxMTE4MTg0Mi45NVowBIACAfSggdikgdUw # gdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsT # JE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMd # VGhhbGVzIFRTUyBFU046RkM0MS00QkQ0LUQyMjAxJTAjBgNVBAMTHE1pY3Jvc29m # dCBUaW1lLVN0YW1wIFNlcnZpY2WgghF4MIIHJzCCBQ+gAwIBAgITMwAAAeKZmZXx # 3OMg6wABAAAB4jANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ # Q0EgMjAxMDAeFw0yMzEwMTIxOTA3MjVaFw0yNTAxMTAxOTA3MjVaMIHSMQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3Nv # ZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBU # U1MgRVNOOkZDNDEtNEJENC1EMjIwMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T # dGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtWO1 # mFX6QWZvxwpCmDabOKwOVEj3vwZvZqYa9sCYJ3TglUZ5N79AbMzwptCswOiXsMLu # NLTcmRys+xaL1alXCwhyRFDwCRfWJ0Eb0eHIKykBq9+6/PnmSGXtus9DHsf31Qlu # wTfAyamYlqw9amAXTnNmW+lZANQsNwhjKXmVcjgdVnk3oxLFY7zPBaviv3GQyZRe # zsgLEMmvlrf1JJ48AlEjLOdohzRbNnowVxNHMss3I8ETgqtW/UsV33oU3EDPCd61 # J4+DzwSZF7OvZPcdMUSWd4lfJBh3phDt4IhzvKWVahjTcISD2CGiun2pQpwFR8Vx # LhcSV/cZIRGeXMmwruz9kY9Th1odPaNYahiFrZAI6aSCM6YEUKpAUXAWaw+tmPh5 # CzNjGrhzgeo+dS7iFPhqqm9Rneog5dt3JTjak0v3dyfSs9NOV45Sw5BuC+VF22EU # IF6nF9vqduynd9xlo8F9Nu1dVryctC4wIGrJ+x5u6qdvCP6UdB+oqmK+nJ3soJYA # KiPvxdTBirLUfJidK1OZ7hP28rq7Y78pOF9E54keJKDjjKYWP7fghwUSE+iBoq80 # 2xNWbhBuqmELKSevAHKqisEIsfpuWVG0kwnCa7sZF1NCwjHYcwqqmES2lKbXPe58 # BJ0+uA+GxAhEWQdka6KEvUmOPgu7cJsCaFrSU6sCAwEAAaOCAUkwggFFMB0GA1Ud # DgQWBBREhA4R2r7tB2yWm0mIJE2leAnaBTAfBgNVHSMEGDAWgBSfpxVdAF5iXYP0 # 5dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIw # MjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUt # U3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB # /wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOC # AgEA5FREMatVFNue6V+yDZxOzLKHthe+FVTs1kyQhMBBiwUQ9WC9K+ILKWvlqneR # rvpjPS3/qXG5zMjrDu1eryfhbFRSByPnACGc2iuGcPyWNiptyTft+CBgrf7ATAuE # /U8YLm29crTFiiZTWdT6Vc7L1lGdKEj8dl0WvDayuC2xtajD04y4ANLmWDuiStdr # Z1oI4afG5oPUg77rkTuq/Y7RbSwaPsBZ06M12l7E+uykvYoRw4x4lWaST87SBqeE # XPMcCdaO01ad5TXVZDoHG/w6k3V9j3DNCiLJyC844kz3eh3nkQZ5fF8Xxuh8tWVQ # TfMiKShJ537yzrU0M/7H1EzJrabAr9izXF28OVlMed0gqyx+a7e+79r4EV/a4ijJ # xVO8FCm/92tEkPrx6jjTWaQJEWSbL/4GZCVGvHatqmoC7mTQ16/6JR0FQqZf+I5o # pnvm+5CDuEKIEDnEiblkhcNKVfjvDAVqvf8GBPCe0yr2trpBEB5L+j+5haSa+q8T # wCrfxCYqBOIGdZJL+5U9xocTICufIWHkb6p4IaYvjgx8ScUSHFzexo+ZeF7oyFKA # IgYlRkMDvffqdAPx+fjLrnfgt6X4u5PkXlsW3SYvB34fkbEbM5tmab9zekRa0e/W # 6Dt1L8N+tx3WyfYTiCThbUvWN1EFsr3HCQybBj4Idl4xK8EwggdxMIIFWaADAgEC # AhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg # Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVa # Fw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7V # gtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeF # RiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3X # D9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoP # z130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+ # tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5Jas # AUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/b # fV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuv # XsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg # 8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzF # a/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqP # nhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEw # IwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSf # pxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBB # MD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0Rv # Y3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGC # NxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w # HwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmg # R4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWlj # Um9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEF # BQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29D # ZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEs # H2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHk # wo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinL # btg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCg # vxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsId # w2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2 # zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23K # jgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beu # yOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/ # tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjm # jJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBj # U02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIC1DCCAj0CAQEwggEAoYHYpIHVMIHS # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN # aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRo # YWxlcyBUU1MgRVNOOkZDNDEtNEJENC1EMjIwMSUwIwYDVQQDExxNaWNyb3NvZnQg # VGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQAWm5lp+nRuekl0iF+I # HV3ylOiGb6CBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0G # CSqGSIb3DQEBBQUAAgUA6Zm/NzAiGA8yMDI0MDMxMjAxMzQ0N1oYDzIwMjQwMzEz # MDEzNDQ3WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDpmb83AgEAMAcCAQACAgpp # MAcCAQACAh/yMAoCBQDpmxC3AgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQB # hFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQADgYEA # SOwJpsYIfGizeKkohPc1Z/m9sVh8Mu8ZxBJnnPdD8SWj/4QP5h0blYT14CDepOsU # 9wsPwVL8T0DUMt0M8qjmKb/GyE3mnH0ATVmXjQIyj6O+pw0L2/IjgameyBfCtXPm # Ud/rQMAjCzCtHZmPHEJFCOfYLxz6upxwJVDhf9DMtLIxggQNMIIECQIBATCBkzB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAeKZmZXx3OMg6wABAAAB # 4jANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE # MC8GCSqGSIb3DQEJBDEiBCCD3uM+TbIWdmqj6lSbqqplYUaGZRZvM8JlNohwf76J # czCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EICuJKkoQ/Sa4xsFQRM4Ogvh3 # ktToj9uO5whmQ4kIj3//MIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTACEzMAAAHimZmV8dzjIOsAAQAAAeIwIgQgshpYvBW4OGJSYiOs08n/cAx2 # Uny3FIqzhE5x3Nt6MtAwDQYJKoZIhvcNAQELBQAEggIAiNcvwp4KUwnJJC5bm5ID # Y/nWjBmBfOusYG8E08EfgIvZQ+hRy6gekhNogxBlDM0RWSs97kwuHsz8H6aRFqf6 # XHyxcTdYNLrnk6NTNYIX4sea273TITL4fMB+4/CliL1Tlwoh4iYnXTBfm+lyHrHm # SZBNL68OB+RRXJIOlj4TNPgLJy3LCKRyHzB1cdDWWZStUh22B0o2lrQw4+d5WIsu # /9MP7Mtc70ozPXTxwTx/DATh6iYcSZlAM4sUSFHjGWczXB74tie/rQVXowAhv2Ew # 9RrEMCHp4hrtJh7LxzxYhoWl+uuqgj4oI2seZhyiOte1/IfoHwdBkfNDgSsVG2GP # FByaHQ3vYhEJeYzuSYJ43twZf8t3XWLSkdKe5r36+VLewp7QncHEhN8Xj9RzfsQ7 # Tji3HiTaXnnd7k9eCM/WbshYP2HWrj5qkghpxPWwn1/u+3xrgGYiLOcgszIlUeGq # ugc38rHuMfwcVHcEuC/vwRogEYnDAADZh/Vjzc/J9WOeXoFlDmU/42nPjTCdpztx # t0rFZR4TfRiZFU3PhpWCmrFzmVVXiCQbL2c75xuwYjSn5ThrqNRN8aEG2+zSGu7I # ZNEIGMAXRu17pqqo2kZYYs2Jlqo9zcqx5qKhWJbzZH4ZtKo+ufw+sU1ypeCa3Or4 # nGhz/yH5XxjxNWJOdvI4sAw= # SIG # End signature block |