Set-StrictMode -Version Latest function FunctionUnderTest { [CmdletBinding()] param ( [Parameter(Mandatory=$false)] [string] $param1 ) return "I am a real world test" } function FunctionUnderTestWithoutParams([string]$param1) { return "I am a real world test with no params" } filter FilterUnderTest { $_ } function CommonParamFunction ( [string] ${Uncommon}, [switch] ${Verbose}, [switch] ${Debug}, [System.Management.Automation.ActionPreference] ${ErrorAction}, [System.Management.Automation.ActionPreference] ${WarningAction}, [System.String] ${ErrorVariable}, [System.String] ${WarningVariable}, [System.String] ${OutVariable}, [System.Int32] ${OutBuffer} ){ return "Please strip me of my common parameters. They are far too common." } function PipelineInputFunction { param( [Parameter(ValueFromPipeline=$True)] [int]$PipeInt1, [Parameter(ValueFromPipeline=$True)] [int[]]$PipeInt2, [Parameter(ValueFromPipeline=$True)] [string]$PipeStr, [Parameter(ValueFromPipelineByPropertyName=$True)] [int]$PipeIntProp, [Parameter(ValueFromPipelineByPropertyName=$True)] [int[]]$PipeArrayProp, [Parameter(ValueFromPipelineByPropertyName=$True)] [string]$PipeStringProp ) begin{ $p = 0 } process { foreach($i in $input) { $p += 1 write-output @{ index=$p; val=$i; PipeInt1=$PipeInt1; PipeInt2=$PipeInt2; PipeStr=$PipeStr; PipeIntProp=$PipeIntProp; PipeArrayProp=$PipeArrayProp; PipeStringProp=$PipeStringProp; } } } } Describe "When calling Mock on existing function" { Mock FunctionUnderTest { return "I am the mock test that was passed $param1"} $result = FunctionUnderTest "boundArg" It "Should rename function under test" { $renamed = (Test-Path function:PesterIsMocking_FunctionUnderTest) $renamed | Should Be $true } It "Should Invoke the mocked script" { $result | Should Be "I am the mock test that was passed boundArg" } } Describe "When the caller mocks a command Pester uses internally" { Mock Write-Host { } Context "Context run when Write-Host is mocked" { It "does not make extra calls to the mocked command" { Write-Host 'Some String' Assert-MockCalled 'Write-Host' -Exactly 1 } It "retains the correct mock count after the first test completes" { Assert-MockCalled 'Write-Host' -Exactly 1 } } } Describe "When calling Mock on existing cmdlet" { Mock Get-Process {return "I am not Get-Process"} $result=Get-Process It "Should Invoke the mocked script" { $result | Should Be "I am not Get-Process" } It 'Should not resolve $args to the parent scope' { { $args = 'From', 'Parent', 'Scope'; Get-Process SomeName } | Should Not Throw } } Describe 'When calling Mock on an alias' { $originalPath = $env:path try { # Our TeamCity server has a dir.exe on the system path, and PowerShell v2 apparently finds that instead of the PowerShell alias first. # This annoying bit of code makes sure our test works as intended even when this is the case. $dirExe = Get-Command dir -CommandType Application -ErrorAction SilentlyContinue if ($null -ne $dirExe) { foreach ($app in $dirExe) { $parent = (Split-Path $app.Path -Parent).TrimEnd('\') $pattern = "^$([regex]::Escape($parent))\\?" $env:path = $env:path -split ';' -notmatch $pattern -join ';' } } Mock dir {return 'I am not dir'} $result = dir It 'Should Invoke the mocked script' { $result | Should Be 'I am not dir' } } finally { $env:path = $originalPath } } Describe 'When calling Mock on an alias that refers to a function Pester can''t see' { It 'Mocks the aliased command successfully' { # This function is defined in a non-global scope; code inside the Pester module can't see it directly. function orig {'orig'} New-Alias 'ali' orig ali | Should Be 'orig' { mock ali {'mck'} } | Should Not Throw ali | Should Be 'mck' } } Describe 'When calling Mock on a filter' { Mock FilterUnderTest {return 'I am not FilterUnderTest'} $result = 'Yes I am' | FilterUnderTest It 'Should Invoke the mocked script' { $result | Should Be 'I am not FilterUnderTest' } } Describe 'When calling Mock on an external script' { $ps1File = New-Item 'TestDrive:\tempExternalScript.ps1' -ItemType File -Force $ps1File | Set-Content -Value "'I am tempExternalScript.ps1'" Mock 'TestDrive:\tempExternalScript.ps1' {return 'I am not tempExternalScript.ps1'} <# # Invoking the script using its absolute path is not supported $result = TestDrive:\tempExternalScript.ps1 It 'Should Invoke the absolute-path-qualified mocked script using just the script name' { $result | Should Be 'I am not tempExternalScript.ps1' } $result = & TestDrive:\tempExternalScript.ps1 It 'Should Invoke the absolute-path-qualified mocked script using the command-invocation operator (&)' { $result | Should Be 'I am not tempExternalScript.ps1' } $result = . TestDrive:\tempExternalScript.ps1 It 'Should Invoke the absolute-path-qualified mocked script using dot source notation' { $result | Should Be 'I am not tempExternalScript.ps1' } #> Push-Location TestDrive:\ try { $result = tempExternalScript.ps1 It 'Should Invoke the mocked script using just the script name' { $result | Should Be 'I am not tempExternalScript.ps1' } $result = & tempExternalScript.ps1 It 'Should Invoke the mocked script using the command-invocation operator' { #the command invocation operator is (&). Moved this to comment because it breaks the contionuous builds. #there is issue for this on GH $result | Should Be 'I am not tempExternalScript.ps1' } $result = . tempExternalScript.ps1 It 'Should Invoke the mocked script using dot source notation' { $result | Should Be 'I am not tempExternalScript.ps1' } <# # Invoking the script using only its relative path is not supported $result = .\tempExternalScript.ps1 It 'Should Invoke the relative-path-qualified mocked script' { $result | Should Be 'I am not tempExternalScript.ps1' } #> } finally { Pop-Location } Remove-Item $ps1File -Force -ErrorAction SilentlyContinue } Describe 'When calling Mock on an application command' { Mock schtasks.exe {return 'I am not schtasks.exe'} $result = schtasks.exe It 'Should Invoke the mocked script' { $result | Should Be 'I am not schtasks.exe' } } Describe "When calling Mock in the Describe block" { Mock Out-File {return "I am not Out-File"} It "Should mock Out-File successfully" { $outfile = "test" | Out-File "TestDrive:\testfile.txt" $outfile | Should Be "I am not Out-File" } } Describe "When calling Mock on existing cmdlet to handle pipelined input" { Mock Get-ChildItem { if($_ -eq 'a'){ return "AA" } if($_ -eq 'b'){ return "BB" } } $result = '' "a", "b" | Get-ChildItem | % { $result += $_ } It "Should process the pipeline in the mocked script" { $result | Should Be "AABB" } } Describe "When calling Mock on existing cmdlet with Common params" { Mock CommonParamFunction $result=[string](Get-Content function:\CommonParamFunction) It "Should strip verbose" { $result.contains("`${Verbose}") | Should Be $false } It "Should strip Debug" { $result.contains("`${Debug}") | Should Be $false } It "Should strip ErrorAction" { $result.contains("`${ErrorAction}") | Should Be $false } It "Should strip WarningAction" { $result.contains("`${WarningAction}") | Should Be $false } It "Should strip ErrorVariable" { $result.contains("`${ErrorVariable}") | Should Be $false } It "Should strip WarningVariable" { $result.contains("`${WarningVariable}") | Should Be $false } It "Should strip OutVariable" { $result.contains("`${OutVariable}") | Should Be $false } It "Should strip OutBuffer" { $result.contains("`${OutBuffer}") | Should Be $false } It "Should not strip an Uncommon param" { $result.contains("`${Uncommon}") | Should Be $true } } Describe "When calling Mock on non-existing function" { try{ Mock NotFunctionUnderTest {return} } Catch { $result=$_ } It "Should throw correct error" { $result.Exception.Message | Should Be "Could not find command NotFunctionUnderTest" } } Describe 'When calling Mock, StrictMode is enabled, and variables are used in the ParameterFilter' { Set-StrictMode -Version Latest $result = $null $testValue = 'test' try { Mock FunctionUnderTest { 'I am the mock' } -ParameterFilter { $param1 -eq $testValue } } catch { $result = $_ } It 'Does not throw an error when testing the parameter filter' { $result | Should Be $null } It 'Calls the mock properly' { FunctionUnderTest $testValue | Should Be 'I am the mock' } It 'Properly asserts the mock was called when there is a variable in the parameter filter' { Assert-MockCalled FunctionUnderTest -Exactly 1 -ParameterFilter { $param1 -eq $testValue } } } Describe "When calling Mock on existing function without matching bound params" { Mock FunctionUnderTest {return "fake results"} -parameterFilter {$param1 -eq "test"} $result=FunctionUnderTest "badTest" It "Should redirect to real function" { $result | Should Be "I am a real world test" } } Describe "When calling Mock on existing function with matching bound params" { Mock FunctionUnderTest {return "fake results"} -parameterFilter {$param1 -eq "badTest"} $result=FunctionUnderTest "badTest" It "Should return mocked result" { $result | Should Be "fake results" } } Describe "When calling Mock on existing function without matching unbound arguments" { Mock FunctionUnderTestWithoutParams {return "fake results"} -parameterFilter {$param1 -eq "test" -and $args[0] -eq 'notArg0'} $result=FunctionUnderTestWithoutParams -param1 "test" "arg0" It "Should redirect to real function" { $result | Should Be "I am a real world test with no params" } } Describe "When calling Mock on existing function with matching unbound arguments" { Mock FunctionUnderTestWithoutParams {return "fake results"} -parameterFilter {$param1 -eq "badTest" -and $args[0] -eq 'arg0'} $result=FunctionUnderTestWithoutParams "badTest" "arg0" It "Should return mocked result" { $result | Should Be "fake results" } } Describe 'When calling Mock on a function that has no parameters' { function Test-Function { } Mock Test-Function { return $args.Count } It 'Sends the $args variable properly with 2+ elements' { Test-Function 1 2 3 4 5 | Should Be 5 } It 'Sends the $args variable properly with 1 element' { Test-Function 1 | Should Be 1 } It 'Sends the $args variable properly with 0 elements' { Test-Function | Should Be 0 } } Describe "When calling Mock on cmdlet Used by Mock" { Mock Set-Item {return "I am not Set-Item"} Mock Set-Item {return "I am not Set-Item"} $result = Set-Item "mypath" -value "value" It "Should Invoke the mocked script" { $result | Should Be "I am not Set-Item" } } Describe "When calling Mock on More than one command" { Mock Invoke-Command {return "I am not Invoke-Command"} Mock FunctionUnderTest {return "I am the mock test"} $result = Invoke-Command {return "yes I am"} $result2 = FunctionUnderTest It "Should Invoke the mocked script for the first Mock" { $result | Should Be "I am not Invoke-Command" } It "Should Invoke the mocked script for the second Mock" { $result2 | Should Be "I am the mock test" } } Describe 'When calling Mock on a module-internal function.' { New-Module -Name TestModule { function InternalFunction { 'I am the internal function' } function PublicFunction { InternalFunction } function PublicFunctionThatCallsExternalCommand { Start-Sleep 0 } function FuncThatOverwritesExecutionContext { param ($ExecutionContext) InternalFunction } Export-ModuleMember -Function PublicFunction, PublicFunctionThatCallsExternalCommand, FuncThatOverwritesExecutionContext } | Import-Module -Force New-Module -Name TestModule2 { function InternalFunction { 'I am the second module internal function' } function InternalFunction2 { 'I am the second module, second function' } function PublicFunction { InternalFunction } function PublicFunction2 { InternalFunction2 } function FuncThatOverwritesExecutionContext { param ($ExecutionContext) InternalFunction } function ScopeTest { return Get-CallerModuleName } function Get-CallerModuleName { [CmdletBinding()] param ( ) return $PSCmdlet.SessionState.Module.Name } Export-ModuleMember -Function PublicFunction, PublicFunction2, FuncThatOverwritesExecutionContext, ScopeTest } | Import-Module -Force It 'Should fail to call the internal module function' { { TestModule\InternalFunction } | Should Throw } It 'Should call the actual internal module function from the public function' { TestModule\PublicFunction | Should Be 'I am the internal function' } Context 'Using Mock -ModuleName "ModuleName" "CommandName" syntax' { Mock -ModuleName TestModule InternalFunction { 'I am the mock test' } It 'Should call the mocked function' { TestModule\PublicFunction | Should Be 'I am the mock test' } Mock -ModuleName TestModule Start-Sleep { } It 'Should mock calls to external functions from inside the module' { PublicFunctionThatCallsExternalCommand Assert-MockCalled -ModuleName TestModule Start-Sleep -Exactly 1 } Mock -ModuleName TestModule2 InternalFunction -ParameterFilter { $args[0] -eq 'Test' } { "I'm the mock who's been passed parameter Test" } It 'Should only call mocks within the same module' { TestModule2\PublicFunction | Should Be 'I am the second module internal function' } Mock -ModuleName TestModule2 InternalFunction2 { InternalFunction 'Test' } It 'Should call mocks from inside another mock' { TestModule2\PublicFunction2 | Should Be "I'm the mock who's been passed parameter Test" } It 'Should work even if the function is weird and steps on the automatic $ExecutionContext variable.' { TestModule2\FuncThatOverwritesExecutionContext | Should Be 'I am the second module internal function' TestModule\FuncThatOverwritesExecutionContext | Should Be 'I am the mock test' } Mock -ModuleName TestModule2 Get-CallerModuleName -ParameterFilter { $false } It 'Should call the original command from the proper scope if no parameter filters match' { TestModule2\ScopeTest | Should Be 'TestModule2' } Mock -ModuleName TestModule2 Get-Content { } It 'Does not trigger the mocked Get-Content from Pester internals' { Mock -ModuleName TestModule2 Get-CallerModuleName -ParameterFilter { $false } Assert-MockCalled -ModuleName TestModule2 Get-Content -Times 0 -Scope It } } AfterAll { Remove-Module TestModule -Force Remove-Module TestModule2 -Force } } Describe "When Applying multiple Mocks on a single command" { Mock FunctionUnderTest {return "I am the first mock test"} -parameterFilter {$param1 -eq "one"} Mock FunctionUnderTest {return "I am the Second mock test"} -parameterFilter {$param1 -eq "two"} $result = FunctionUnderTest "one" $result2= FunctionUnderTest "two" It "Should Invoke the mocked script for the first Mock" { $result | Should Be "I am the first mock test" } It "Should Invoke the mocked script for the second Mock" { $result2 | Should Be "I am the Second mock test" } } Describe "When Applying multiple Mocks with filters on a single command where both qualify" { Mock FunctionUnderTest {return "I am the first mock test"} -parameterFilter {$param1.Length -gt 0 } Mock FunctionUnderTest {return "I am the Second mock test"} -parameterFilter {$param1 -gt 1 } $result = FunctionUnderTest "one" It "The last Mock should win" { $result | Should Be "I am the Second mock test" } } Describe "When Applying multiple Mocks on a single command where one has no filter" { Mock FunctionUnderTest {return "I am the first mock test"} -parameterFilter {$param1 -eq "one"} Mock FunctionUnderTest {return "I am the paramless mock test"} Mock FunctionUnderTest {return "I am the Second mock test"} -parameterFilter {$param1 -eq "two"} $result = FunctionUnderTest "one" $result2= FunctionUnderTest "three" It "The parameterless mock is evaluated last" { $result | Should Be "I am the first mock test" } It "The parameterless mock will be applied if no other wins" { $result2 | Should Be "I am the paramless mock test" } } Describe "When Creating a Verifiable Mock that is not called" { Context "In the test script's scope" { Mock FunctionUnderTest {return "I am a verifiable test"} -Verifiable -parameterFilter {$param1 -eq "one"} FunctionUnderTest "three" | Out-Null try { Assert-VerifiableMocks } Catch { $result=$_ } It "Should throw" { $result.Exception.Message | Should Be "`r`n Expected FunctionUnderTest to be called with `$param1 -eq `"one`"" } } Context "In a module's scope" { New-Module -Name TestModule -ScriptBlock { function ModuleFunctionUnderTest { return 'I am the function under test in a module' } } | Import-Module -Force Mock -ModuleName TestModule ModuleFunctionUnderTest {return "I am a verifiable test"} -Verifiable -parameterFilter {$param1 -eq "one"} TestModule\ModuleFunctionUnderTest "three" | Out-Null try { Assert-VerifiableMocks } Catch { $result=$_ } It "Should throw" { $result.Exception.Message | Should Be "`r`n Expected ModuleFunctionUnderTest in module TestModule to be called with `$param1 -eq `"one`"" } AfterAll { Remove-Module TestModule -Force } } } Describe "When Creating a Verifiable Mock that is called" { Mock FunctionUnderTest -Verifiable -parameterFilter {$param1 -eq "one"} FunctionUnderTest "one" It "Assert-VerifiableMocks Should not throw" { { Assert-VerifiableMocks } | Should Not Throw } } Describe "When Calling Assert-MockCalled 0 without exactly" { Mock FunctionUnderTest {} FunctionUnderTest "one" try { Assert-MockCalled FunctionUnderTest 0 } Catch { $result=$_ } It "Should throw if mock was called" { $result.Exception.Message | Should Be "Expected FunctionUnderTest to be called 0 times exactly but was called 1 times" } It "Should not throw if mock was not called" { Assert-MockCalled FunctionUnderTest 0 { $param1 -eq "stupid" } } } Describe "When Calling Assert-MockCalled with exactly" { Mock FunctionUnderTest {} FunctionUnderTest "one" FunctionUnderTest "one" try { Assert-MockCalled FunctionUnderTest -exactly 3 } Catch { $result=$_ } It "Should throw if mock was not called the number of times specified" { $result.Exception.Message | Should Be "Expected FunctionUnderTest to be called 3 times exactly but was called 2 times" } It "Should not throw if mock was called the number of times specified" { Assert-MockCalled FunctionUnderTest -exactly 2 { $param1 -eq "one" } } } Describe "When Calling Assert-MockCalled without exactly" { Mock FunctionUnderTest {} FunctionUnderTest "one" FunctionUnderTest "one" FunctionUnderTest "two" It "Should throw if mock was not called atleast the number of times specified" { $scriptBlock = { Assert-MockCalled FunctionUnderTest 4 } $scriptBlock | Should Throw "Expected FunctionUnderTest to be called at least 4 times but was called 3 times" } It "Should not throw if mock was called at least the number of times specified" { Assert-MockCalled FunctionUnderTest } It "Should not throw if mock was called at exactly the number of times specified" { Assert-MockCalled FunctionUnderTest 2 { $param1 -eq "one" } } It "Should throw an error if any non-matching calls to the mock are made, and the -ExclusiveFilter parameter is used" { $scriptBlock = { Assert-MockCalled FunctionUnderTest -ExclusiveFilter { $param1 -eq 'one' } } $scriptBlock | Should Throw '1 non-matching calls were made' } } Describe "Using Pester Scopes (Describe,Context,It)" { Mock FunctionUnderTest {return "I am the first mock test"} -parameterFilter {$param1 -eq "one"} Mock FunctionUnderTest {return "I am the paramless mock test"} Context "When in the first context" { It "should mock Describe scoped paramles mock" { FunctionUnderTest | should be "I am the paramless mock test" } It "should mock Describe scoped single param mock" { FunctionUnderTest "one" | should be "I am the first mock test" } } Context "When in the second context" { It "should mock Describe scoped paramles mock again" { FunctionUnderTest | should be "I am the paramless mock test" } It "should mock Describe scoped single param mock again" { FunctionUnderTest "one" | should be "I am the first mock test" } } Context "When using mocks in both scopes" { Mock FunctionUnderTestWithoutParams {return "I am the other function"} It "should mock Describe scoped mock." { FunctionUnderTest | should be "I am the paramless mock test" } It "should mock Context scoped mock." { FunctionUnderTestWithoutParams | should be "I am the other function" } } Context "When context hides a describe mock" { Mock FunctionUnderTest {return "I am the context mock"} Mock FunctionUnderTest {return "I am the parameterized context mock"} -parameterFilter {$param1 -eq "one"} It "should use the context paramles mock" { FunctionUnderTest | should be "I am the context mock" } It "should use the context parameterized mock" { FunctionUnderTest "one" | should be "I am the parameterized context mock" } } Context "When context no longer hides a describe mock" { It "should use the describe mock" { FunctionUnderTest | should be "I am the paramless mock test" } It "should use the describe parameterized mock" { FunctionUnderTest "one" | should be "I am the first mock test" } } Context 'When someone calls Mock from inside an It block' { Mock FunctionUnderTest { return 'I am the context mock' } It 'Sets the mock' { Mock FunctionUnderTest { return 'I am the It mock' } } It 'Leaves the mock active in the parent scope' { FunctionUnderTest | Should Be 'I am the It mock' } } } Describe 'Testing mock history behavior from each scope' { function MockHistoryChecker { } Mock MockHistoryChecker { 'I am the describe mock.' } Context 'Without overriding the mock in lower scopes' { It "Reports that zero calls have been made to in the describe scope" { Assert-MockCalled MockHistoryChecker -Exactly 0 -Scope Describe } It 'Calls the describe mock' { MockHistoryChecker | Should Be 'I am the describe mock.' } It "Reports that zero calls have been made in an It block, after a context-scoped call" { Assert-MockCalled MockHistoryChecker -Exactly 0 -Scope It } It "Reports one Context-scoped call" { Assert-MockCalled MockHistoryChecker -Exactly 1 } It "Reports one Describe-scoped call" { Assert-MockCalled MockHistoryChecker -Exactly 1 -Scope Describe } } Context 'After exiting the previous context' { It 'Reports zero context-scoped calls in the new context.' { Assert-MockCalled MockHistoryChecker -Exactly 0 } It 'Reports one describe-scoped call from the previous context' { Assert-MockCalled MockHistoryChecker -Exactly 1 -Scope Describe } } Context 'While overriding mocks in lower scopes' { Mock MockHistoryChecker { 'I am the context mock.' } It 'Calls the context mock' { MockHistoryChecker | Should Be 'I am the context mock.' } It 'Reports one context-scoped call' { Assert-MockCalled MockHistoryChecker -Exactly 1 } It 'Reports two describe-scoped calls, even when one is an override mock in a lower scope' { Assert-MockCalled MockHistoryChecker -Exactly 2 -Scope Describe } It 'Calls an It-scoped mock' { Mock MockHistoryChecker { 'I am the It mock.' } MockHistoryChecker | Should Be 'I am the It mock.' } It 'Reports 2 context-scoped calls' { Assert-MockCalled MockHistoryChecker -Exactly 2 } It 'Reports 3 describe-scoped calls' { Assert-MockCalled MockHistoryChecker -Exactly 3 -Scope Describe } } It 'Reports 3 describe-scoped calls using the default scope in a Describe block' { Assert-MockCalled MockHistoryChecker -Exactly 3 } } Describe "Using a single no param Describe" { Mock FunctionUnderTest {return "I am the describe mock test"} Context "With a context mocking the same function with no params"{ Mock FunctionUnderTest {return "I am the context mock test"} It "Should use the context mock" { FunctionUnderTest | should be "I am the context mock test" } } } Describe 'Dot Source Test' { # This test is only meaningful if this test file is dot-sourced in the global scope. If it's executed without # dot-sourcing or run by Invoke-Pester, there's no problem. function TestFunction { Test-Path -Path 'Test' } Mock Test-Path { } $null = TestFunction It "Calls the mock with parameter 'Test'" { Assert-MockCalled Test-Path -Exactly 1 -ParameterFilter { $Path -eq 'Test' } } It "Doesn't call the mock with any other parameters" { InModuleScope Pester { $global:calls = $mockTable['||Test-Path'].CallHistory } Assert-MockCalled Test-Path -Exactly 0 -ParameterFilter { $Path -ne 'Test' } } } Describe 'Mocking Cmdlets with dynamic parameters' { $mockWith = { if (-not $CodeSigningCert) { throw 'CodeSigningCert variable not found, or set to false!' } } Mock Get-ChildItem -MockWith $mockWith -ParameterFilter { [bool]$CodeSigningCert } It 'Allows calls to be made with dynamic parameters (including parameter filters)' { { Get-ChildItem -Path Cert:\ -CodeSigningCert } | Should Not Throw Assert-MockCalled Get-ChildItem } } Describe 'Mocking functions with dynamic parameters' { Context 'Dynamicparam block that uses the variables of static parameters in its logic' { # Get-Greeting sample function borrowed and modified from Bartek Bielawski's # blog at http://becomelotr.wordpress.com/2012/05/10/using-and-abusing-dynamic-parameters/ function Get-Greeting { [CmdletBinding()] param ( [string] $Name ) DynamicParam { if ($Name -cmatch '\b[a-z]') { $Attributes = New-Object Management.Automation.ParameterAttribute $Attributes.ParameterSetName = "__AllParameterSets" $Attributes.Mandatory = $false $AttributeCollection = New-Object Collections.ObjectModel.Collection[Attribute] $AttributeCollection.Add($Attributes) $Dynamic = New-Object System.Management.Automation.RuntimeDefinedParameter('Capitalize', [switch], $AttributeCollection) $ParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $ParamDictionary.Add("Capitalize", $Dynamic) $ParamDictionary } } end { if($PSBoundParameters.Capitalize) { $Name = [regex]::Replace( $Name, '\b\w', { $args[0].Value.ToUpper() } ) } "Welcome $Name!" } } $mockWith = { if (-not $Capitalize) { throw 'Capitalize variable not found, or set to false!' } } Mock Get-Greeting -MockWith $mockWith -ParameterFilter { [bool]$Capitalize } It 'Allows calls to be made with dynamic parameters (including parameter filters)' { { Get-Greeting -Name lowercase -Capitalize } | Should Not Throw Assert-MockCalled Get-Greeting } $Capitalize = $false It 'Sets the dynamic parameter variable properly' { { Get-Greeting -Name lowercase -Capitalize } | Should Not Throw Assert-MockCalled Get-Greeting -Scope It } } Context 'When the mocked command is in a module' { New-Module -Name TestModule { function PublicFunction { Get-Greeting -Name lowercase -Capitalize } $script:DoDynamicParam = $true # Get-Greeting sample function borrowed and modified from Bartek Bielawski's # blog at http://becomelotr.wordpress.com/2012/05/10/using-and-abusing-dynamic-parameters/ function script:Get-Greeting { [CmdletBinding()] param ( [string] $Name ) DynamicParam { # This check is here to make sure the mocked version can still work if the # original function's dynamicparam block relied on script-scope variables. if (-not $script:DoDynamicParam) { return } if ($Name -cmatch '\b[a-z]') { $Attributes = New-Object Management.Automation.ParameterAttribute $Attributes.ParameterSetName = "__AllParameterSets" $Attributes.Mandatory = $false $AttributeCollection = New-Object Collections.ObjectModel.Collection[Attribute] $AttributeCollection.Add($Attributes) $Dynamic = New-Object System.Management.Automation.RuntimeDefinedParameter('Capitalize', [switch], $AttributeCollection) $ParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $ParamDictionary.Add("Capitalize", $Dynamic) $ParamDictionary } } end { if($PSBoundParameters.Capitalize) { $Name = [regex]::Replace( $Name, '\b\w', { $args[0].Value.ToUpper() } ) } "Welcome $Name!" } } } | Import-Module -Force $mockWith = { if (-not $Capitalize) { throw 'Capitalize variable not found, or set to false!' } } Mock Get-Greeting -MockWith $mockWith -ModuleName TestModule -ParameterFilter { [bool]$Capitalize } It 'Allows calls to be made with dynamic parameters (including parameter filters)' { { TestModule\PublicFunction } | Should Not Throw Assert-MockCalled Get-Greeting -ModuleName TestModule } AfterAll { Remove-Module TestModule -Force } } Context 'When the mocked command has mandatory parameters that are passed in via the pipeline' { # Get-Greeting sample function borrowed and modified from Bartek Bielawski's # blog at http://becomelotr.wordpress.com/2012/05/10/using-and-abusing-dynamic-parameters/ function Get-Greeting2 { [CmdletBinding()] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string] $MandatoryParam, [string] $Name ) DynamicParam { if ($Name -cmatch '\b[a-z]') { $Attributes = New-Object Management.Automation.ParameterAttribute $Attributes.ParameterSetName = "__AllParameterSets" $Attributes.Mandatory = $false $AttributeCollection = New-Object Collections.ObjectModel.Collection[Attribute] $AttributeCollection.Add($Attributes) $Dynamic = New-Object System.Management.Automation.RuntimeDefinedParameter('Capitalize', [switch], $AttributeCollection) $ParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $ParamDictionary.Add("Capitalize", $Dynamic) $ParamDictionary } } end { if($PSBoundParameters.Capitalize) { $Name = [regex]::Replace( $Name, '\b\w', { $args[0].Value.ToUpper() } ) } "Welcome $Name!" } } Mock Get-Greeting2 { 'Mocked' } -ParameterFilter { [bool]$Capitalize } $hash = @{ Result = $null } $scriptBlock = { $hash.Result = 'Mandatory' | Get-Greeting2 -Name test -Capitalize } It 'Should successfully call the mock and generate the dynamic parameters' { $scriptBlock | Should Not Throw $hash.Result | Should Be 'Mocked' } } Context 'When the mocked command has parameter sets that are ambiguous at the time the dynamic param block is executed' { # Get-Greeting sample function borrowed and modified from Bartek Bielawski's # blog at http://becomelotr.wordpress.com/2012/05/10/using-and-abusing-dynamic-parameters/ function Get-Greeting3 { [CmdletBinding()] param ( [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'One')] [string] $One, [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'Two')] [string] $Two, [string] $Name ) DynamicParam { if ($Name -cmatch '\b[a-z]') { $Attributes = New-Object Management.Automation.ParameterAttribute $Attributes.ParameterSetName = "__AllParameterSets" $Attributes.Mandatory = $false $AttributeCollection = New-Object Collections.ObjectModel.Collection[Attribute] $AttributeCollection.Add($Attributes) $Dynamic = New-Object System.Management.Automation.RuntimeDefinedParameter('Capitalize', [switch], $AttributeCollection) $ParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $ParamDictionary.Add("Capitalize", $Dynamic) $ParamDictionary } } end { if($PSBoundParameters.Capitalize) { $Name = [regex]::Replace( $Name, '\b\w', { $args[0].Value.ToUpper() } ) } "Welcome $Name!" } } Mock Get-Greeting3 { 'Mocked' } -ParameterFilter { [bool]$Capitalize } $hash = @{ Result = $null } $scriptBlock = { $hash.Result = New-Object psobject -Property @{ One = 'One' } | Get-Greeting3 -Name test -Capitalize } It 'Should successfully call the mock and generate the dynamic parameters' { $scriptBlock | Should Not Throw $hash.Result | Should Be 'Mocked' } } Context 'When the mocked command''s dynamicparam block depends on the contents of $PSBoundParameters' { # Get-Greeting sample function borrowed and modified from Bartek Bielawski's # blog at http://becomelotr.wordpress.com/2012/05/10/using-and-abusing-dynamic-parameters/ function Get-Greeting4 { [CmdletBinding()] param ( [string] $Name ) DynamicParam { if ($PSBoundParameters['Name'] -cmatch '\b[a-z]') { $Attributes = New-Object Management.Automation.ParameterAttribute $Attributes.ParameterSetName = "__AllParameterSets" $Attributes.Mandatory = $false $AttributeCollection = New-Object Collections.ObjectModel.Collection[Attribute] $AttributeCollection.Add($Attributes) $Dynamic = New-Object System.Management.Automation.RuntimeDefinedParameter('Capitalize', [switch], $AttributeCollection) $ParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $ParamDictionary.Add("Capitalize", $Dynamic) $ParamDictionary } } end { if($PSBoundParameters.Capitalize) { $Name = [regex]::Replace( $Name, '\b\w', { $args[0].Value.ToUpper() } ) } "Welcome $Name!" } } Mock Get-Greeting4 { 'Mocked' } -ParameterFilter { [bool]$Capitalize } $hash = @{ Result = $null } $scriptBlock = { $hash.Result = Get-Greeting4 -Name test -Capitalize } It 'Should successfully call the mock and generate the dynamic parameters' { $scriptBlock | Should Not Throw $hash.Result | Should Be 'Mocked' } } Context 'When the mocked command''s dynamicparam block depends on the contents of $PSCmdlet.ParameterSetName' { # Get-Greeting sample function borrowed and modified from Bartek Bielawski's # blog at http://becomelotr.wordpress.com/2012/05/10/using-and-abusing-dynamic-parameters/ function Get-Greeting5 { [CmdletBinding(DefaultParameterSetName = 'One')] param ( [string] $Name, [Parameter(ParameterSetName = 'Two')] [string] $Two ) DynamicParam { if ($PSCmdlet.ParameterSetName -eq 'Two' -and $Name -cmatch '\b[a-z]') { $Attributes = New-Object Management.Automation.ParameterAttribute $Attributes.ParameterSetName = "__AllParameterSets" $Attributes.Mandatory = $false $AttributeCollection = New-Object Collections.ObjectModel.Collection[Attribute] $AttributeCollection.Add($Attributes) $Dynamic = New-Object System.Management.Automation.RuntimeDefinedParameter('Capitalize', [switch], $AttributeCollection) $ParamDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary $ParamDictionary.Add("Capitalize", $Dynamic) $ParamDictionary } } end { if($PSBoundParameters.Capitalize) { $Name = [regex]::Replace( $Name, '\b\w', { $args[0].Value.ToUpper() } ) } "Welcome $Name!" } } Mock Get-Greeting5 { 'Mocked' } -ParameterFilter { [bool]$Capitalize } $hash = @{ Result = $null } $scriptBlock = { $hash.Result = Get-Greeting5 -Two 'Two' -Name test -Capitalize } It 'Should successfully call the mock and generate the dynamic parameters' { $scriptBlock | Should Not Throw $hash.Result | Should Be 'Mocked' } } } Describe 'Mocking Cmdlets with dynamic parameters in a module' { New-Module -Name TestModule { function PublicFunction { Get-ChildItem -Path Cert:\ -CodeSigningCert } } | Import-Module -Force $mockWith = { if (-not $CodeSigningCert) { throw 'CodeSigningCert variable not found, or set to false!' } } Mock Get-ChildItem -MockWith $mockWith -ModuleName TestModule -ParameterFilter { [bool]$CodeSigningCert } It 'Allows calls to be made with dynamic parameters (including parameter filters)' { { TestModule\PublicFunction } | Should Not Throw Assert-MockCalled Get-ChildItem -ModuleName TestModule } AfterAll { Remove-Module TestModule -Force } } Describe 'DynamicParam blocks in other scopes' { New-Module -Name TestModule1 { $script:DoDynamicParam = $true function DynamicParamFunction { [CmdletBinding()] param ( ) DynamicParam { if ($script:DoDynamicParam) { Get-MockDynamicParameters -CmdletName Get-ChildItem -Parameters @{ Path = [string[]]'Cert:\' } } } end { 'I am the original function' } } } | Import-Module -Force New-Module -Name TestModule2 { function CallingFunction { DynamicParamFunction -CodeSigningCert } function CallingFunction2 { [CmdletBinding()] param ( [ValidateScript({ [bool](DynamicParamFunction -CodeSigningCert) })] [string] $Whatever ) } } | Import-Module -Force Mock DynamicParamFunction { if ($CodeSigningCert) { 'I am the mocked function' } } -ModuleName TestModule2 It 'Properly evaluates dynamic parameters when called from another scope' { CallingFunction | Should Be 'I am the mocked function' } It 'Properly evaluates dynamic parameters when called from another scope when the call is from a ValidateScript block' { CallingFunction2 -Whatever 'Whatever' } AfterAll { Remove-Module TestModule1 -Force Remove-Module TestModule2 -Force } } Describe 'Parameter Filters and Common Parameters' { function Test-Function { [CmdletBinding()] param ( ) } Mock Test-Function { } -ParameterFilter { $VerbosePreference -eq 'Continue' } It 'Applies common parameters correctly when testing the parameter filter' { { Test-Function -Verbose } | Should Not Throw Assert-MockCalled Test-Function Assert-MockCalled Test-Function -ParameterFilter { $VerbosePreference -eq 'Continue' } } } Describe "Mocking Get-ItemProperty" { Mock Get-ItemProperty { New-Object -typename psobject -property @{ Name = "fakeName" } } It "Does not fail with NotImplementedException" { Get-ItemProperty -Path "HKLM:\Software\Key\" -Name "Property" | Select -ExpandProperty Name | Should Be fakeName } } Describe 'When mocking a command with parameters that match internal variable names' { function Test-Function { [CmdletBinding()] param ( [string] $ArgumentList, [int] $FunctionName, [double] $ModuleName ) } Mock Test-Function { return 'Mocked!' } It 'Should execute the mocked command successfully' { { Test-Function } | Should Not Throw Test-Function | Should Be 'Mocked!' } } Describe 'Mocking commands with potentially ambigious parameter sets' { function SomeFunction { [CmdletBinding()] param ( [parameter(ParameterSetName = 'ps1', ValueFromPipelineByPropertyName = $true)] [string] $p1, [parameter(ParameterSetName = 'ps2', ValueFromPipelineByPropertyName = $true)] [string] $p2 ) process { return $true } } Mock SomeFunction { } It 'Should call the function successfully, even with delayed parameter binding' { $object = New-Object psobject -Property @{ p1 = 'Whatever' } { $object | SomeFunction } | Should Not Throw Assert-MockCalled SomeFunction -ParameterFilter { $p1 -eq 'Whatever' } } } Describe 'When mocking a command that has an ArgumentList parameter with validation' { Mock Start-Process { return 'mocked' } It 'Calls the mock properly' { $hash = @{ Result = $null } $scriptBlock = { $hash.Result = Start-Process -FilePath cmd.exe -ArgumentList '/c dir c:\' } $scriptBlock | Should Not Throw $hash.Result | Should Be 'mocked' } } # These assertions won't actually "fail"; we had an infinite recursion bug in Get-DynamicParametersForCmdlet # if the caller mocked New-Object. It should be fixed by making that call to New-Object module-qualified, # and this test will make sure it's working properly. If this test fails, it'll take a really long time # to execute, and then will throw a stack overflow error. Describe 'Mocking New-Object' { It 'Works properly' { Mock New-Object $result = New-Object -TypeName Object $result | Should Be $null Assert-MockCalled New-Object } } Describe 'Mocking a function taking input from pipeline' { $psobj = New-Object -TypeName psobject -Property @{'PipeIntProp'='1';'PipeArrayProp'=1;'PipeStringProp'=1} $psArrayobj = New-Object -TypeName psobject -Property @{'PipeArrayProp'=@(1)} $noMockArrayResult = @(1,2) | PipelineInputFunction $noMockIntResult = 1 | PipelineInputFunction $noMockStringResult = '1' | PipelineInputFunction $noMockResultByProperty = $psobj | PipelineInputFunction -PipeStr 'val' $noMockArrayResultByProperty = $psArrayobj | PipelineInputFunction -PipeStr 'val' Mock PipelineInputFunction { write-output 'mocked' } -ParameterFilter { $PipeStr -eq 'blah' } context 'when calling original function with an array' { $result = @(1,2) | PipelineInputFunction it 'Returns actual implementation' { $result[0].keys | % { $result[0][$_] | Should Be $noMockArrayResult[0][$_] $result[1][$_] | Should Be $noMockArrayResult[1][$_] } } } context 'when calling original function with an int' { $result = 1 | PipelineInputFunction it 'Returns actual implementation' { $result.keys | % { $result[$_] | Should Be $noMockIntResult[$_] } } } context 'when calling original function with a string' { $result = '1' | PipelineInputFunction it 'Returns actual implementation' { $result.keys | % { $result[$_] | Should Be $noMockStringResult[$_] } } } context 'when calling original function and pipeline is bound by property name' { $result = $psobj | PipelineInputFunction -PipeStr 'val' it 'Returns actual implementation' { $result.keys | % { $result[$_] | Should Be $noMockResultByProperty[$_] } } } context 'when calling original function and forcing a parameter binding exception' { Mock PipelineInputFunction { if($MyInvocation.ExpectingInput) { throw New-Object -TypeName System.Management.Automation.ParameterBindingException } write-output $MyInvocation.ExpectingInput } $result = $psobj | PipelineInputFunction it 'falls back to no pipeline input' { $result | Should Be $false } } context 'when calling original function and pipeline is bound by property name with array values' { $result = $psArrayobj | PipelineInputFunction -PipeStr 'val' it 'Returns actual implementation' { $result.keys | % { $result[$_] | Should Be $noMockArrayResultByProperty[$_] } } } context 'when calling the mocked function' { $result = 'blah' | PipelineInputFunction it 'Returns mocked implementation' { $result | Should Be 'mocked' } } } Describe 'Mocking module-qualified calls' { It 'Mock alias should not exist before the mock is defined' { $alias = Get-Alias -Name 'Microsoft.PowerShell.Management\Get-Content' -ErrorAction SilentlyContinue $alias | Should Be $null } $mockFile = 'TestDrive:\TestFile' $mockResult = 'Mocked' Mock Get-Content { return $mockResult } -ParameterFilter { $Path -eq $mockFile } Setup -File TestFile -Content 'The actual file' It 'Creates the alias while the mock is in effect' { $alias = Get-Alias -Name 'Microsoft.PowerShell.Management\Get-Content' -ErrorAction SilentlyContinue $alias | Should Not Be $null } It 'Calls the mock properly even if the call is module-qualified' { $result = Microsoft.PowerShell.Management\Get-Content -Path $mockFile $result | Should Be $mockResult } } Describe 'After a mock goes out of scope' { It 'Removes the alias after the mock goes out of scope' { $alias = Get-Alias -Name 'Microsoft.PowerShell.Management\Get-Content' -ErrorAction SilentlyContinue $alias | Should Be $null } } Describe 'Assert-MockCalled with Aliases' { AfterEach { if (Test-Path alias:PesterTF) { Remove-Item Alias:PesterTF } } It 'Allows calls to Assert-MockCalled to use both aliases and the original command name' { function TestFunction { } Set-Alias -Name PesterTF -Value TestFunction Mock PesterTF $null = PesterTF { Assert-MockCalled PesterTF } | Should Not Throw { Assert-MockCalled TestFunction } | Should Not Throw } } Describe 'Mocking Get-Command' { # This was reported as a bug in 3.3.12; we were relying on Get-Command to safely invoke other commands. # Mocking Get-Command, though, would result in infinite recursion. It 'Does not break when Get-Command is mocked' { { Mock Get-Command } | Should Not Throw } } Describe 'Mocks with closures' { $closureVariable = 'from closure' $scriptBlock = { "Variable resolved $closureVariable" } $closure = $scriptBlock.GetNewClosure() $closureVariable = 'from script' function TestClosure([switch] $Closure) { 'Not mocked' } Mock TestClosure $closure -ParameterFilter { $Closure } Mock TestClosure $scriptBlock It 'Resolves variables in the closure rather than Pester''s current scope' { TestClosure | Should Be 'Variable resolved from script' TestClosure -Closure | Should Be 'Variable resolved from closure' } } Describe '$args handling' { function AdvancedFunction { [CmdletBinding()] param() 'orig' } function SimpleFunction { . AdvancedFunction } function AdvancedFunctionWithArgs { [CmdletBinding()] param($Args) 'orig' } Add-Type -TypeDefinition ' using System.Management.Automation; [Cmdlet(VerbsLifecycle.Invoke, "CmdletWithArgs")] public class InvokeCmdletWithArgs : Cmdlet { public InvokeCmdletWithArgs() { } [Parameter] public object Args { set { } } protected override void EndProcessing() { WriteObject("orig"); } } ' -PassThru | Select-Object -ExpandProperty Assembly | Import-Module Mock AdvancedFunction { 'mock' } Mock AdvancedFunctionWithArgs { 'mock' } Mock Invoke-CmdletWithArgs { 'mock' } It 'Advanced function mock should be callable with dot operator' { SimpleFunction garbage | Should Be mock } It 'Advanced function with Args parameter should be mockable' { AdvancedFunctionWithArgs -Args garbage | Should Be mock } It 'Cmdlet with Args parameter should be mockable' { Invoke-CmdletWithArgs -Args garbage | Should Be mock } } Describe 'Single quote in command/module name' { BeforeAll { $module = New-Module "Module '‘’‚‛" { Function NormalCommandName { 'orig' } New-Item "Function::Command '‘’‚‛" -Value { 'orig' } } | Import-Module -PassThru } AfterAll { if ($module) { Remove-Module $module; $module = $null } } It 'Command with single quote in module name should be mockable' { Mock NormalCommandName { 'mock' } NormalCommandName | Should Be mock } It 'Command with single quote in name should be mockable' { Mock "Command '‘’‚‛" { 'mock' } & "Command '‘’‚‛" | Should Be mock } } if ($global:PSVersionTable.PSVersion.Major -ge 3) { Describe 'Mocking cmdlet without positional parameters' { Add-Type -TypeDefinition ' using System.Management.Automation; [Cmdlet(VerbsLifecycle.Invoke, "CmdletWithoutPositionalParameters")] public class InvokeCmdletWithoutPositionalParameters : Cmdlet { public InvokeCmdletWithoutPositionalParameters() { } [Parameter] public object Parameter { set { } } } [Cmdlet(VerbsLifecycle.Invoke, "CmdletWithValueFromRemainingArguments")] public class InvokeCmdletWithValueFromRemainingArguments : Cmdlet { private string parameter; private string[] remainings; public InvokeCmdletWithValueFromRemainingArguments() { } [Parameter] public string Parameter { set { parameter=value; } } [Parameter(ValueFromRemainingArguments=true)] public string[] Remainings { set { remainings=value; } } protected override void EndProcessing() { WriteObject(string.Concat(parameter, "; ", string.Join(", ", remainings))); } } ' -PassThru | Select-Object -First 1 -ExpandProperty Assembly | Import-Module It 'Original cmdlet does not have positional parameters' { { Invoke-CmdletWithoutPositionalParameters garbage } | Should Throw } Mock Invoke-CmdletWithoutPositionalParameters It 'Mock of cmdlet should not make parameters to be positional' { { Invoke-CmdletWithoutPositionalParameters garbage } | Should Throw } It 'Original cmdlet bind all to Remainings' { Invoke-CmdletWithValueFromRemainingArguments asd fgh jkl | Should Be '; asd, fgh, jkl' } Mock Invoke-CmdletWithValueFromRemainingArguments { -join ($Parameter, '; ', ($Remainings -join ', ')) } It 'Mock of cmdlet should bind all to Remainings' { Invoke-CmdletWithValueFromRemainingArguments asd fgh jkl | Should Be '; asd, fgh, jkl' } } } Describe 'Nested Mock calls' { $testDate = New-Object DateTime(2012,6,13) Mock Get-Date -ParameterFilter { $null -eq $Date } { Get-Date -Date $testDate -Format o } It 'Properly handles nested mocks' { $result = @(Get-Date) $result.Count | Should Be 1 $result[0] | Should Be '2012-06-13T00:00:00.0000000' } } # SIG # Begin signature block # MIInXgYJKoZIhvcNAQcCoIInTzCCJ0sCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAkpc/exW5Mgzst # vtrs/3BxZAzjbOAHK7Tw8WBQzKoGh6CCC7QwggXLMIIEs6ADAgECAhMzAAABQGf2 # 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 # GwAwghr8AgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBUaGlyZCBQYXJ0eSBDb21w # b25lbnQgQ0EgMjAxMgITMwAAAUBn9phrMQi4cgAAAAABQDANBglghkgBZQMEAgEF # AKCB+jAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQg # knjmSivrcMyLv8AWmBmpW480WR9T0ThSbYWP5nSGaKowUAYKKwYBBAGCNwoDHDFC # DEA1MDZBRkE2NzQxM0I3RUE2MTI2NTQzM0JBNTEzNzBDRTkyRTM1QjIzRjVFQjdG # OUE1RUVEQUJGODNBREJCQTQ1MFoGCisGAQQBgjcCAQwxTDBKoCSAIgBNAGkAYwBy # AG8AcwBvAGYAdAAgAFcAaQBuAGQAbwB3AHOhIoAgaHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3dpbmRvd3MwDQYJKoZIhvcNAQEBBQAEggGAjzj1c3LTKowotaxvoUkS # 5T17o/EfsiuI976zlAAuhdWAi11K6GGwjjyB1I5FksTP+sIXa+Hu+amvjLBcrOLj # /F7/pE8MULe1CDHs4fpnwF7qtB9OsLEu3dIveQnkLGJVtmxiG2vfj2S9r8qGYzbR # gGtSStgBCCk0JU/3feSas5Y7FxuKcB8I5hxSSNt1NQLUdAXGWO+u4+A/9QTBPo/I # 06yW/2wAc2x2iNTUSgBFu3vyMlUGlVtsmrO22cILaAgIVsXHmovhEwogK8MRpzGw # nUapF2l3dMGK871atPYkTXGs/aClraPHF0jb14qJBZwSbHNw+enqk9TiMdPJ5czf # nvx7Ijt/MPIn7CUuvSpIoGDqHJPmMZFOpex4Zu2OEh58BYQciJOuAeb1dJavJZut # naG0D2LXy4UT5wcsN+Jz9eKOmlbIyQNUFMMovHCq62JZkCW/MlJHlxDG+Hkaw5vI # CJtPR84w8Pm/FD8leVMv6UibDeWeZUtpapdReqWtDzhSoYIXrTCCF6kGCisGAQQB # gjcDAwExgheZMIIXlQYJKoZIhvcNAQcCoIIXhjCCF4ICAQMxDzANBglghkgBZQME # AgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUwggFBAgEBBgorBgEEAYRZCgMB # MDEwDQYJYIZIAWUDBAIBBQAEICJozmh88kTELimSyfR/thne2+gCUrOjnzBQQM8e # 8pUvAgZp7A448+gYEzIwMjYwNTA2MTU0MDUyLjU4M1owBIACAfSggdmkgdYwgdMx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo # aWVsZCBUU1MgRVNOOjUyMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg # VGltZS1TdGFtcCBTZXJ2aWNloIIR+zCCBygwggUQoAMCAQICEzMAAAIXcfsupa8B # HeoAAQAAAhcwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTAwHhcNMjUwODE0MTg0ODIzWhcNMjYxMTEzMTg0ODIzWjCB0zELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0 # IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hpZWxkIFRT # UyBFU046NTIxQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDAzzaw # TD7f29hHuIYIgUOdg2FEz4HMXYBiKrl1SlmkkU9GMJyKlDpFRsj5EBg1ECkTHHnK # Ctdtpa27C+qyoBVJZtT9bp95y6OMguQ+qf2meC1ZGR9CBtiC9pcAuXo9jbI4f1/v # YwP7oDLFB6dKkAx1TNj9CT+O2Owd0VdUF762yGUiRIncZnDxVUqpODcZkSXO3Bsl # Y22uEES+F/pqfEx6BAwk/u07z8EnshOzj8BXcPZu/x4eTzVj586ZDyZDrVYurbAi # 2+XMhPlvN6Ur0u8TJx/nHWVfEDATDlrt2lL4IpNqeG2/5DabB5sDJuN/2KjiTjyy # 1NqrWu1ys6IPB12pWbVL17yHVOzNcXOMsu8T0SaOc18h7Cxj5EKFRoedjgUXDAkS # cS/8lLvqgdPSgZ3Lv4nrR8Y6XsDVShTICSGlvYGNr5LBIiIdtDgUPImIuVnp2tln # zgygnznYlLEzSEGMY7oVmU87yK43KTrzQOLxWdtI2kh0k34OGV6l5NQwEMeoKZ3S # ZVZFZk+bWm+C3L3dqw2382DqjibZ2eihY50zfIqwlpaPIeqJz2B9OtkEz48Jep5N # o7WgSJpD6HjDScdV1X5dK8jabXI3iKJuqObkc9oA7c4n46Y0t+01WavhnpTZPqkh # wsHKygpwNS8KrJxePgL/6fUoUGkMZ0MzD2Ca7wIDAQABo4IBSTCCAUUwHQYDVR0O # BBYEFFCs32OXA06h4TllCqcXnHxLVslDMB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl # 0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAy # MDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1T # dGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/ # BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IC # AQBGaAV2EHvEgAgcQSDkj/lL6DHrtpHpGJbxkDC0TebPyjR3Kf6kg/6WJ01HUgpB # DSv5GNiAj1xnqZu8DK+Hd7ar8FXyuMcTe530/JjKrfZ64WB1ne9fhvlBd49aWkEB # it3OJHbusfPpbCkfl1mxLKltcMFtCRaQ2XqDzbJPLcBsFsoNcF3PFmwRq5o6mVq0 # rsSvh2GCUoF7HwlDZ0xKRJnB4I0Nep32v/1bZV1FmwMko/9dzhTJCVWxugGi0q1g # RJcWSPBHUdWwf5DQLr383kI/9OrdiAjW5vhv37cwkUpaElcJwkYVmRwvBSZjCgWD # VcujsMsl0aOsgfWOwjY0VckVAd5/oB1F7URG9hB6q3KsG/Ei9H4//zcU1jLPHTiK # dRP1MXYDBM66oILpnrug3BHikQQnIAgRES+R2GON9ZyCyT+cZOV9qG81j9I4es1E # qjj0oOVxw3NEIlDJD4Pn2vv+p5s1LJA9N/Aj376MRjRD9RYpU0uGKjnkZgGx4n32 # zs3OR3E6v1R+2nn3scSi9sDr2oaVnc6lQTcfVEEYNWn8W8za5dO6bwusyQ9fHkCn # +Rs8BKwL2O72gwJ7YgRc7ZJ4PVoPciq8A50cUoeDW+ls9RBJZvqDbF8FXfTAVypo # 9iDNxvE9Y/Jmor5LyXvPDrho7mGYnt5DCgx9O7RVrLqvjzCCB3EwggVZoAMCAQIC # EzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoX # DTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC # 0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VG # Iwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP # 2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/P # XfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361 # VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwB # Sru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9 # X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269e # wvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDw # wvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr # 9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+e # FnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAj # BgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+n # FV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEw # PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j # cy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3 # FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAf # BgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBH # hkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNS # b29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUF # BzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0Nl # ckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4Swf # ZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTC # j/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu # 2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/ # GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3D # YXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbO # xnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqO # Cb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I # 6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0 # zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaM # mdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNT # TY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNWMIICPgIBATCCAQGhgdmkgdYwgdMx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo # aWVsZCBUU1MgRVNOOjUyMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg # VGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBpsoAVoq3aFpR2qQd8 # VjMDN+BIy6CBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0G # CSqGSIb3DQEBCwUAAgUA7aW1LzAiGA8yMDI2MDUwNjEyNDAxNVoYDzIwMjYwNTA3 # MTI0MDE1WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDtpbUvAgEAMAcCAQACAh03 # MAcCAQACAhKYMAoCBQDtpwavAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQB # hFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEB # AJX8zAIDEXfFRmfjeUdxffW5qDfQny5ahRpU+u3YBmgFAKAXEOptBa77gdzwyQ2B # P9/ROK4noySJ4yHDYhvzN0D8yEqsFXujIqZbfZYnBUCPX7n5jGmnmoFTCO5vHVw3 # eAfJHEbr0YFODWpSR3MnPoxw2f+XEjr89Eq7KfiItEsLlyNigADoH5b6jCKP1+DG # aqxtVHLBET+v3Y0jWymwQsN+4/no8cGNPS8e8m8qasdeqEfR0ZTW0W+UuvInsA8F # BKVCNwj03NNDWdojJD+Db99TTtBJumoJ4I+HFAT7XPQ8FwYKCnFDMcm/BelBitgI # axUw8QcqLAosuEJYfcYIvSAxggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzET # MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T # dGFtcCBQQ0EgMjAxMAITMwAAAhdx+y6lrwEd6gABAAACFzANBglghkgBZQMEAgEF # AKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEi # BCCpdLkLTVF+Yk8UfySXlug3RpNyr6FCVuD60nrNJ9fgdjCB+gYLKoZIhvcNAQkQ # Ai8xgeowgecwgeQwgb0EINDyUGA+XbfJnRLNRK3mmE4h6Ac/LCuQ3B6/F7aT5Fpb # MIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm # MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIXcfsu # pa8BHeoAAQAAAhcwIgQgFcyDutEVXBdLFE2SmsaP47y7KzWIIZqgb4J4fHGM1RQw # DQYJKoZIhvcNAQELBQAEggIAOFTlLOF8Gkxw8k0BxQSLghSCdnUD/ZZoKsoMsCkX # NAHsxJd4yVGb0WT1VwWUsE19u6yp1BDOju8Zji0z3nEV4MvhmT5XyqiRcetCgZgK # dDseomh45dt/8vGmBnS8qSyAL42AndjMGTVlpx8q4OWUGgmDCCIFEVjMmF15kk4c # XSsuqX0DSVTzWJNChF1lh7CxXuMSg5ERGImbA4kwmAsbIY660qDHuQh/95iM3Hc7 # kcbsb09RM81Tsj6/9+f9s16+xPJ79iqqU4Pra8yyONVnYkE/k8NLWdjuAWywKke8 # 8D3yO+l5B2es385BPiH+w92a0VwhzyIvlo6Qa/3eSlWmish1SrDXpaf/LdVnsNrl # 5OT5xBCryRXdaO4ij1SXMvhVgZjcVd7MvFNZx4QAwNhNa/Z5z+yHcmIjzCQojGCV # 0E+GvD+rMCKYtWAZ1/Wm8ls9ARLUHsM280aGMJda2Qn7v4x0kWexZEwbvPbq2Caz # vCGt7AW8264nm7nixmtZHNaNySfiZK5PhBDN4vJnMp9xK0KfgEJFOaOKmN6jc/2T # WlkuX8EqKTW+KgrXmLXnpGQhN8YMlCwIOqdZ3ItCFmrw3TOG2x5HuYhuysKumZVY # tYslHV7MkP0gqTfbo7Yy6k8d8a7M2yuEsJQBzEFtpftPc4s+bt7X8fxyjMJkoimb # FcE= # SIG # End signature block x

Windows NT KPTV 6.2 build 9200 (Windows Server 2012 Datacenter Edition) i586