MsrcSecurityUpdates.tests.ps1
# Import module would only work if the module is found in standard locations # Import-Module -Name MsrcSecurityUpdates -Force Import-Module (Join-Path -Path $PSScriptRoot -ChildPath 'MsrcSecurityUpdates.psd1') -Verbose -Force # Set-MSRCApiKey -ApiKey "API KEY PLACEHOLDER" -Verbose if (-not ($global:MSRCApiKey)) { Write-Warning -Message 'You need to use Set-MSRCApiKey first to set your API Key' break } <# Get-Help Get-MsrcSecurityUpdate Get-Help Get-MsrcSecurityUpdate -Examples Get-Help Get-MsrcCvrfDocument Get-Help Get-MsrcCvrfDocument -Examples Get-Help Get-MsrcSecurityBulletinHtml Get-Help Get-MsrcSecurityBulletinHtml -Examples Get-Help Get-MsrcCvrfAffectedSoftware Get-Help Get-MsrcCvrfAffectedSoftware -Examples #> Describe 'Function: Get-MsrcSecurityUpdateMSRC (calls the /Updates API)' { It 'Get-MsrcSecurityUpdate - all' { Get-MsrcSecurityUpdate | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by year' { Get-MsrcSecurityUpdate -Year 2017 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by vulnerability' { Get-MsrcSecurityUpdate -Vulnerability CVE-2017-0003 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by cvrf' { Get-MsrcSecurityUpdate -Cvrf 2017-Jan | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by date - before' { Get-MsrcSecurityUpdate -Before 2018-01-01 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by date - after' { Get-MsrcSecurityUpdate -After 2017-01-01 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by date - before and after' { Get-MsrcSecurityUpdate -Before 2018-01-01 -After 2017-10-01 | Should Not BeNullOrEmpty } } Describe 'Function: Get-MsrcCvrfDocument (calls the MSRC /cvrf API)' { It 'Get-MsrcCvrfDocument - 2016-Nov' { Get-MsrcCvrfDocument -ID 2016-Nov | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfDocument - 2016-Nov - as XML' { Get-MsrcCvrfDocument -ID 2016-Nov -AsXml | Should Not BeNullOrEmpty } Get-MsrcSecurityUpdate | Where-Object { $_.ID -ne '2017-May-B' } | Foreach-Object { It "Get-MsrcCvrfDocument - none shall throw: $($PSItem.ID)" { { Get-MsrcCvrfDocument -ID $PSItem.ID | Out-Null } | Should Not Throw } } It 'Get-MsrcCvrfDocument for 2017-May-B with Get-MsrcCvrfDocument should throw' { { Get-MsrcSecurityUpdate | Where { $_.ID -eq '2017-May-B' } | Foreach-Object { $null = Get-MsrcCvrfDocument -ID $PSItem.ID } } | Should Throw } } Describe 'Function: Set-MSRCApiKey with proxy' { if (-not ($global:msrcProxy)) { Write-Warning -Message 'This test requires you to use Set-MSRCApiKey first to set your API Key and proxy details' break } It 'Get-MsrcSecurityUpdate - all' { Get-MsrcSecurityUpdate | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfDocument - 2016-Nov' { Get-MsrcCvrfDocument -ID 2016-Nov | Should Not BeNullOrEmpty } } # May still work but not ready yet... # Describe 'Function: Get-MsrcSecurityBulletinHtml (generates the MSRC Security Bulletin HTML Report)' { # It 'Security Bulletin Report' { # Get-MsrcCvrfDocument -ID 2016-Nov | # Get-MsrcSecurityBulletinHtml | # Should Not BeNullOrEmpty # } # } InModuleScope MsrcSecurityUpdates { Describe 'Function: Get-MsrcCvrfAffectedSoftware' { It 'Get-MsrcCvrfAffectedSoftware by pipeline' { Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcCvrfAffectedSoftware | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfAffectedSoftware by parameters' { $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov Get-MsrcCvrfAffectedSoftware -Vulnerability $cvrfDocument.Vulnerability -ProductTree $cvrfDocument.ProductTree | Should Not BeNullOrEmpty } } Describe 'Function: Get-MsrcCvrfProductVulnerability' { It 'Get-MsrcCvrfProductVulnerability by pipeline' { Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcCvrfProductVulnerability | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfProductVulnerability by parameters' { $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov Get-MsrcCvrfProductVulnerability -Vulnerability $cvrfDocument.Vulnerability -ProductTree $cvrfDocument.ProductTree -DocumentTracking $cvrfDocument.DocumentTracking -DocumentTitle $cvrfDocument.DocumentTitle | Should Not BeNullOrEmpty } } } Describe 'Function: Get-MsrcVulnerabilityReportHtml (generates the MSRC Vulnerability Summary HTML Report)' { It 'Vulnerability Summary Report - does not throw' { { Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcVulnerabilityReportHtml -Verbose | Out-Null } | Should Not Throw } Get-MsrcSecurityUpdate | Where-Object { $_.ID -ne '2017-May-B' } | Foreach-Object { It "Vulnerability Summary Report - none shall throw: $($PSItem.ID)" { { Get-MsrcCvrfDocument -ID $PSItem.ID | Get-MsrcVulnerabilityReportHtml | Out-Null } | Should Not Throw } } } InModuleScope MsrcSecurityUpdates { Describe 'Function: Get-KBDownloadUrl (generates the html for KBArticle downloads used in the vulnerability report affected software table)' { It 'Get-KBDownloadUrl by pipeline' { { $doc = Get-MsrcCvrfDocument -ID 2017-May $af = $doc | Get-MsrcCvrfAffectedSoftware $af.KBArticle | Get-KBDownloadUrl } | Should Not Throw } It 'Get-KBDownloadUrl by parameters' { { $doc = Get-MsrcCvrfDocument -ID 2017-May $af = $doc | Get-MsrcCvrfAffectedSoftware Get-KBDownloadUrl -KBArticleObject $af.KBArticle } | Should Not Throw } } } #When a pester test fails, it writes out to stdout, and sets an error in $Error. When invoking powershell from C# it is a lot easier to read the stderr stream. if($Error) { Write-Error 'A pester test has failed during the validation process' } # SIG # Begin signature block # MIIdkgYJKoZIhvcNAQcCoIIdgzCCHX8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUdZKTKUBs8CNop3nvPJZfmhCr # O46gghhuMIIE2jCCA8KgAwIBAgITMwAAAURTDiT8Y/hFcgAAAAABRDANBgkqhkiG # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTkxMTEzMjE0MjE0 # WhcNMjEwMjExMjE0MjE0WjCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEm # MCQGA1UECxMdVGhhbGVzIFRTUyBFU046RDZCRC1FM0U3LTE2ODUxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQCX9qAKR2/97l55v/wNjysGYFC7FVEfSLQKxrceyf1iCqki # SZqFnvAPMYJI5stYKoGrMIO3nMXKrNn/gucXGB+qAUz/d8Iy6yZ+K+g51zq4h3eq # qpFgmKNMHGU6weQyAuRXNZdsSB8UHHRnXncG8dPYa19PJ4PNh4LQ5CC+OE1+JUby # +waBNEtVXJMWcsGjnBg3obw+L/hiBkDmYRpIii1OwU58A/cep8tL2Y+EQBIQCuaV # CqbZJRdEkOIBlFmy1BIyq7qxbCNKvLhUGQwWML/N8uNdNmY0mntNBQ7yYCT2Ibt7 # UcpAsS4Ymj0dEbUah+HQqAso1JJ6AU69w9Z+MnV/AgMBAAGjggEJMIIBBTAdBgNV # HQ4EFgQUfBtlSrKqwcIHZZHvtBkJdnqL1dEwHwYDVR0jBBgwFoAUIzT42VJGcArt # QPt2+7MrsMM1sw8wVAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybC5taWNyb3Nv # ZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljcm9zb2Z0VGltZVN0YW1wUENBLmNy # bDBYBggrBgEFBQcBAQRMMEowSAYIKwYBBQUHMAKGPGh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0VGltZVN0YW1wUENBLmNydDATBgNV # HSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQUFAAOCAQEAJuj7BcmsFBEcJq8y # nvAzamXJXGAt1BhAtkFiV5bPeLTSv2MbH8QWhJ0JvnsKtEqU3oRjZMrRQNXlVW5n # y4CdCAvTxgv5zrrv6PFTSLo2dAe0I8Qy2aQWXuUD5qtBJUACtZRzfufMemRKyqgh # H9WVIJlk3WnT7hg6AnjZmZq8wdhrd49AXkXo9MHG22Hz5Hh76RBQRGg3ik66Ymut # lH5ehd1LDZoEN4SM3XVVfmrfBYY36yFpHhCfM74+Sp3dbIJK/5dKxSBoeeVRLhcZ # evkTC6WZTPBOInyyoK4leoHsI+N5N0VZ04C8vaf+GixZqESB2GiEzKBCB9o6/2mD # TMW0ADCCBgMwggProAMCAQICEzMAAAGIr1LWuZJt6PkAAAAAAYgwDQYJKoZIhvcN # AQELBQAwfjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYG # A1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMTAeFw0yMDAzMDQx # ODM5NDhaFw0yMTAzMDMxODM5NDhaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xHjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIw # DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJII2vIT4J7DLabi39rvjBnsL1hP # C/U/ILgG8z+RJY82zyfRFN74W9h9T4T25/S3udiUDMeMr6mWJ/YGEP42B2EhRDyx # XBY7f22O9BEeM/b/+9K8h+aaRGgwvUiGeOz2RCJlDNhENhhGn3FJBiZHBCOTmGXz # 9TtGA6JAOK1UdpTsFPUwj3aV9lG4ggMNgF29e1tyVgkxU7Cpm2/Q73NAKt63pH59 # FIZoM18QSlwgsv4PtFXczi5okThNrooA529X4xVomnVhcVNk8q2mMc7p32kdA9mI # bs10LpBudEaaxrjy41CtvoB+YsoMjUunfVYyiBNpfm1l/4JlP09K6+M4Is0CAwEA # AaOCAYIwggF+MB8GA1UdJQQYMBYGCisGAQQBgjdMCAEGCCsGAQUFBwMDMB0GA1Ud # DgQWBBSP1Ekv3M2s9wvXRFl0xAhdk3swbzBUBgNVHREETTBLpEkwRzEtMCsGA1UE # CxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMRYwFAYDVQQF # Ew0yMzAwMTIrNDU4Mzg2MB8GA1UdIwQYMBaAFEhuZOVQBdOCqhc3NyK1bajKdQKV # MFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv # cHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcmwwYQYIKwYBBQUH # AQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcnQwDAYDVR0T # AQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAKdejyGOnsV5P4fqJCVXcJwaeRJsW # 8ikphp+DNgIWjdQdjVUdglVvmMcQ7ygbbpCoEQuZqToxMj6trdYoxMaETWwQiWjB # NynggCzxrnCkKHpV/hn9sC0imk/eneBeTZfxRdNz5bGNBiwOQWJLOj84FrmGR1bW # DgSk7jeX2aNOgF2oQ+0hexnseLX/rLiArQ+YyLAbwsylKfSf+hIcaOtQ0GAck/GC # zrdKV/nxAYHOe5eJFpeZ9NQN2u+FGhx3EgyLyddDBYAIyJDMlJHME/lLbBSrucwC # qNpNt5eEmoPZIVUd1RiUqu6+09LBuepJFZMYjyzgURe35MvfDkmfBVmZmRQWiKhA # MwyMXJoq6t0nqmfNuvWHpBbRH3t9ZzzEQjMsg6JTauPBYC2VCoU7wo2LKSNgbIR/ # kvIAkoA76sl31+xhH5UFq4gRChiaOdRtNcxJjYt/koyW5aUM4ZWHyrpeOYFxylpP # 7y0J/GlpVg+LWdyfBPBo9C9WrxGNYNEHs9ryu4eCPYckWLr36FyruZbHmdNS3PMV # rtFJl8TlrVrkC4GYY1Gvt/xw19rTX62JaNUqTVr6AlQFI/SwjF5wVtVJdNntup5q # XjldIMiKxkGRZv7zdNtd1MYwNJQUpMB20L6vfkZ+w3xBXLn0dvlljMBdzOGBGaTs # 3ITqMPRiblMqJbkwggYHMIID76ADAgECAgphFmg0AAAAAAAcMA0GCSqGSIb3DQEB # BQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNy # b3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv # cml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMxMzAzMDlaMHcxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBU # aW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ+h # bLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn0UytdDAgEesH1VSVFUmUG0KS # rphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0Zxws/HvniB3q506jocEjU8qN # +kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4nrIZPVVIM5AMs+2qQkDBuh/NZ # MJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YRJylmqJfk0waBSqL5hKcRRxQJ # gp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54QTF3zJvfO4OToWECtR0Nsfz3 # m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8GA1UdEwEB/wQFMAMBAf8wHQYD # VR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsGA1UdDwQEAwIBhjAQBgkrBgEE # AYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJgQFYnl+UlE/wq4QpTlVnkpKFj # pGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jv # c29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9y # aXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9j # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3Rj # ZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MBMG # A1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBBQUAA4ICAQAQl4rDXANENt3p # tK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1iuFcCy04gE1CZ3XpA4le7r1ia # HOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+rkuTnjWrVgMHmlPIGL4UD6ZEq # JCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGctxVEO6mJcPxaYiyA/4gcaMvnM # MUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/FNSteo7/rvH0LQnvUU3Ih7jDK # u3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbonXCUbKw5TNT2eb+qGHpiKe+i # myk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0NbhOxXEjEiZ2CzxSjHFaRkMU # vLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPpK+m79EjMLNTYMoBMJipIJF9a # 6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2JoXZhtG6hE6a/qkfwEm/9ijJs # sv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0eFQF1EEuUKyUsKV4q7OglnUa # 2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng9wFlb4kLfchpyOZu6qeXzjEp # /w7FW1zYTRuh2Povnj8uVRZryROj/TCCB3owggVioAMCAQICCmEOkNIAAAAAAAMw # DQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv # cml0eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcwODIxMDkwOVowfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCquAY4GgRJun/D # DB7dN2vGEtgL8DjCmQawyDnVARQxQtOJDXlkh36UYCRsr55JnOloXtLfm1OyCizD # r9mpK656Ca/XllnKYBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPLbfM6XKEW # 9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5pUkp5w2+oBN3vpQ97/vjK1oQH01W # KKJ6cuASOrdJXtjt7UORg9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3Pv4y # 07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwPrRkjhMv0ugOGjfdf8NBSv4yU # h7zAIXQlXxgotswnKDglmDlKNs98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLE # tVc/JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9G9RVS+c5oQ/pI0m8GLhE # fEXkwcNyeuBy5yTfv0aZxe/CHFfbg43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L # 50kppxMopqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9AN0/B4YVEicQJTMXU # pUMvdJX3bvh4IFgsE11glZo+TzOE2rCIF96eTvSWsLxGoGyY0uDWiIwLAgMBAAGj # ggHtMIIB6TAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k5VAF04KqFzc3 # IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG # MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEj # iTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br # aS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBe # BggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCB # nwYDVR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYIKwYBBQUHAgEWM2h0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBA # BggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABpAGMAeQBfAHMAdABh # AHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPY # dGcimwuWEeFjkplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79HqaPzadtjvyI1 # pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS0LD9a+M+By4pm+Y9G6XUtR13lDni6WTJ # RD14eiPzE32mkHSDjfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWEljHwlpblqY # luSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMOr5kol5hNDj0L8giJ1h/DMhji8MUt # zluetEk5CsYKwsatruWy2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+nt3TD # QAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVAKmWjw11SYobDHWM2l4bf2vP4 # 8hahmifhzaWX0O5dY0HjWwechz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv # 7Jf2oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3HjXG0qKin3p6IvpIlR+r # +0cjgPWe+L9rt0uX4ut1eBrs6jeZeRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO # 3991bWORPdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYibV3FWTkhFwELJm3Zb # CoBIa/15n8G9bW1qyVJzEw16UM0xggSOMIIEigIBATCBlTB+MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29k # ZSBTaWduaW5nIFBDQSAyMDExAhMzAAABiK9S1rmSbej5AAAAAAGIMAkGBSsOAwIa # BQCggaIwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFJkAbzloA39uf8o/AnzVEHpd # pyMkMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBho # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAVb4fALWW # mf6hF94mTwz5JUhztaUJjRB6UYtKTvcYYn/BVTbn6nMAce4iuLssfNcMD1IpYFSb # 0Zg+aORwrDxS2H9bD9ZF6KJYa/9ku34VgZuUfqUuRCch2WGqKY1wr/FSUZjLCATI # obhXHrYpM1G2/KQqq/OMe2ha9Cga63W5BS0GMa3O7KnzUfan/+PuLqxYq3ssebNe # 3HpuYYtQyRy+bewGWT6Lk5d8lY+VBpuDkjFl2TTUW7y4VzvSOLG7uKIoRtuM4GMQ # Tk9MT+H1J9Wartn4+f4ZFQyW6PNfPviROFJfu04X3O2dSZZVqAKlWvehDjRQatKG # Npyj/c9WrDBhPKGCAigwggIkBgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB3MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNy # b3NvZnQgVGltZS1TdGFtcCBQQ0ECEzMAAAFEUw4k/GP4RXIAAAAAAUQwCQYFKw4D # AhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8X # DTIwMTEwMzE3NDUxNlowIwYJKoZIhvcNAQkEMRYEFOvO2Qvu2D/egOky++B4BeAc # 6SGXMA0GCSqGSIb3DQEBBQUABIIBAJb6wsJJkOd5eonnviGq1L7rG7mjIvQcVV9i # l91nSZyPcDH/OYNnFPQQOLH4eEnUfVEX7PapvuLjpld0qvJK6bvdtBCfJyt9R9rP # eGAIdvgo33GxkrCjJjHF8dzlW4MJ9YBjSrHTuiSQILqGh7iGvbq0ihkz1O1LwT/m # MP8K5hVWjCe+13mAjoKYRYNsH9Gr0gq3TfWyhGRcYGToZhd5UuVPHbt1hpPMBFbu # eSqvgXwEnWPYUNKwCX5ilMV/FVcuWqxiXzDoygkYV7sGveKGYzkTWIrwPA+bZdBm # kYWTOKg14ULyerRTuwlM2BCfke8MxqFjv9wcrw5DA60i6FXSEh4= # SIG # End signature block |