ZPki-Functions.ps1
<#PSScriptInfo
.VERSION 0.3.2.0 .GUID c5309bd6-c9e1-44de-a259-de7d3601ab18 .AUTHOR Anders Runesson .COMPANYNAME ZampleWorks .COPYRIGHT (c) Anders Runesson .TAGS .LICENSEURI .PROJECTURI https://github.com/zampleworks/ZPki .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .DESCRIPTION Private functions for ZPki module #> #requires -Version 5 Function Get-HttpUri { Param( $HostFQDN ,$Path ,$Document ) If($null -ne $Path) { $Path = $Path.Trim('/') } Else { $Path = "" } If($Path.Length -gt 0) { $Path = "/$Path/" } Else { $Path = "/" } Write-Output "http://$($HostFQDN)$($Path)$($Document)" } Function Get-LdapUri { Param( [switch] $IsAIA ) If($IsAIA) { Write-Output "ldap:///CN=%7,CN=AIA,CN=Public Key Services,CN=Services,%6%11" } Else { Write-Output "ldap:///CN=%7%8,CN=%7,CN=CDP,CN=Public Key Services,CN=Services,%6%10" } } Function Get-FileUri { Param( $Path, [switch] $IsAIA ) If($IsAIA) { Write-Output "file:///$Path\%3%4.crt" } Else { Write-Output "file:///$Path\%7%8%9.crl" } } Function New-ADCSPath { [CmdletBinding(ConfirmImpact='Medium', SupportsShouldProcess=$true)] Param( [string] $PathName, [string] $Path ) If(-Not (Test-Path $Path -PathType Any) -And ($PSCmdlet.ShouldProcess($PathName, "Create ADCS directory"))) { Write-Verbose "Creating ADCS Directory [$PathName] at [$Path]" New-Item $Path -ItemType Directory | Out-Null } Elseif(Test-Path $Path -PathType Leaf) { Write-Error "ADCS Directory exists, but is a file. Cannot continue. [$PathName]: [$Path]" } } Function Get-CaPolicyFileTemplate { Param( [Parameter(Mandatory=$True)] $CAType ) If($CAType -like "*root*") { Get-Content .\CAPolicy-root.inf } Else { Get-Content .\CAPolicy-sub.inf } } Function Get-CaPolicyHeaderSection { Write-Output "[Version]`r`nSignature=`"`$Windows NT`$`" `r`n" } Function Get-CaPolicyCertSrvSection { Param( $Keylength, $CACertValidityPeriod, $CACertValidityPeriodUnits, $CRLPeriod, $CRLPeriodUnits, $DeltaPeriod, $DeltaPeriodUnits, [bool] $LoadDefaultTemplates, [bool] $AltSignatureAlgorithm, [bool] $ForceUTF8, $ClockSkewMinutes, [bool] $EnableKeyCounting ) $ldt = [int] $LoadDefaultTemplates $asa = [int] $AltSignatureAlgorithm $futf = [int] $ForceUTF8 $ekc = [int] $EnableKeyCounting Write-Output (("[Certsrv_Server]", "RenewalKeyLength = $Keylength", "RenewalValidityPeriod = $CACertValidityPeriod", "RenewalValidityPeriodUnits = $CACertValidityPeriodUnits", "CRLPeriod = $CRLPeriod", "CRLPeriodUnits = $CRLPeriodUnits", "CRLDeltaPeriod = $DeltaPeriod", "CRLDeltaPeriodUnits = $DeltaPeriodUnits", "LoadDefaultTemplates = $ldt", "AlternateSignatureAlgorithm = $asa", "ForceUTF8 = $futf", "ClockSkewMinutes = $ClockSkewMinutes", "EnableKeyCounting = $ekc") -join "`r`n") } Function Get-CaPolicyPolicySection { Param( $PolicyName, $PolicyOid, $PolicyNotice, $PolicyUrl ) If([string]::IsNullOrWhiteSpace($PolicyName)) { Write-Error "Get-CaPolicyPolicySection(): Policy name cannot be empty." } If([string]::IsNullOrWhiteSpace($PolicyOid)) { Write-Error "Get-CaPolicyPolicySection(): Policy OID cannot be empty. Policy name: [$PolicyName]" } If([string]::IsNullOrWhiteSpace($PolicyName) -And [string]::IsNullOrWhiteSpace($PolicyNotice) -and [string]::IsNullOrWhiteSpace($PolicyUrl)) { Write-Error "Get-CaPolicyPolicySection(): Policy Notice and Url cannot both be empty. Policy name: [$PolicyName]" } $Section = "" $Section = "[$PolicyName]`r`nOID=$PolicyOid`r`n" If(-Not [string]::IsNullOrWhiteSpace($PolicyNotice)) { $Section = "$($Section)Notice=$PolicyNotice`r`n" } If(-Not [string]::IsNullOrWhiteSpace($PolicyUrl)) { $Section = "$($Section)URL=$PolicyUrl`r`n" } Write-Output $Section } Function Get-CaPolicyPolicyExtensionsSection { Param( [string] $Sections ) If(-Not [string]::IsNullOrWhiteSpace($Sections)) { Write-Output "[PolicyStatementExtension] `r`n Policies=$Sections`r`n" } } Function Get-CaPolicyBasicConstraintsSection { Param( [string] $PathLength, [bool] $Critical ) $Crit = If($Critical) { "Yes" } Else { "No" } $Pl = "" If($PathLength -ne "None") { $Pl = "PathLength = $PathLength" } Write-Output (("[BasicConstraintsExtension]", $Pl, "Critical = $Crit`r`n") -join "`r`n") } Function Get-CaPolicyEkuSection { Param( [string[]] $Oids, [switch] $Critical ) $Crit = If($Critical) { "Yes" } Else { "No" } Write-Output (( & { Write-Output "[EnhancedKeyUsageExtension]" Write-Output "Critical = $Crit" Foreach($e in $Oids) { Write-Output "OID = $e" } Write-Output "`r`n" }) -join "`r`n") } Function New-AdcsBackupDir { [CmdletBinding(ConfirmImpact="Medium", SupportsShouldProcess=$true)] Param( [string] $Path, [string] $Name ) $FullPath = "$Path\$Name" Write-Verbose "Creating $FullPath" If(Test-Path $FullPath -PathType Leaf) { Write-Error "Target directory [$FullPath] already exists, but is a file. Please remove the file or use a different path." } If(-Not (Test-Path $FullPath) -And ($PSCmdlet.ShouldProcess($FullPath, "Create backup directory"))) { mkdir $FullPath | Out-Null } If(-Not (Test-Path $FullPath)) { Write-Error "Failed to create target directory [$FullPath]." } } Function Test-IsAdmin { [CmdletBinding()] Param() $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) Write-Output $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } # SIG # Begin signature block # MIIc7AYJKoZIhvcNAQcCoIIc3TCCHNkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBrIlH8bo4y0nWG # 3W7WJjAOWhj9MF5sUrjkvmzBCloWSaCCFw0wggQGMIIDrKADAgECAhMxAAAAS5jn # 8iJKtIw9AAAAAABLMAoGCCqGSM49BAMCMEgxCzAJBgNVBAYTAlNFMRQwEgYDVQQK # EwtaYW1wbGVXb3JrczEjMCEGA1UEAxMaWmFtcGxlV29ya3MgSW50ZXJuYWwgQ0Eg # djMwHhcNMjUwNDAyMDcxNjIyWhcNMjYwNDAyMDcyNjIyWjAaMRgwFgYDVQQDEw9B # bmRlcnMgUnVuZXNzb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDT # sUPEug1GoD0ar/yoJT39X2h00X3JnWwGAvmvh9mI443ll1pSB6rb6j2zx0KIoeR1 # TQu9w6nty47dctGf6Ox4WVJgZj1boIWK+lG57C5PX7bbwD/gJ+qZbrnsj2qLvwpF # gMsnMTwhDEKfPky/D2y6D++e8IzTbRWdS7JHPOxKuZtm+CwCyktMwcBuQWWZJMsS # edUB8Gk5Tjk5RzCJzQFHvzmr9QR4uJL8dG2eIik0G0ktrTo5wMYeXn0BcavebBnp # YNdBAev6yNm6/8I01indVuzBG729Ot8uGkkiI/KUCYmesO/65Bz2cEia3DwmBLof # YhSG/7GJ+qWLWypeBTJPAgMBAAGjggHWMIIB0jA+BgkrBgEEAYI3FQcEMTAvBicr # BgEEAYI3FQiFvfVOgvm6E4a9lx6Hx5oph4vfRIFkhviqFYSi0VcCAWUCAQcwEwYD # VR0lBAwwCgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQDAgeAMBsGCSsGAQQBgjcVCgQO # MAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFMIw8bu2T2Ry4uTZ2XKjXrPJF4hGMB8G # A1UdIwQYMBaAFNycnL/2+NQJIWqe3QaNutQBPBQ2MGIGCCsGAQUFBwEBBFYwVDBS # BggrBgEFBQcwAoZGaHR0cDovL3BraS5vcC56d2tzLnh5ei9SZXBvc2l0b3J5L1ph # bXBsZVdvcmtzJTIwSW50ZXJuYWwlMjBDQSUyMHYzLmNydDBbBgNVHREEVDBSoC8G # CisGAQQBgjcUAgOgIQwfQW5kZXJzLlJ1bmVzc29uQHphbXBsZXdvcmtzLmNvbYEf # YW5kZXJzLnJ1bmVzc29uQHphbXBsZXdvcmtzLmNvbTBNBgkrBgEEAYI3GQIEQDA+ # oDwGCisGAQQBgjcZAgGgLgQsUy0xLTUtMjEtMTY5MDA3NTU0LTU2MTU1NTU4My0z # NDY1ODcwMDY1LTE1MTYwCgYIKoZIzj0EAwIDSAAwRQIhAIRkLmTClm3OJndccyd2 # 14WZ0mXH3N68iZaTVxrzKGcaAiB+8mqDJvNMyUP/lSrSPWXDJzFzSYRnI2mvdAAV # faOEJjCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEM # BQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UE # CxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJ # RCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkG # A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp # Z2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zC # pyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf # 1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x # 4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEio # ZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7ax # xLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZ # OjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJ # l2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz # 2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH # 4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb # 5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ # 9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYD # VR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuC # MS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYI # KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3 # aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v # dENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0g # ADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs # 7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq # 3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/ # Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9 # /HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWoj # ayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDCCBq4wggSWoAMC # AQICEAc2N7ckVHzYR6z9KGYqXlswDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMC # VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0 # LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4XDTIyMDMy # MzAwMDAwMFoXDTM3MDMyMjIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoT # DkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJT # QTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD # ggIPADCCAgoCggIBAMaGNQZJs8E9cklRVcclA8TykTepl1Gh1tKD0Z5Mom2gsMyD # +Vr2EaFEFUJfpIjzaPp985yJC3+dH54PMx9QEwsmc5Zt+FeoAn39Q7SE2hHxc7Gz # 7iuAhIoiGN/r2j3EF3+rGSs+QtxnjupRPfDWVtTnKC3r07G1decfBmWNlCnT2exp # 39mQh0YAe9tEQYncfGpXevA3eZ9drMvohGS0UvJ2R/dhgxndX7RUCyFobjchu0Cs # X7LeSn3O9TkSZ+8OpWNs5KbFHc02DVzV5huowWR0QKfAcsW6Th+xtVhNef7Xj3OT # rCw54qVI1vCwMROpVymWJy71h6aPTnYVVSZwmCZ/oBpHIEPjQ2OAe3VuJyWQmDo4 # EbP29p7mO1vsgd4iFNmCKseSv6De4z6ic/rnH1pslPJSlRErWHRAKKtzQ87fSqEc # azjFKfPKqpZzQmiftkaznTqj1QPgv/CiPMpC3BhIfxQ0z9JMq++bPf4OuGQq+nUo # JEHtQr8FnGZJUlD0UfM2SU2LINIsVzV5K6jzRWC8I41Y99xh3pP+OcD5sjClTNfp # mEpYPtMDiP6zj9NeS3YSUZPJjAw7W4oiqMEmCPkUEBIDfV8ju2TjY+Cm4T72wnSy # Px4JduyrXUZ14mCjWAkBKAAOhFTuzuldyF4wEr1GnrXTdrnSDmuZDNIztM2xAgMB # AAGjggFdMIIBWTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBS6FtltTYUv # cyl2mi91jGogj57IbzAfBgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAO # BgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEE # azBpMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYB # BQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 # ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2lj # ZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAGA1UdIAQZMBcwCAYG # Z4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEAfVmOwJO2b5ip # RCIBfmbW2CFC4bAYLhBNE88wU86/GPvHUF3iSyn7cIoNqilp/GnBzx0H6T5gyNgL # 5Vxb122H+oQgJTQxZ822EpZvxFBMYh0MCIKoFr2pVs8Vc40BIiXOlWk/R3f7cnQU # 1/+rT4osequFzUNf7WC2qk+RZp4snuCKrOX9jLxkJodskr2dfNBwCnzvqLx1T7pa # 96kQsl3p/yhUifDVinF2ZdrM8HKjI/rAJ4JErpknG6skHibBt94q6/aesXmZgaNW # hqsKRcnfxI2g55j7+6adcq/Ex8HBanHZxhOACcS2n82HhyS7T6NJuXdmkfFynOlL # AlKnN36TU6w7HQhJD5TNOXrd/yVjmScsPT9rp/Fmw0HNT7ZAmyEhQNC3EyTN3B14 # OuSereU0cZLXJmvkOHOrpgFPvT87eK1MrfvElXvtCl8zOYdBeHo46Zzh3SP9HSjT # x/no8Zhf+yvYfvJGnXUsHicsJttvFXseGYs2uJPU5vIXmVnKcPA3v5gA3yAWTyf7 # YGcWoWa63VXAOimGsJigK+2VQbc61RWYMbRiCQ8KvYHZE/6/pNHzV9m8BPqC3jLf # BInwAM1dwvnQI38AC+R2AibZ8GV2QqYphwlHK+Z/GqSFD/yYlvZVVCsfgPrA8g4r # 5db7qS9EFUrnEw4d2zc4GqEr9u3WfPwwgga8MIIEpKADAgECAhALrma8Wrp/lYfG # +ekE4zMEMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5E # aWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0 # MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwHhcNMjQwOTI2MDAwMDAwWhcNMzUx # MTI1MjM1OTU5WjBCMQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxIDAe # BgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFtcCAyMDI0MIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEAvmpzn/aVIauWMLpbbeZZo7Xo/ZEfGMSIO2qZ46XB/Qow # IEMSvgjEdEZ3v4vrrTHleW1JWGErrjOL0J4L0HqVR1czSzvUQ5xF7z4IQmn7dHY7 # yijvoQ7ujm0u6yXF2v1CrzZopykD07/9fpAT4BxpT9vJoJqAsP8YuhRvflJ9YeHj # es4fduksTHulntq9WelRWY++TFPxzZrbILRYynyEy7rS1lHQKFpXvo2GePfsMRhN # f1F41nyEg5h7iOXv+vjX0K8RhUisfqw3TTLHj1uhS66YX2LZPxS4oaf33rp9Hlfq # SBePejlYeEdU740GKQM7SaVSH3TbBL8R6HwX9QVpGnXPlKdE4fBIn5BBFnV+KwPx # RNUNK6lYk2y1WSKour4hJN0SMkoaNV8hyyADiX1xuTxKaXN12HgR+8WulU2d6zhz # XomJ2PleI9V2yfmfXSPGYanGgxzqI+ShoOGLomMd3mJt92nm7Mheng/TBeSA2z4I # 78JpwGpTRHiT7yHqBiV2ngUIyCtd0pZ8zg3S7bk4QC4RrcnKJ3FbjyPAGogmoiZ3 # 3c1HG93Vp6lJ415ERcC7bFQMRbxqrMVANiav1k425zYyFMyLNyE1QulQSgDpW9rt # vVcIH7WvG9sqYup9j8z9J1XqbBZPJ5XLln8mS8wWmdDLnBHXgYly/p1DhoQo5fkC # AwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1Ud # JQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG # /WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQU # n1csA3cOKBWQZqVjXu5Pkh92oFswWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny # bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRp # bWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGG # GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2Nh # Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1 # NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAPa0eH3aZW+M4 # hBJH2UOR9hHbm04IHdEoT8/T3HuBSyZeq3jSi5GXeWP7xCKhVireKCnCs+8GZl2u # VYFvQe+pPTScVJeCZSsMo1JCoZN2mMew/L4tpqVNbSpWO9QGFwfMEy60HofN6V51 # sMLMXNTLfhVqs+e8haupWiArSozyAmGH/6oMQAh078qRh6wvJNU6gnh5OruCP1QU # AvVSu4kqVOcJVozZR5RRb/zPd++PGE3qF1P3xWvYViUJLsxtvge/mzA75oBfFZSb # dakHJe2BVDGIGVNVjOp8sNt70+kEoMF+T6tptMUNlehSR7vM+C13v9+9ZOUKzfRU # AYSyyEmYtsnpltD/GWX8eM70ls1V6QG/ZOB6b6Yum1HvIiulqJ1Elesj5TMHq8CW # T/xrW7twipXTJ5/i5pkU5E16RSBAdOp12aw8IQhhA/vEbFkEiF2abhuFixUDobZa # A0VhqAsMHOmaT3XThZDNi5U2zHKhUs5uHHdG6BoQau75KiNbh0c+hatSF+02kULk # ftARjsyEpHKsF7u5zKRbt5oK5YGwFvgc4pEVUNytmB3BpIiowOIIuDgP5M9WArHY # SAR16gc0dP2XdkMEP5eBsX7bf/MGN4K3HP50v/01ZHo/Z5lGLvNwQ7XHBx1yomzL # P8lx4Q1zZKDyHcp4VQJLu2kWTsKsOqQxggU1MIIFMQIBATBfMEgxCzAJBgNVBAYT # AlNFMRQwEgYDVQQKEwtaYW1wbGVXb3JrczEjMCEGA1UEAxMaWmFtcGxlV29ya3Mg # SW50ZXJuYWwgQ0EgdjMCEzEAAABLmOfyIkq0jD0AAAAAAEswDQYJYIZIAWUDBAIB # BQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYK # KwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG # 9w0BCQQxIgQgKyja0Y0ClKzTW6Ya2XyW5AVDbzmkcU0mcxfk+A5h6X0wDQYJKoZI # hvcNAQEBBQAEggEAQdD5mgdlx3tpi2Dad2+yGKYaytyU2NhoS/xdCdFc4JkQUgon # ea07NvkVz4krAtyvWBvovd1U48py480UWw0DBJn0Y3oueRTLsMZ66gW5xcANLnuv # MMXN6lqOYfEykPxX7Hv+OWegWiHUQ34bU4xw3C7hBW3LI7YAUz1G2Xw7VZJZotwK # Aq3BQ8wL9/UtUQDrI3yRVS6VPzEyTigJQZ6GAunsqcH9F/2KrqdNxCAJOPcRhPCH # vkPLXCsAvq3pT3H0+Umk/AfDILnCyQsN7nUh0Q6d6vk8Ow6LNtGZmGKwJQVt3MzX # BMC3Y8VhAZ9FPZEqRWb/c36Ronnk37357ODiOqGCAyAwggMcBgkqhkiG9w0BCQYx # ggMNMIIDCQIBATB3MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1 # NiBUaW1lU3RhbXBpbmcgQ0ECEAuuZrxaun+Vh8b56QTjMwQwDQYJYIZIAWUDBAIB # BQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0y # NTA0MTYxOTU4MjFaMC8GCSqGSIb3DQEJBDEiBCBH4aKc/76jM4cGM1O7ggh4+L1T # fCbkSUZQYGzfHO/N2jANBgkqhkiG9w0BAQEFAASCAgBEUxnlEXGS8RPLCgIpdm+M # 1zCYuGdEzl5CrBOQX6Uiq08kZHKLkpsXyTReaSLCiK+5K2MamSBVYQUAn3zCv8G0 # RcQ2up8VMqz7+y0sACkGQt/kyarzXsru6UEfVWILadRns+Ru2O3isFtRdPdyIrk0 # SK2LYJhhtEPesAVK7EUV38WcpBTyJsX8huUEdnuM8N3aev2HPCMBSKZGeuhE+kLa # TIJSvmES1hSkRJiPQItc9IO0gxvhWE6zEDUi1Uei1NS7hvFeDqF6KojoCSahbFpU # Y2ZUfQDAiNsXJV/N+xV1fkLry8b450a2MN13W0BcXsL6/c9ho2E7n3eDKDQ6p14X # J4EA3hS3C8a2v1vmQCMkIin7d1+E7X6kZaS7QgeYTA2HszdaCuFf+Os1Bv535kA2 # nR2z4z5S7sWxCw2+NlxVfz8RvR9IBIvt4VTuWw/98Gntr+pfJYrlXselGwRPkVCz # 4LrxQAhr6fKMaRx3Z5pA5lYMuUwTr9jAahYmDQvx52AfDx9rV0yl/AvK+XXHZlok # wLiMnldDewLZp/EV6hs7OiILTUqL6MgkEL/OFXi4WzGbzX6EpVbZJX8rGzGwNC3Q # 5c4opYBEEgCxAnuFq7zaMRTa5lYWqppmgrhGvpuzkurKG6xO9j7PMzn98mUPN0IT # IdVSqIVkrznyib1UWi1Mzw== # SIG # End signature block |