Set-StrictMode -Version Latest InModuleScope Pester { Describe 'Get-PesterResult' { } Describe 'It - Implementation' { $testState = New-PesterState -Path $TestDrive It 'Throws an error if It is called outside of Describe' { $scriptBlock = { ItImpl -Pester $testState 'Tries to enter a test without entering a Describe first' { } } $scriptBlock | Should Throw 'The It command may only be used inside a Describe block.' } $testState.EnterDescribe('Mocked Describe') # We call EnterTest() directly here because if we actually nest calls to ItImpl, the outer call will catch the error we're trying to # verify with Should Throw. (Another option would be to nest the ItImpl calls, and look for a failed test result in $testState.) $testState.EnterTest('Outer Test') It 'Throws an error if you try to enter It from inside another It' { $scriptBlock = { ItImpl -Pester $testState 'Enters the second It' { } } $scriptBlock | Should Throw 'You already are in It, you cannot enter It twice' } $testState.LeaveTest() It 'Throws an error if you fail to pass in a test block' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' } $scriptBlock | Should Throw 'No test script block is provided. (Have you put the open curly brace on the next line?)' } It 'Does not throw an error if It is called inside a Describe, and adds a successful test result.' { $scriptBlock = { ItImpl -Pester $testState 'Enters an It block inside a Describe' { } } $scriptBlock | Should Not Throw $testState.TestResult[-1].Passed | Should Be $true $testState.TestResult[-1].ParameterizedSuiteName | Should BeNullOrEmpty } It 'Does not throw an error if the -Pending switch is used, and no script block is passed' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' -Pending } $scriptBlock | Should Not Throw } It 'Does not throw an error if the -Skip switch is used, and no script block is passed' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' -Skip } $scriptBlock | Should Not Throw } It 'Does not throw an error if the -Ignore switch is used, and no script block is passed' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' -Ignore } $scriptBlock | Should Not Throw } It 'Creates a pending test for an empty (whitespace and comments only) script block' { $scriptBlock = { # Single-Line comment <# Multi- Line- Comment #> } { ItImpl -Pester $testState 'Some Name' $scriptBlock } | Should Not Throw $testState.TestResult[-1].Result | Should Be 'Pending' } It 'Adds a failed test if the script block throws an exception' { $scriptBlock = { ItImpl -Pester $testState 'Enters an It block inside a Describe' { throw 'I am a failed test' } } $scriptBlock | Should Not Throw $testState.TestResult[-1].Passed | Should Be $false $testState.TestResult[-1].ParameterizedSuiteName | Should BeNullOrEmpty $testState.TestResult[-1].FailureMessage | Should Be 'I am a failed test' } $script:counterNameThatIsReallyUnlikelyToConflictWithAnything = 0 It 'Calls the output script block for each test' { $outputBlock = { $script:counterNameThatIsReallyUnlikelyToConflictWithAnything++ } ItImpl -Pester $testState 'Does something' -OutputScriptBlock $outputBlock { } ItImpl -Pester $testState 'Does something' -OutputScriptBlock $outputBlock { } ItImpl -Pester $testState 'Does something' -OutputScriptBlock $outputBlock { } $script:counterNameThatIsReallyUnlikelyToConflictWithAnything | Should Be 3 } Remove-Variable -Scope Script -Name counterNameThatIsReallyUnlikelyToConflictWithAnything Context 'Parameterized Tests' { # be careful about variable naming here; with InModuleScope Pester, we can create the same types of bugs that the v3 # scope isolation fixed for everyone else. (Naming this variable $testCases gets hidden later by parameters of the # same name in It.) $cases = @( @{ a = 1; b = 1; expectedResult = 2} @{ a = 1; b = 2; expectedResult = 3} @{ a = 5; b = 4; expectedResult = 9} @{ a = 1; b = 1; expectedResult = 'Intentionally failed' } ) $suiteName = 'Adds and to get . is not a parameter.' ItImpl -Pester $testState -Name $suiteName -TestCases $cases { param ($a, $b, $expectedResult) ($a + $b) | Should Be $expectedResult } It 'Creates test result records with the ParameterizedSuiteName property set' { for ($i = -1; $i -ge -4; $i--) { $testState.TestResult[$i].ParameterizedSuiteName | Should Be $suiteName } } It 'Expands parameters in parameterized test suite names' { for ($i = -1; $i -ge -4; $i--) { $expectedName = "Adds $($cases[$i]['a']) and $($cases[$i]['b']) to get $($cases[$i]['expectedResult']). is not a parameter." $testState.TestResult[$i].Name | Should Be $expectedName } } It 'Logs the proper successes and failures' { $testState.TestResult[-1].Passed | Should Be $false for ($i = -2; $i -ge -4; $i--) { $testState.TestResult[$i].Passed | Should Be $true } } } } Describe 'Get-OrderedParameterDictionary' { $_testScriptBlock = { param ( $1, $c, $0, $z, $a, ${Something.Really/Weird } ) } $hashtable = @{ '1' = 'One' '0' = 'Zero' z = 'Z' a = 'A' c = 'C' 'Something.Really/Weird ' = 'Weird' } $dictionary = Get-OrderedParameterDictionary -ScriptBlock $_testScriptBlock -Dictionary $hashtable It 'Reports keys and values in the same order as the param block' { ($dictionary.Keys -join ',') | Should Be '1,c,0,z,a,Something.Really/Weird ' ($dictionary.Values -join ',') | Should Be 'One,C,Zero,Z,A,Weird' } } Describe 'Remove-Comments' { It 'Removes single line comments' { Remove-Comments -Text 'code #comment' | Should Be 'code ' } It 'Removes multi line comments' { Remove-Comments -Text 'code <#comment comment#> code' | Should Be 'code code' } } } $thisScriptRegex = [regex]::Escape($MyInvocation.MyCommand.Path) Describe 'Get-PesterResult' { $getPesterResult = InModuleScope Pester { ${function:Get-PesterResult} } Context 'failed tests in Tests file' { #the $script scriptblock below is used as a position marker to determine #on which line the test failed. $errorRecord = $null try{'something' | should be 'nothing'}catch{ $errorRecord=$_} ; $script={} $result = & $getPesterResult 0 $errorRecord It 'records the correct stack line number' { $result.Stacktrace | should match "at line: $($script.startPosition.StartLine) in $thisScriptRegex" } It 'records the correct error record' { $result.ErrorRecord -is [System.Management.Automation.ErrorRecord] | Should be $true $result.ErrorRecord.Exception.Message | Should match 'Expected: {nothing}' } } It 'Does not modify the error message from the original exception' { $object = New-Object psobject $message = 'I am an error.' Add-Member -InputObject $object -MemberType ScriptMethod -Name ThrowSomething -Value { throw $message } $errorRecord = $null try { $object.ThrowSomething() } catch { $errorRecord = $_ } $pesterResult = & $getPesterResult 0 $errorRecord $pesterResult.FailureMessage | Should Be $errorRecord.Exception.Message } Context 'failed tests in another file' { $errorRecord = $null $testPath = Join-Path $TestDrive test.ps1 $escapedTestPath = [regex]::Escape($testPath) Set-Content -Path $testPath -Value "`r`n'One' | Should Be 'Two'" try { & $testPath } catch { $errorRecord = $_ } $result = & $getPesterResult 0 $errorRecord It 'records the correct stack line number' { $result.Stacktrace | should match "at line: 2 in $escapedTestPath" } It 'records the correct error record' { $result.ErrorRecord -is [System.Management.Automation.ErrorRecord] | Should be $true $result.ErrorRecord.Exception.Message | Should match 'Expected: {Two}' } } } # SIG # Begin signature block # MIInZwYJKoZIhvcNAQcCoIInWDCCJ1QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCT7hodUcKmASqq # 77kpXQ+Mw6bkME7fkMjDJzx4xtoeSqCCC7QwggXLMIIEs6ADAgECAhMzAAABQGf2 # mGsxCLhyAAAAAAFAMA0GCSqGSIb3DQEBCwUAMIGOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU # aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMjAeFw0yNTExMTMxOTU5NDNaFw0y # NjExMTAxOTU5NDNaMIGEMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS4wLAYDVQQDEyVNaWNyb3NvZnQgV2luZG93cyAzcmQgcGFydHkgQ29tcG9u # ZW50MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEArGt4Hrjs3D7+IIab # GkPGtg4XeWQFi8nKsdeF+N6nkYF9wsmw0qPk4OovEiJnCSRiEtLfYy3Icn4iOp7L # 24oCa0zlgYCND3OnNfYOuVpMsq3CSkXYg3H+VMiB11hOLcctTu4RWy4ZRKsL5NVI # AduJFgd/1Qs2mQpUuOyFfLKhu/+Z+T2c9YALxsfnPvqn8Tn8Tt8wdZuFwz7kK3jl # e2T3YBofybAR2aH678TnOxhLe2/hEpTdKaVfcqyrIX0Mw/LwqEJnj4G8amBbQ7OG # RnKm1VNd4nMpRt1SflNlVo1Q3Qqnj9K6mSPw99YGMCTaVr6jKPylsWyW4nsvu8m0 # MbBJJiLOi0sOTHtwQEVcBH6WM7xbODqwPaklS1wDbED1wfzImIUR8WsXJVjDm7Fg # x4JDo8oLIjKFrEvzBfrYWsvlDg8p9XgR7EB/IJwXGuJbFzo/S+r3D5DkUZXX/72k # XA4FeRJAgLePAuGChPvyQiLtKJeJm9ftJeukrIcs7JpJVHObAgMBAAGjggGoMIIB # pDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUB9FDBUZ0W11vsv6qqb9t # vKspCIowRQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEWMBQGA1UEBRMNMjMwODA5KzUwNjIyOTAfBgNVHSMEGDAWgBRhcaeHr/9p # 1SF2T1KTKAC+eRKrhDB0BgNVHR8EbTBrMGmgZ6BlhmNodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBXaW5kb3dzJTIwVGhpcmQl # MjBQYXJ0eSUyMENvbXBvbmVudCUyMENBJTIwMjAxMi5jcmwwgYEGCCsGAQUFBwEB # BHUwczBxBggrBgEFBQcwAoZlaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jZXJ0cy9NaWNyb3NvZnQlMjBXaW5kb3dzJTIwVGhpcmQlMjBQYXJ0eSUyMENv # bXBvbmVudCUyMENBJTIwMjAxMi5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0B # AQsFAAOCAQEAmFzJPKhkAXPOcfy9S4q1nP3XCvmABVGv/VRzFZ1e+oVtVzOFkbZ6 # osY1OpZqa9CEvtgcrtciv1y9mV1SpxAMwfEqq+Nhw2GdZ3IWqFzWFsEe2S9U196s # XRIRIxglZMBWyzdy8rQ+P7L2+LciW4qcaw2wtv6YoI0q1isgk0t1OF5kEL0t9hhx # UrBavTdoqZ3b5JtwDqzmIsxuLtGbE9Pqbz2gx/me+7yduYpIcYlmEmPQkg3gmWkZ # lnSRePu7/5RXS2TGW1O5JP8aqVcMn0ZkHEhtT368pE/CxQVAkAYHNz6+enP9n+HC # 2udu395c0fVlRHy/d53f32RukfbjakH8uzCCBeEwggPJoAMCAQICCmELqsEAAAAA # AAkwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1 # dGhvcml0eSAyMDEwMB4XDTEyMDQxODIzNDgzOFoXDTI3MDQxODIzNTgzOFowgY4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xODA2BgNVBAMTL01p # Y3Jvc29mdCBXaW5kb3dzIFRoaXJkIFBhcnR5IENvbXBvbmVudCBDQSAyMDEyMIIB # IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo5wwhAmnYy7PCkfw6iT5ozAg # D15XMSaBmjEHslDUzmcJCGUKWqVLrtXtEC7npZm1n2gvmItYAqwgtCnEcb0oHKX9 # PJtk5MXr32ElvPDuaL/Rp8t+KgKBTmRcDFOGeVcZN2G3mPkMoE4iWZv5Gy1nPCc8 # VpBm4/1/ZX0Phr01R+iKzPTajulqTqunVeyiiR7VM0VTy/med73NLPkFuH90AR3o # +xjhQ9EN6arcN2+9/rgP7R1NAUZOCqz8gujsVoMTjjoB7RRkdOpksmYQtmhtyHAA # fVBILj1D7uAklcbNjsf9uOSVz91++5VeoQHNQ7EH16Qw7puGGipuwQtZonRviwID # AQABo4IBQzCCAT8wEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGFxp4ev/2nV # IXZPUpMoAL55EquEMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQE # AwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQ # W9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNv # bS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBa # BggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqG # SIb3DQEBCwUAA4ICAQBaimfazNX9DSZBd78KRni0s94SaSt3I8JlLwFf0gP0YbpQ # nS6MOXLzbD5qsR52bey384LczLvFaXAoc2YXP1Tr7gEWSMRG2RuAroE6jQ95bWiw # nuotPznTyjh+vV58CG4Z3MbC9DgzaGHiUkeD4QABVtK6y4eCBTEKQYtO539fX+1f # 0zktReuiE7/9HsKYQXFhFl/ICnAlfFlpMSTkcecKuwQX959yHsnSuxq+PQL+CQyy # Q7RZGplTk5YhX+DWtyYBQpU2rCf9vvSFd2g9GL30vpiIIhGGUhbzRewDlxBwh6Nw # Q3E828mGAxcM9XNbxn3hXGTt18VI1+0y4tGq08+n9ldOYfl362fyiLPeANoDj9CK # NDc+HdhiuNKx8+Evi3I7gZZ8b/zsZnZyYBsk8qCJbVttAC7vKN2GhwXCtLnlvmTC # KvJKFVyY4sQnhf9S42J+D7ICC9dmxwqy0z0gBBRQMlmDCn2b7Vo4EgFSui9eIHKO # SvH953ECjDvhB77Jc/TdR9i077SkszC5iT52yrkAmFZ+q+qKuKXQOKtpdxMLFC/p # qkEf97q9Ois0iu4Kq2PmY/eIJI4gDSs7nePCSVKsnx8OOTtd1G5QauZ9UjqqfDMV # KQ0mXgFYp06pPXqEb3Q/YJ/kMk82AK9tcdM+pkZlX4F08f7BcdpMoEFagt3xHzGC # GwkwghsFAgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBUaGlyZCBQYXJ0eSBDb21w # b25lbnQgQ0EgMjAxMgITMwAAAUBn9phrMQi4cgAAAAABQDANBglghkgBZQMEAgEF # AKCCARgwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIPcF1DBbIpQrtIPkD+dKZy7G # sBYaSp3FxK7V6e7PdZtHMFAGCisGAQQBgjcKAxwxQgxAM0JCNEY3Q0YzMEUzNEEy # NkI1N0U5MEZDMjJDRjVDQjQyQjEwRUFCMDU3QjM5OTZEMUJFM0JEOUVCMTc2RkZF # RjBaBgorBgEEAYI3AgEMMUwwSqAkgCIATQBpAGMAcgBvAHMAbwBmAHQAIABXAGkA # bgBkAG8AdwBzoSKAIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aW5kb3dzMA0G # CSqGSIb3DQEBAQUABIIBgDFw1oXZNPII9IhqoIy1Eqg6WMzUx64KLpB2dfFx1fl5 # /ZlqHchr+tbBOLySIIO6UCWWyNMBto60MNcbSMGYO/Lt82IU6hVE6mFpd4+riMjT # CGW16fMn4PwB+ljk+b39nM4jHEKOIi9ZfgE6nFV2AdrDtt5RQk45Bl8yDv/wsgAd # SrHQsZ44VADD+HNfsPKYbPP1tQCGIxeDK82kxMRs29f3i4WlDJccIZyuycFmAuI9 # qriEvhCM4aGhfNPk/0/+w2FnoEOyxLNaiZ/WtDSDiKzD6xJY27WItpO0RfDqyDCE # BL7vx6TCAU7xxMsE5F0KVOW8+yNkm6ombW5ViU6lrHMzVMCsggYeGRO4Wubwr9Bf # fEDlh0eUlP0RGUZpSsXaKf1s2MSpCXCt1KgLONrFlm/zKPpP4URDiOiD1JcWMEV0 # p35RJljTwmaXd92Q8o5Al83c0Fj8y+KXzNdljWlkqsiLxjg2zmchkVweElvSTESE # s3LA3Rryno5BcVA+XevC6aGCF5cwgheTBgorBgEEAYI3AwMBMYIXgzCCF38GCSqG # SIb3DQEHAqCCF3AwghdsAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFSBgsqhkiG9w0B # CRABBKCCAUEEggE9MIIBOQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUA # BCCel1udGYRyZskrH6dy0wGafM2UFXVOHf6zvNkSEw0nkQIGajGdSFtaGBMyMDI2 # MDcxMTAzMzY0OS42MjhaMASAAgH0oIHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5 # NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghHtMIIH # IDCCBQigAwIBAgITMwAAAh86cGnkojAulQABAAACHzANBgkqhkiG9w0BAQsFADB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yNjAyMTkxOTM5NTFaFw0y # NzA1MTcxOTM5NTFaMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYD # VQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4IC # DwAwggIKAoICAQDLO8XFOcfGqAqgiz0+AmQmFl3dZ0aTG4UFJkqqNdMHy28DaheC # Bs6ONufukye5x42CWkzgRIy9kE2VWwEntZ8ZkgyrykC0bIqsID7+6FxguseTXf1V # wvm1D8104VmetoBJlJ4uGbuyJZUvXDx55nVh50ygLTzZ24WkQsnPpvRZv2kPc39f # 3bhLyHVtnHsa/W/86Vrftd+AfFveA+qN/EY+XGj5c/DPMXCYECb0arYb92dDJWtw # zpyBrp4gfHlgY1UEpc4l4AGELrf2J4wrxTzTW+SM8XhV1dOOPrYjD080IbZqL8B+ # IF0RCdn269YXrGK6QIHipznKZcCS8jN30YAHnTJVN5Zzs6t/2YsqBGDquvDad793 # 4FFTwzvUcO3VoIyd93XWwvP8/SCFVJh21W8oGQTptGHyly+Fl4henVMVZF1v6osO # tirX8GFTiEhnf8nRdOg7yZYAJ0xy9CtDfbXaTn/cf3Lq3N/GCYKFjC+5mUCE+AJh # mxMuMdvSUGmKiAFdiPAjUTqsWWBBZJm0eCwgeGJFmmQA+V7/98BKcE+gUL7O9eWR # DQwKeAcvo6rxNv2Y4jKrHA6Z/wi3a/fKUhLCNZES8qGdrpDAm7qh+6FjYxytAbki # KM6uTNy/ULPlwtlYZoAJDDQP7eYCywwVbNTbHXRBSS+NccC0sSB4W7U67wIDAQAB # o4IBSTCCAUUwHQYDVR0OBBYEFNk72sGDlH0r5DwvfGR5XwJI8B7bMB8GA1UdIwQY # MBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUt # U3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYB # BQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj # cm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB # /wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0G # CSqGSIb3DQEBCwUAA4ICAQBlbu3IoynnPz0K1iPbeNnsej2b15l5sdl2FAFBBGT9 # lRdc2gNV8LAIusPYHHhUvRDcsx4lbMNhVKPGu4TDLaqNt/CI+SFtGuqdRLpVP1XE # 9cCLyKrKPpcJFJCqPpV+efoAtYBmIUQcxxwT7WIQ7gag8+rkKvrMkCoRqKS0mKv8 # J1sKfi85+G2uhZ/1RteSVdYZOZOj+Sb4wzonTCTj7EtgMN/BX35W5dTzd7wJdGep # YkVi871dSrC2Tr1ZFzAR7S44drCWZpJ6phJabVNOsNxFJKgSykugOGWzQ318Rr3M # TPg2s3Bns+pUPVgMijd4bUOH2BlEsLMMwOcolTTZqg1HYrdY1jxpUAI9ipjBQRIN # L/O705Z+/f2LjNmJQooCVJVX24adpZ519SsfazGoqXGt91bmqKo0fI09Il4sUHh4 # ih6rpiQDBlyL7vmvCejwVxYevY4qVwTZ/o3gvl+R0lFxYS9feIM4NeG0+WsDZ7jL # ci5MFeuNwosQY3z26Xg1oj0U9u+ncR9uTU+xBmJ8BtlCdhQ13RNMX5P+krRYPB3X # Cp9Jm6XaO1995q32AIZm1mzBGI6yHlviXaEC5TzGiO1LXuPtXZU2X93oQJbMoe3v # 8+5CPKrQalGWyYuh2a3V1pwbj+W0FEmEFPpu8TI+qYO1IIQWUSRvFjXth5Ob02hM # MjCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQEL # BQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNV # BAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4X # DTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM # 57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm # 95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzB # RMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBb # fowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCO # Mcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYw # XE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW # /aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/w # EPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPK # Z6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2 # BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfH # CBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYB # BAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8v # BO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYM # KwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEF # BQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBW # BgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUH # AQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # L2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsF # AAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518Jx # Nj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+ # iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2 # pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefw # C2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7 # T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFO # Ry3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhL # mm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3L # wUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5 # m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE # 0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNQMIICOAIB # ATCB+aGB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UE # CxMeblNoaWVsZCBUU1MgRVNOOjM3MDMtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy # b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBLIMg1P7sN # uCXpmbH2IXT2tXeEEKCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMA0GCSqGSIb3DQEBCwUAAgUA7fu8XTAiGA8yMDI2MDcxMDE4NDU0OVoYDzIw # MjYwNzExMTg0NTQ5WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDt+7xdAgEAMAoC # AQACAie0AgH/MAcCAQACAhK7MAoCBQDt/Q3dAgEAMDYGCisGAQQBhFkKBAIxKDAm # MAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcN # AQELBQADggEBADpw2sXJynxtnCOyuX0c79eIl4sdbWtecJKXcJCK+KSGa/B6EpPs # VnLiHqZ6zyA6upjUz2QTeOOodLpB1QSeft2vdCTEgj+gaqSn/aIc9WP4GQdB2f2c # 4M9z6eFIRn1oy6PT/bthesCurdfHxJRUk2Au7oiQ2cXpBPSDwvldK2ScpESXzWX+ # lqzXqIg/SIwrndc7AdDuVT7E39EbYJI1avOhiDcu6fNpSeS1LhVzOzIU7+mZXCo1 # ShIn1GTJ//qNcGfp10L7k18bD9OpxcikY9Qif3Fyn51tQzlWa031SoQ1qMRgb7P1 # T7oJ8ur/NNNIV9leq8FRxPO5ISGE9AUleUIxggQNMIIECQIBATCBkzB8MQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv # ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAh86cGnkojAulQABAAACHzANBglg # hkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqG # SIb3DQEJBDEiBCAYfsDlXO/IcLGVx4EtONa43h4ClFwsfSYB7tWN5QM7XjCB+gYL # KoZIhvcNAQkQAi8xgeowgecwgeQwgb0EILAkCt9WkCsMtURkFu6TY0P3UXdRnCiY # uPZhe3ykLfwUMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC # EzMAAAIfOnBp5KIwLpUAAQAAAh8wIgQgGh008zs2K7yJGUXT1/+0szlcqQ4AnI00 # 0AZQTeva0V0wDQYJKoZIhvcNAQELBQAEggIAVvou0r/FUtjARyRpwaaoVR45xdSt # YqpZ0vOCrTpyN1NytEjSFcBtEr6ER10Fg1a5dDTiN5z9g2d1zaPw/0lGm0HL26Jw # W7UCUxcJuaZCkq58zvJ/vb2a2A2Upo3MV+lQRVZ6TK8CiTqvnkBdWpt4zHaWE3r0 # frRn5q/+SbONKhxlRrQPy5l8AOZkMohMnNrY3HhCHwOmWqJKqzJE3gGi2qHxPJb1 # Fk/EeAsBqpcIstJKAUPdVIdjFPJ0UracrsThcBGxBdwH7rEat3Hq97tybjvGyK8W # +Ek4R76WScArc9apcpWAYvH+rh360qKvp7wkjRt/kzeplPJpTW+wl/nmHxIOUwBU # clm5jyYKL5i5NTbJcFKhFflE6iULZJKu6er7iqzwryrNz89Al89MAWoBJqETp/+B # 55KRArmigLU+rg8K40BFJUBPp4FvFHzy1JghrGGDa8ChiYzA9fUXXy2xvUpKlk8b # Dw2HXDCokSIlju26oMWFpQnlex/pSAu+Abz86QXeR9ZZotyxY45gUb+8h+1kGqni # xy+zspkPnnKYl2UieQ4IQ756H/cWYNdsy4xKXEkCacPgwg1xSrKkcZHN5V6JnBfB # 2KrQ58f3OdpdWkCgon2DrOAN14u+i3AsOhHKlLmKX4OpPp1oCHya42NtAKBx/iOe # pDDKpxKeGc2qXKU= # SIG # End signature block