Public/Update-ADFSTkInstitutionConfiguration.ps1
function Update-ADFSTkInstitutionConfiguration { [CmdletBinding(SupportsShouldProcess=$true)] param( $ConfigurationFile ) #This is ther version we can upgrade to $currentConfigVersion = '1.2' #Get All paths if ([string]::IsNullOrEmpty($Global:ADFSTkPaths)) { $Global:ADFSTkPaths = Get-ADFSTKPaths } #Create main dirs ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.mainDir -PathName "ADFSTk install directory" #C:\ADFSToolkit ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.mainConfigDir -PathName "Main configuration" #C:\ADFSToolkit\config ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.mainBackupDir -PathName "Main backup" #C:\ADFSToolkit\config\backup ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.cacheDir -PathName "Cache directory" #C:\ADFSToolkit\cache ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.institutionDir -PathName "Institution config directory" #C:\ADFSToolkit\config\institution ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.institutionBackupDir -PathName "Institution backup directory" #C:\ADFSToolkit\config\institution\backup ADFSTk-TestAndCreateDir -Path $Global:ADFSTkPaths.federationDir -PathName "Federation config directory" #C:\ADFSToolkit\config\federation try { $mainConfiguration = Get-ADFSTkConfiguration } catch { #inform that we need a main config and that we will call that now Write-ADFSTkHost confNeedMainConfigurationMessage -Style Info $mainConfiguration = New-ADFSTkConfiguration -Passthru } $defaultConfigFile = $Global:ADFSTkPaths.defaultConfigFile $federationName = $mainConfiguration.FederationConfig.Federation.FederationName if (![string]::IsNullOrEmpty($federationName)) { $defaultFederationConfigDir = Join-Path $Global:ADFSTkPaths.federationDir $federationName #Check if the federation dir exists and if not, create it ADFSTk-TestAndCreateDir -Path $defaultFederationConfigDir -PathName "$federationName config directory" Write-ADFSTkHost -WriteLine -AddSpaceAfter Write-ADFSTkHost confCopyFederationDefaultFolderMessage -Style Info -AddSpaceAfter -f $defaultFederationConfigDir Read-Host (Get-ADFSTkLanguageText cPressEnterKey) | Out-Null $allDefaultFederationConfigFiles = Get-ChildItem -Path $defaultFederationConfigDir -Filter "*_defaultConfigFile.xml" -Recurse if ($allDefaultFederationConfigFiles -eq $null) { $defaultFederationConfigFile = $null } elseif ($allDefaultFederationConfigFiles -is [System.IO.FileSystemInfo]) { $defaultFederationConfigFile = $allDefaultFederationConfigFiles.FullName } elseif ($allDefaultFederationConfigFiles -is [System.Array]) { $defaultFederationConfigFile = $allDefaultFederationConfigFiles | Out-GridView -Title (Get-ADFSTkLanguageText confSelectDefaultFedConfigFile) -OutputMode Single | Select -ExpandProperty Fullname } else { #We should never be here... } if ([string]::IsNullOrEmpty($defaultFederationConfigFile)) { if (!(Get-ADFSTkAnswer (Get-ADFSTkLanguageText confFederationDefaultConfigNotFoundQuestion -f $federationName) -DefaultYes)) { Write-ADFSTkLog (Get-ADFSTkLanguageText confFederationDefaultConfigNotFound) -MajorFault } } else { try { [xml]$defaultFederationConfig = Get-Content $defaultFederationConfigFile if ($defaultFederationConfig.configuration.ConfigVersion -ne $currentConfigVersion) { Write-ADFSTkHost confNotAValidVersionWarning -Style Attention } } catch { Write-ADFSTkLog (Get-ADFSTkLanguageText confCouldNotOpenFederationDefaultConfig -f $defaultFederationConfig,$_) -MajorFault } } } #Try to open default config try { [xml]$defaultConfig = Get-Content $defaultConfigFile } catch { Write-ADFSTkLog (Get-ADFSTkLanguageText confCouldNotOpenDefaultConfig -f $defaultConfigFile,$_) -MajorFault } #region Select Institution config(s) $selectedConfigs = @() if ($PSBoundParameters.ContainsKey('ConfigurationFile')) { if (!(Test-Path $ConfigurationFile)) { Write-ADFSTkLog (Get-ADFSTkLanguageText cFileDontExist -f $ConfigurationFile) -MajorFault } $selectedConfigs += Add-ADFSTkConfigurationItem -ConfigurationItem $ConfigurationFile -PassThru } else { $allCurrentConfigs = Get-ADFSTkConfiguration -ConfigFilesOnly if ([string]::IsNullOrEmpty($allCurrentConfigs)) { $currentConfigs = @() $currentConfigs += Get-ChildItem $Global:ADFSTkPaths.mainDir -Filter '*.xml' ` -Recurse | ? {$_.Directory.Name -notcontains 'cache' -and ` $_.Directory.Name -notcontains 'federation' -and` $_.Name -ne 'config.ADFSTk.xml' -and -not` $_.Name.EndsWith('_defaultConfigFile.xml') -and ` $_.Directory.Name -notcontains 'backup'} | ` Select Directory, Name, LastWriteTime | ` Sort Directory,Name if ($currentConfigs.Count -eq 0) { Write-ADFSTkLog (Get-ADFSTkLanguageText confNoInstConfFiles) -MajorFault } #Add all selected federation config files to ADFSTk configuration $selectedConfigsTemp = $currentConfigs | Out-GridView -Title (Get-ADFSTkLanguageText confSelectInstConfFileToHandle) -PassThru foreach ($selectedConfig in $selectedConfigsTemp) { #Check if it's an old file that neds to be copied to the institution dir if ($selectedConfig.Directory -ne $Global:ADFSTkPaths.institutionDir) { #Copy the configuration file to new location $newFileName = Join-Path $Global:ADFSTkPaths.institutionDir $selectedConfig.Name if (Test-Path $newFileName) { Write-ADFSTkLog (Get-ADFSTkLanguageText confInstConfFileAlreadyUpgraded -f (Join-Path $selectedConfig.Directory $selectedConfig.name), $newFileName) -MajorFault } else { Copy-Item (Join-Path $selectedConfig.Directory $selectedConfig.name) $newFileName $selectedConfig.Directory = $Global:ADFSTkPaths.institutionDir } #Copy the ManualSP file to new location [xml]$selectedConfigSettings = Get-Content (Join-Path $selectedConfig.Directory $selectedConfig.name) $selectedConfigManualSP = $selectedConfigSettings.configuration.LocalRelyingPartyFile $oldManualSPFile = Join-Path $selectedConfig.Directory $selectedConfigManualSP $newManualSPFile = Join-Path $Global:ADFSTkPaths.institutionDir $selectedConfigManualSP if (Test-Path $oldManualSPFile) { if (Test-Path $newManualSPFile) { Write-ADFSTkLog (Get-ADFSTkLanguageText confManualSPFileAlreadyExists -f $oldManualSPFile, $Global:ADFSTkPaths.institutionDir) -EntryType Warning } else { Copy-Item $oldManualSPFile $newManualSPFile Write-ADFSTkLog (Get-ADFSTkLanguageText confManualSPFileCopied -f $oldManualSPFile, $Global:ADFSTkPaths.institutionDir) -EntryType Information } } } $selectedConfigs += Add-ADFSTkConfigurationItem -ConfigurationItem (Join-Path $selectedConfig.Directory $selectedConfig.Name) -PassThru } } else { $selectedConfigs += $allCurrentConfigs | Out-GridView -Title (Get-ADFSTkLanguageText confSelectInstConfFileToHandle) -PassThru } } if ($selectedConfigs.Count -eq 0) { Write-ADFSTkLog (Get-ADFSTkLanguageText confNoInstConfigFileSelectedborting) -MajorFault } #endregion #region Handle each institution config file foreach ($configFile in $selectedConfigs) { Write-ADFSTkHost confProcessingInstConfig -f $configFile.configFile -AddLinesOverAndUnder -Style Info $continue = $true try { [xml]$config = Get-Content $configFile.ConfigFile } catch { Write-ADFSTkLog (Get-ADFSTkLanguageText confCouldNotOpenInstConfigFile -f $_) -EntryType Error $continue = $false } if ($continue) { if ([string]::IsNullOrEmpty($config.configuration.ConfigVersion)) { Write-ADFSTkLog (Get-ADFSTkLanguageText confCouldNotRetrieveVersion) -EntryType Error } elseif ($config.configuration.ConfigVersion -eq $currentConfigVersion) { Write-ADFSTkLog (Get-ADFSTkLanguageText confInstConfAlreadyCorrectVersion -f $currentConfigVersion) -EntryType Information } else { $oldConfigVersion = $config.configuration.ConfigVersion $configFileObject = Get-ChildItem $configFile.configFile #Check if the config is enabled and disable it if so if ($configFile.Enabled) { Write-ADFSTkHost confInstitutionConfigEnabledWarning -Style Attention Set-ADFSTkInstitutionConfiguration -ConfigurationItem $configFile.configFile -Status Disabled } #First take a backup of the current file if (!(Test-Path $Global:ADFSTkPaths.institutionBackupDir)) { Write-ADFSTkVerboseLog -Message (Get-ADFSTkLanguageText cFileDontExist -f $Global:ADFSTkPaths.institutionBackupDir) New-Item -ItemType Directory -Path $Global:ADFSTkPaths.institutionBackupDir | Out-Null Write-ADFSTkVerboseLog -Message (Get-ADFSTkLanguageText cCreated) } $backupFilename = "{0}_backup_v{3}_{1}{2}" -f $configFileObject.BaseName, (Get-Date).tostring("yyyyMMdd_HHmmss"), $configFile.Extension, $config.configuration.ConfigVersion $backupFile = Join-Path $Global:ADFSTkPaths.institutionBackupDir $backupFilename Copy-Item -Path $configFile.configFile -Destination $backupFile | Out-Null Write-ADFSTkLog (Get-ADFSTkLanguageText confOldConfBackedUpTo -f $backupFile) -ForegroundColor Green ###Now lets upgrade in steps!### $RemoveCache = $false #v0.9 --> v1.0 $currentVersion = '0.9' $newVersion = '1.0' if ($config.configuration.ConfigVersion -eq $currentVersion) { Write-ADFSTkVerboseLog (Get-ADFSTkLanguageText confUpdatingInstConfigFromTo -f $currentVersion, $newVersion) if ($config.configuration.LocalRelyingPartyFile -eq $null) { Add-ADFSTkXML -XPathParentNode "configuration" -NodeName "LocalRelyingPartyFile" -RefNodeName "MetadataCacheFile" } Update-ADFSTkXML -XPath "configuration/LocalRelyingPartyFile" -ExampleValue 'get-ADFSTkLocalManualSPSettings.ps1' $config.configuration.ConfigVersion = $newVersion $config.Save($configFile.configFile); } #v1.0 --> v1.1 $currentVersion = '1.0' $newVersion = '1.1' if ($config.configuration.ConfigVersion -eq $currentVersion) { Write-ADFSTkVerboseLog (Get-ADFSTkLanguageText confUpdatingInstConfigFromTo -f $currentVersion, $newVersion) if ($config.configuration.eduPersonPrincipalNameRessignable -eq $null) { Add-ADFSTkXML -XPathParentNode "configuration" -NodeName "eduPersonPrincipalNameRessignable" -RefNodeName "MetadataPrefixSeparator" } Update-ADFSTkXML -XPath "configuration/eduPersonPrincipalNameRessignable" -ExampleValue 'true/false' $config.configuration.ConfigVersion = $newVersion $config.Save($configFile.configFile); $RemoveCache = $true } #v1.1 --> v1.2 $currentVersion = '1.1' $newVersion = '1.2' if ($config.configuration.ConfigVersion -eq $currentVersion) { Write-ADFSTkVerboseLog (Get-ADFSTkLanguageText confUpdatingInstConfigFromTo -f $currentVersion, $newVersion) Remove-ADFSTkXML -XPath 'configuration/WorkingPath' Remove-ADFSTkXML -XPath 'configuration/ConfigDir' Remove-ADFSTkXML -XPath 'configuration/CacheDir' foreach ($store in $config.configuration.storeConfig.stores.store) { if ([string]::IsNullOrEmpty($store.storetype)) { $store.SetAttribute('storetype', $store.name) 'issuer', 'type', 'order' | % { $attributeValue = $store.$_ if (![string]::IsNullOrEmpty($attributeValue)) { $store.RemoveAttribute($_) $store.SetAttribute($_,$attributeValue) } } } } #$RemoveCache = $true $config.configuration.ConfigVersion = $newVersion $config.Save($configFile.configFile); } Write-ADFSTkLog (Get-ADFSTkLanguageText confUpdatedInstConfigDone -f $configFile.configFile, $oldConfigVersion, $currentConfigVersion) -EntryType Information } } } Write-ADFSTkLog (Get-ADFSTkLanguageText confUpdatedInstConfigAllDone) -EntryType Information #if ($RemoveCache -and Get-ADFSTkAnswer "We recommend you start over without cache OK?") #{ #} #endregion } #endregion function Add-ADFSTkXML { param ( $NodeName, $XPathParentNode, $RefNodeName, $Value = [string]::Empty ) $configurationNode = Select-Xml -Xml $config -XPath $XPathParentNode $configurationNodeChild = $config.CreateNode("element",$NodeName,$null) $configurationNodeChild.InnerText = $Value #$configurationNode.Node.AppendChild($configurationNodeChild) | Out-Null $refNode = Select-Xml -Xml $config -XPath "$XPathParentNode/$RefNodeName" $configurationNode.Node.InsertAfter($configurationNodeChild, $refNode.Node) | Out-Null } function Update-ADFSTkXML { param ( $XPath, $ExampleValue ) $params = @{ XPath = $XPath ExampleValue = $ExampleValue NewConfig = $config } $defaultFederationConfigNode = $null if (![string]::IsNullOrEmpty($defaultFederationConfig)) { $defaultFederationConfigNode = Select-Xml -Xml $defaultFederationConfig -XPath $XPath } if ([string]::IsNullOrEmpty($defaultFederationConfigNode)) { $params.DefaultConfig = $defaultConfig } else { $params.DefaultConfig = $defaultFederationConfig } Set-ADFSTkConfigItem @params } function Remove-ADFSTkXML { param ( $XPath ) $node = $config.SelectSingleNode($XPath) if (![string]::IsNullOrEmpty($null)) { $node.ParentNode.RemoveChild($node) | Out-Null } } # SIG # Begin signature block # MIIczwYJKoZIhvcNAQcCoIIcwDCCHLwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUzOhzJu+vNTfXy6wCMSpXLkcw # 6pOgghcwMIIEFDCCAvygAwIBAgILBAAAAAABL07hUtcwDQYJKoZIhvcNAQEFBQAw # VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV # BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0 # MTMxMDAwMDBaFw0yODAxMjgxMjAwMDBaMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQK # ExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRpbWVzdGFt # cGluZyBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlO9l # +LVXn6BTDTQG6wkft0cYasvwW+T/J6U00feJGr+esc0SQW5m1IGghYtkWkYvmaCN # d7HivFzdItdqZ9C76Mp03otPDbBS5ZBb60cO8eefnAuQZT4XljBFcm05oRc2yrmg # jBtPCBn2gTGtYRakYua0QJ7D/PuV9vu1LpWBmODvxevYAll4d/eq41JrUJEpxfz3 # zZNl0mBhIvIG+zLdFlH6Dv2KMPAXCae78wSuq5DnbN96qfTvxGInX2+ZbTh0qhGL # 2t/HFEzphbLswn1KJo/nVrqm4M+SU4B09APsaLJgvIQgAIMboe60dAXBKY5i0Eex # +vBTzBj5Ljv5cH60JQIDAQABo4HlMIHiMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB # Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTBHBgNV # HSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFs # c2lnbi5jb20vcmVwb3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2Ny # bC5nbG9iYWxzaWduLm5ldC9yb290LmNybDAfBgNVHSMEGDAWgBRge2YaRQ2XyolQ # L30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEATl5WkB5GtNlJMfO7FzkoG8IW # 3f1B3AkFBJtvsqKa1pkuQJkAVbXqP6UgdtOGNNQXzFU6x4Lu76i6vNgGnxVQ380W # e1I6AtcZGv2v8Hhc4EvFGN86JB7arLipWAQCBzDbsBJe/jG+8ARI9PBw+DpeVoPP # PfsNvPTF7ZedudTbpSeE4zibi6c1hkQgpDttpGoLoYP9KOva7yj2zIhd+wo7AKvg # IeviLzVsD440RZfroveZMzV+y5qKu0VN5z+fwtmK+mWybsd+Zf/okuEsMaL3sCc2 # SI8mbzvuTXYfecPlf5Y1vC0OzAGwjn//UYCAp5LUs0RGZIyHTxZjBzFLY7Df8zCC # BH0wggNloAMCAQICAxvnFTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEh # MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE # YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE0MDEwMTA3 # MDAwMFoXDTMxMDUzMDA3MDAwMFowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdB # cml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNv # bSwgSW5jLjExMC8GA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo # b3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx # +lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u # 9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94L # w7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd # fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7 # S13MMuyFYkMlNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsD # PAnrSTFcaUaz4EcCAwEAAaOCARcwggETMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P # AQH/BAQDAgEGMB0GA1UdDgQWBBQ6moUHEGcotu/2vQVBbiDBlNoP3jAfBgNVHSME # GDAWgBTSxLDSkdRMEXGzYcs9of7dqGrU4zA0BggrBgEFBQcBAQQoMCYwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmdvZGFkZHkuY29tLzAyBgNVHR8EKzApMCegJaAj # hiFodHRwOi8vY3JsLmdvZGFkZHkuY29tL2dkcm9vdC5jcmwwRgYDVR0gBD8wPTA7 # BgRVHSAAMDMwMQYIKwYBBQUHAgEWJWh0dHBzOi8vY2VydHMuZ29kYWRkeS5jb20v # cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAFkLU72ShhGnJHvtWzHPHR9s # cMW4br5Ou/a+l1DhMH+6KFxilMLjfjP3+0J2hduVHIwiWHUJDIhlZzkKFgnFoDiX # pMUjkz+0GKYBBkSR46dpJ7RaJX86tzLN3YT/KjgpM6TdZ7KF/qGIIBxQicjcKvZC # AzdM5ojf1a8k8rHD38y17OCZXrdJVCA8lBgMxxxSGEmkbeGzWAvJ2OzZrhwyjihw # DeL+pheehA+9V3CzWukfoIZTu+98/2kL4EjDt5MLyApUxKxdFGc3bMqlLzEIN6pu # b4y8m+JXXSSBr5eXnIStbKw3TGbzYZERIOS+MJ96pCkJsOE0X2R3GEBR34wwpq8w # ggSfMIIDh6ADAgECAhIRIdaZp2SXPvH4Qn7pGcxTQRQwDQYJKoZIhvcNAQEFBQAw # UjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKDAmBgNV # BAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzIwHhcNMTYwNTI0MDAw # MDAwWhcNMjcwNjI0MDAwMDAwWjBgMQswCQYDVQQGEwJTRzEfMB0GA1UEChMWR01P # IEdsb2JhbFNpZ24gUHRlIEx0ZDEwMC4GA1UEAxMnR2xvYmFsU2lnbiBUU0EgZm9y # IE1TIEF1dGhlbnRpY29kZSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB # CgKCAQEAsBeuotO2BDBWHlgPse1VpNZUy9j2czrsXV6rJf02pfqEw2FAxUa1WVI7 # QqIuXxNiEKlb5nPWkiWxfSPjBrOHOg5D8NcAiVOiETFSKG5dQHI88gl3p0mSl9Rs # kKB2p/243LOd8gdgLE9YmABr0xVU4Prd/4AsXximmP/Uq+yhRVmyLm9iXeDZGayL # V5yoJivZF6UQ0kcIGnAsM4t/aIAqtaFda92NAgIpA6p8N7u7KU49U5OzpvqP0liT # FUy5LauAo6Ml+6/3CGSwekQPXBDXX2E3qk5r09JTJZ2Cc/os+XKwqRk5KlD6qdA8 # OsroW+/1X1H0+QrZlzXeaoXmIwRCrwIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQD # AgeAMEwGA1UdIARFMEMwQQYJKwYBBAGgMgEeMDQwMgYIKwYBBQUHAgEWJmh0dHBz # Oi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAkGA1UdEwQCMAAwFgYD # VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny # bC5nbG9iYWxzaWduLmNvbS9ncy9nc3RpbWVzdGFtcGluZ2cyLmNybDBUBggrBgEF # BQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j # b20vY2FjZXJ0L2dzdGltZXN0YW1waW5nZzIuY3J0MB0GA1UdDgQWBBTUooRKOFoY # f7pPMFC9ndV6h9YJ9zAfBgNVHSMEGDAWgBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTAN # BgkqhkiG9w0BAQUFAAOCAQEAj6kakW0EpjcgDoOW3iPTa24fbt1kPWghIrX4RzZp # juGlRcckoiK3KQnMVFquxrzNY46zPVBI5bTMrs2SjZ4oixNKEaq9o+/Tsjb8tKFy # v22XY3mMRLxwL37zvN2CU6sa9uv6HJe8tjecpBwwvKu8LUc235IgA+hxxlj2dQWa # NPALWVqCRDSqgOQvhPZHXZbJtsrKnbemuuRQ09Q3uLogDtDTkipbxFm7oW3bPM5E # ncE4Kq3jjb3NCXcaEL5nCgI2ZIi5sxsm7ueeYMRGqLxhM2zPTrmcuWrwnzf+tT1P # mtNN/94gjk6Xpv2fCbxNyhh2ybBNhVDygNIdBvVYBAexGDCCBNAwggO4oAMCAQIC # AQcwDQYJKoZIhvcNAQELBQAwgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 # b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwg # SW5jLjExMC8GA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3Jp # dHkgLSBHMjAeFw0xMTA1MDMwNzAwMDBaFw0zMTA1MDMwNzAwMDBaMIG0MQswCQYD # VQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEa # MBgGA1UEChMRR29EYWRkeS5jb20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0 # cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2Vj # dXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMIIBIjANBgkqhkiG9w0BAQEF # AAOCAQ8AMIIBCgKCAQEAueDLENSvdr3Uk2LrMGS4gQhswwTZYheOL/8+Zc+PzmLm # PFIc2hZFS1WreGtjg2KQzg9pbJnIGhSLTMxFM+qI3J6jryv+gGGdeVfEzy70PzA8 # XUf8mha8wzeWQVGOEUtU+Ci+0Iy+8DA4HvOwJvhmR2Nt3nEmR484R1PRRh2049wA # 6kWsvbxx2apvANvbzTA6eU9fTEf4He9bwsSdYDuxskOR2KQzTuqz1idPrSWKpcb0 # 1dCmrnQFZFeItURV1C0qOj74uL3pMgoClGTEFjpQ8Uqu53kzrwwgB3/o3wQ5wmkC # bGNS+nfBG8h0h8i5kxhQVDVLaU68O9NJLh/cwdJS+wIDAQABo4IBGjCCARYwDwYD # VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFEDCvSeOzDSD # MKIz1/tss/C0LIDOMB8GA1UdIwQYMBaAFDqahQcQZyi27/a9BUFuIMGU2g/eMDQG # CCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRkeS5j # b20vMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Ry # b290LWcyLmNybDBGBgNVHSAEPzA9MDsGBFUdIAAwMzAxBggrBgEFBQcCARYlaHR0 # cHM6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsF # AAOCAQEACH5skxDIOLiWqZBL/6FfTwTvbD6ciAbJUI+mc/dXMRu+vOQv2/i601vg # tOfmeWIODKLXamNzMbX1qEikOwgtol2Q17R8JU8RVjDEtkSdeyyd5V7m7wxhqr/k # KhvuhJ64g33BQ85EpxNwDZEf9MgTrYNg2dhyqHMkHrWsIg7KF4liWEQbq4klAQAP # zcQbYttRtNMPUSqb9Lxz/HbONqTN2dgs6q6b9SqykNFNdRiKP4pBkCN9W0v+pANY # m0ayw2Bgg/h9UEHOwqGQw7vvAi/SFVTuRBXZCq6nijPtsS12NibcBOuf92EfFdyH # b+5GliitoSZ9CgmnLgSjjbz4vAQwATCCBRwwggQEoAMCAQICCDeMqUwECkf0MA0G # CSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTET # MBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5jb20sIEluYy4x # LTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzEz # MDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAt # IEcyMB4XDTIwMDEwODExMjIyNFoXDTIxMDMwODE4NTgwMFowXjELMAkGA1UEBhMC # Q0ExEDAOBgNVBAgTB09udGFyaW8xDzANBgNVBAcTBk90dGF3YTEVMBMGA1UEChMM # Q0FOQVJJRSBJbmMuMRUwEwYDVQQDEwxDQU5BUklFIEluYy4wggEiMA0GCSqGSIb3 # DQEBAQUAA4IBDwAwggEKAoIBAQDZhfCjFqiTmN1uLoySixnwaOjf/ZAL9P6SvjlC # aBA2mutoorEgnzUP8HnOIcvMRgEMPmpaZ8egM93Bmx9d41xoarsQpCN3DhYOo+b3 # fWnPucVtpxbul2OFePv63mw/uvr+dqkv4b/f3Tg+ilQbpsNonbvh9MKEFv8Pn9ko # j0ySV+qxz34PxTVAe6g//pel3/3i9fqilCnIEcx4zg/+NKBeOWROSs4oXo3IvBjV # runmz+YuieSr78TqIE6hD8JF2q1wKwfMB3+x7dEXZAus9WtIU/qITATtEfO9QAgr # rYL4F1MLN+osSp8my5eCOjnLTQc47q574V3zQhsIHW7yBXLdAgMBAAGjggGFMIIB # gTAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA4GA1UdDwEB/wQE # AwIHgDA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vY3JsLmdvZGFkZHkuY29tL2dk # aWcyczUtNS5jcmwwXQYDVR0gBFYwVDBIBgtghkgBhv1tAQcXAjA5MDcGCCsGAQUF # BwIBFitodHRwOi8vY2VydGlmaWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkv # MAgGBmeBDAEEATB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v # Y3NwLmdvZGFkZHkuY29tLzBABggrBgEFBQcwAoY0aHR0cDovL2NlcnRpZmljYXRl # cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5L2dkaWcyLmNydDAfBgNVHSMEGDAWgBRA # wr0njsw0gzCiM9f7bLPwtCyAzjAdBgNVHQ4EFgQUUPnMg2nmYS8l7rmax3weVkrg # z5AwDQYJKoZIhvcNAQELBQADggEBAIYabiARaY4KhO6oWgNHPOBjoHuqUH7NwRGN # /ztYJznRBZbdD50smoK5GR0FvUZ8TXhYoZOazXe4NlFM4e6YcudU+EA/OF+sZHFB # Wziz1VS6U3sS+cGyJcxvelSoid0q3W3i9/Zy6Nv2kk/DEJp49O47mPNovpL15yyk # X3Vo26GwC9peo4s/cKMzthmgrcF2uLkT+LW44xKhaL7nBTGDMhjno+a3t00SWCId # 7wzgQadIJ1QlFOKm0xgmuiW3LIqCG0apvaOfvWKTPKq68q+FbDPOO48oKrvw1c9K # /m8gcnBLz6PX1REVIs5u3pvdOYBCz6uXyKxnt+Q5jDEK0NskLu0xggUJMIIFBQIB # ATCBwTCBtDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcT # ClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMS0wKwYDVQQL # EyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8xMzAxBgNVBAMT # KkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgIIN4yp # TAQKR/QwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJ # KoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQB # gjcCARUwIwYJKoZIhvcNAQkEMRYEFPWxkOP03NlfVvHvUjEpdwlLGDbOMA0GCSqG # SIb3DQEBAQUABIIBABTysfSMav8cpzGOi6vGVkytWMrBObLCTpCW9Jtp9eIbwglj # XO+IC7+s5RG7uL3FmPh/SRmae+TruCogBTnLhPtKFlPjztQoLHiRjP2vsiCm+URp # ITr5GY/Z85Nx4y93/9EiL6I79YHUfDsojuSWiKB89/7Aj3nIYGrRnRqNJGfygnV1 # qgrjOP81xwi3JVq5uWx6QliiH2ZjNajAr+dwiIZm7imLlTKvxhOcwTksAdUpjUe4 # TuPZAxwskTXRwhQulvKakNJE8O5V5mTHYhraqy1Rc3FwbB8NQpN7OUTH31TXoCSI # IWAM8gFNZ9yeBeRU4rwhzpG9qiAPIKQYvZzmUwWhggKiMIICngYJKoZIhvcNAQkG # MYICjzCCAosCAQEwaDBSMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2ln # biBudi1zYTEoMCYGA1UEAxMfR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBH # MgISESHWmadklz7x+EJ+6RnMU0EUMAkGBSsOAwIaBQCggf0wGAYJKoZIhvcNAQkD # MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjAwNTEyMTM0MTM0WjAjBgkq # hkiG9w0BCQQxFgQULY1Fz3HKEveA9CpBwBzIuocvSR0wgZ0GCyqGSIb3DQEJEAIM # MYGNMIGKMIGHMIGEBBRjuC+rYfWDkJaVBQsAJJxQKTPseTBsMFakVDBSMQswCQYD # VQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEoMCYGA1UEAxMfR2xv # YmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBHMgISESHWmadklz7x+EJ+6RnMU0EU # MA0GCSqGSIb3DQEBAQUABIIBAF5Ex6BwKsO03/X32LSJU7YUJd/KbjMeqrwU8b/U # EGG11LxnVd+4Yn4vNPXUgaSvgJg/eRRlSR4Id6nOFI2zSCVx9I3Wv+Hmly6R6+6X # nnfQXyY8prEviPYyXmvKP6ADdGG0k0pxpEGHEG5buzONAl6aW/dg26g8l+GCK8T8 # 9IlTJ+zaWVhh9DtOZq1toMy7u/M0tx/NLq2KsbKgEsHm/YnSqdsEEMEbN6b8SZNc # F/gZWiBbXeimra2PRXzauh1Dp6o6FhV+L9I2gp/lseiNAJ+7foB6pZUiBmC/UnFG # +63a1D1bKljHwk/PNrY+MJLCmpnXbmQNuSWBSmJGVsw1Wbs= # SIG # End signature block |