Migrate-Aadds.ps1
<#PSScriptInfo
.VERSION 1.1 .GUID 723874e6-7a38-4bde-b7f5-8627c18fd10c .AUTHOR aaddsfb@microsoft.com .COMPANYNAME Microsoft Corporation .COPYRIGHT (c) Microsoft Corporation .TAGS Azure-AD-Domain-Services Migration .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES 10/18/2019 - Initial release 12/04/2019 - Ensure well-formed subnetids during abort #> <# .SYNOPSIS Migrates an Azure AD Domain Services from a classic virtual network to an Azure Resource Manager virtual network. .DESCRIPTION Migrates an Azure AD Domain Services from a classic virtual network to an Azure Resource Manager virtual network. .PARAMETER Prepare [MANADATORY] Causes the script to prepare the classic Azure AD Domain Service resource for migration. .PARAMETER Commit [MANADATORY] Causes the script to commit the migration for the prepared classic Azure AD Domain Service resource. .PARAMETER Abort [MANADATORY] Causes the script to abort the migration and reverts the classic Azure AD Domain Service to a running state. .PARAMETER ManagedDomainFqdn [MANADATORY] The fqdn of the managed domain (aadds.corp.contoso.com). .PARAMETER VirtualNetworkResourceGroupName [MANDATORY] The name of the Azure Resource Manager resource group that hosts the virtual network to which Azure AD Domain Services will be moved. .PARAMETER VirtualNetworkName [MANDATORY] The name of the Azure Resource Manager virtual network to which Azure AD Domain Services will be moved. .PARAMETER VirtualSubnetName [MANADATORY] The name of the Azure Resource Manager virtual subnet to which Azure AD Domain Services will be moved. .PARAMETER ClassicVirtualNetworkName [MANADATORY] The name of the Classic Virtual Network on which Azure AD Domain Services was enabled. This is only required for Abort case .PARAMETER SubscriptionId [OPTIONAL] The Azure subscription that hosts the Azure AD Domain Services resource. .PARAMETER Credential [OPTIONAL] The credentials used to authenticate to Azure. #> [CmdletBinding()] Param ( [Parameter( Mandatory=$true, ParameterSetName="Prepare")] [switch] $Prepare, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [switch] $Commit, [Parameter( Mandatory=$true, ParameterSetName="Abort")] [switch] $Abort, [Parameter( Mandatory=$true, ParameterSetName="Prepare")] [Parameter( Mandatory=$true, ParameterSetName="Commit")] [Parameter( Mandatory=$true, ParameterSetName="Abort")] [string] $ManagedDomainFqdn, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [string] $VirtualNetworkResourceGroupName, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [string] $VirtualNetworkName, [Parameter( Mandatory=$true, ParameterSetName="Abort")] [string] $ClassicVirtualNetworkName, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [string] $VirtualSubnetName, [Parameter( Mandatory=$false, ParameterSetName="Prepare")] [Parameter( Mandatory=$false, ParameterSetName="Commit")] [Parameter( Mandatory=$false, ParameterSetName="Abort")] [pscredential] $SubscriptionId, [Parameter( Mandatory=$false, ParameterSetName="Prepare")] [Parameter( Mandatory=$false, ParameterSetName="Commit")] [Parameter( Mandatory=$false, ParameterSetName="Abort")] [pscredential] $Credentials ) Process { enum actionType { Unknown Prepare Commit Abort } $subscription = $null $aadds = $null $creds = $null $azProfile = $null $action =[actionType]::Unknown # # Check for the requested action if($true -eq $Prepare) { $action = [actionType]::Prepare } elseif($true -eq $Commit) { $action = [actionType]::Commit } elseif($true -eq $Abort) { $action = [actionType]::Abort } if($action -eq [actionType]::Unknown) { Write-Host -ForegroundColor Red "ERROR: Unknown action type." return } ## check for subscriptionID if($null -ne $SubscriptionId) { $subscription = $SubscriptionId } Write-Host ([string]::Empty) Write-Host ([string]::Empty) Write-Host "Authenticating to Azure... " -NoNewline # # Collect credentials from the user for authentication if($null -eq $Credentials) { $creds = Get-Credential -ErrorAction SilentlyContinue $azProfile = Connect-AzAccount -Credential $creds -ErrorAction SilentlyContinue } else { $azProfile = Connect-AzAccount -Credential $Credentials -ErrorAction SilentlyContinue } if($null -eq $azProfile) { # Authentication failed Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red "ERROR: Could not authenticate to Azure. Check your credentials and try again." Return } else { Write-Host -ForegroundColor Green "[Success!]" } Write-Host ("Authenticated to Azure as {0}..." -f $azProfile.Context.Account.Id) # # Check for user provided subscription Id if($null -eq $subscription) { # # Locate Azure AD Domain Services in a subscription # Use the first instance found as there should only be one instance per tenant Write-Host "Searching for Azure AD Domain Service instance..." -NoNewline ($AzSubs = Get-AzSubscription) | Out-Null foreach($azsub in $AzSubs) { (Select-AzSubscription $azsub.Id) | Out-Null $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue if($null -ne $aadds) { # Found Azure AD DS in this subscription # Add to the subscription List $subscription = $azsub.Id break } } if($null -eq $subscription) { Write-Host -ForegroundColor Red "[Failed!"] Write-Host -ForegroundColor Red "ERROR: Could not find a subscription that has Azure AD Domain Services." return } else { Write-Host -ForegroundColor Green "[Found!]" } } else { Select-AzSubscription $subscription -ErrorAction SilentlyContinue $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue } # # Validate the resource is Azure AD Domain Services $pass = $true Write-Host "Validating resource type..." -NoNewline if($aadds.ResourceType -ne "Microsoft.AAD/domainServices") { $pass = $false Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red "ERROR: The resource is not an AAD DS resource (Status:$($aadds.ResourceType))." } else {Write-Host -ForegroundColor Green "[Pass!]"} # # Validate service status Write-Host "Validating service status..." -NoNewline # # If the action is commit, this should equal PreparedForMigration if( ("commit" -eq $action) -or ("abort" -eq $action)) { if("PreparedForMigration" -ne $aadds.properties.serviceStatus ) { $pass = $false Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} must be prepared prior to this command (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus) } else { Write-Host -ForegroundColor Green "[Pass!]" } } else { if( ("FailedToPrepareForMigration" -ne $aadds.Properties.ServiceStatus -and "Running" -ne $aadds.properties.serviceStatus) ) { $pass = $false Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} is not in a state that can be prepared (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus) } else { Write-Host -ForegroundColor Green "[Pass!]" } } if($pass -eq $false) { Write-Host -ForegroundColor Red "ERROR: One or more prerequisites checks failed." Return } # # Do work based on the action $actionStart = Get-Date switch($action) { "Prepare" { Write-Host "It is important you let the script complete" Write-Host "The preparation may take up to 30 minutes. Please wait..." Write-Host ([String]::Empty) $consent = Read-Host -Prompt ("Do you want to prepare {0} for migration: (Y/N)" -f $ManagedDomainFqdn) if("Y" -ne $consent) { Write-Host -ForegroundColor Yellow "[Canceled!] The user canceled the migration." return } Write-Host "Processing your request... " -NoNewline # Prepare the instance (Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $null} -Force) | Out-Null Write-Host -Foreground Green "[Preparation complete!]" Write-Host "Validating ..." -NoNewline $confirm = $null $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue if($null -eq $confirm) { Write-Host -ForegroundColor Yellow "[Undetermined!]" Write-Host -ForegroundColor Yellow "The script could not validate the preparation status." Write-Host -ForegroundColor Yellow ( "Please run {0} and check the serviceStatus value is 'PreparedForMigration'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties).Properties" ) return } ## Check the properties for successful migration if($confirm.properties.serviceStatus -ne "PreparedForMigration") { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} did not prepare (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus) } else { Write-Host -ForegroundColor Green "[Pass!]" Write-Host ([String]::Empty) Write-Host ([String]::Empty) Write-Host "Please turn off all virtual machines joined to Azure AD Domain Services." Write-Host "You may turn on these virtual machines after you complete the migration." Write-Host ([String]::Empty) Write-Host "When ready to complete the migration, run 'Migrate-Aadds' using the '-Commit' parameter." Write-Host "To complete the command, you will need to have the name of your new Azure Resource Manager virtual network and subnet." Write-Host ([String]::Empty) } break } "Commit" { $vnet = $null $subnet = $null # # Virtual network resource group name must exist to proceed if($null -eq $VirtualNetworkResourceGroupName) { Write-Host -ForegroundColor Red "ERROR: The virtual network resource group name cannot be blank or null." return } # # Virtual network is valid Write-Host "Validating virtual network..." -NoNewline if($null -eq $VirtualNetworkName) { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: Missing the name of the virtual network (VirtualNetwork:{0})." -f $VirtualNetworkName) return } else { # # Get the virtual network $vnet = Get-AzVirtualNetwork -Name $VirtualNetworkName -ResourceGroupName $VirtualNetworkResourceGroupName -ErrorAction SilentlyContinue if($null -eq $vnet) { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: Could not find the virtual network (VirtualNetwork:{0})." -f $VirtualNetworkName) return } } Write-Host -ForegroundColor Green "[Pass!]" # # Virtual subnet is valid Write-Host "Validating virtual subnet..." -NoNewline if($null -eq $VirtualSubnetName) { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: Missing the name of the virtual subnet (VirtualSubnet:{0})." -f $VirtualSubnetName) return } else { # # Get the virtual subnet $subnet = Get-AzVirtualNetworkSubnetConfig -Name $VirtualSubnetName -VirtualNetwork $vnet -ErrorAction SilentlyContinue if($null -eq $subnet) { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: Could not find the virtual subnet (VirtualSubnet:{0}." -f $VirtualSubnetName) return } } Write-Host -ForegroundColor Green "[Pass!]" # # Commit the move to the Azure AD DS resource Write-Host ([String]::Empty) Write-Host -ForegroundColor Cyan "IMPORTANT! DO NOT convert your classic virtual network while this script runs." Write-Host -ForegroundColor Cyan "Perform that operation after the migration is complete." Write-Host ([String]::Empty) Write-Host -ForegroundColor Cyan "It is important you let the script complete" Write-Host -ForegroundColor Cyan "The migration may take up to three (3) hours. Please wait..." Write-Host ([String]::Empty) Write-Host -ForegroundColor Cyan "IMPORTANT! Once started, you cannot stop the migration process nor can you revert the process once the migration completes." $consent = Read-Host -Prompt ("Do you want to migrate {0} (Y/N)" -f $ManagedDomainFqdn) if("Y" -ne $consent) { Write-Host -ForegroundColor Yellow "[Canceled!] The user canceled the migration." return } # # run the command in the background $job = Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $subnet.Id} -Force -AsJob Write-Host "Migration in progess. Progress refreshes every 2 minutes ..." Write-Host ([String]::Empty) Write-Progress -Activity "Migration" -Status ("Last Updated:{0}" -f [System.DateTime]::Now.ToString("G")) -CurrentOperation "Starting..." -PercentComplete 0 do { Start-Sleep -Seconds 120 $properties = (Get-AzResource -ResourceId $aadds.ResourceId).Properties $migrationProgress = $properties.MigrationProperties.MigrationProgress [int] $percentComplete = $migrationProgress.CompletionPercentage # # Precaution to ensure Write-Progress does not error if(101 -lt $percentComplete) { $percentComplete = 100 } Write-Progress -Activity "Migration" -Status ("Last Updated:{0}" -f [System.DateTime]::Now.ToString("G")) -CurrentOperation ("{0}" -f $migrationProgress.ProgressMessage) -PercentComplete $percentComplete } while ("PerformingMigration" -eq $properties.ServiceStatus) if("Completed" -ne $job.State) { Write-Host ([string]::Empty) Write-Host -ForegroundColor Red "Migration did not complete successfully." Write-Host -ForegroundColor Red ("ERROR: {0}" -f $job.ChildJobs[0].JobStateInfo.Reason) } else { Write-Progress -Activity "Migration" -Status ("Last Updated:{0}" -f [System.DateTime]::Now.ToString("G")) -Completed Write-Host -ForegroundColor Green "[Migration Complete!]" } # # Validate the migration was successful Write-Host "Validating ..." -NoNewline $confirm = $null $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue if($null -eq $confirm) { Write-Host -ForegroundColor Yellow "[Undetermined!]" Write-Host -ForegroundColor Yellow "The script could not validate the abort status." Write-Host -ForegroundColor Yellow ( "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties).Properties") return } # # Check the properties for successful migration if($confirm.properties.serviceStatus -ne "Running") { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} did not migrate successfully (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus) } else { Write-Host -ForegroundColor Green "[Pass!]" Write-Host ([String]::Empty) Write-Host ([String]::Empty) Write-Host "Migration of the first domain controller for Azure AD Domain Services completed successfully." Write-Host ("Migration of the second domain controller is active and should complete at approximately {0}." -f ([System.DateTime]::Now.AddHours(1).ToString("G"))) Write-Host ("After the second domain controller completes its migration, please update the DNS settings on the {0} virtual network." -f $VirtualNetworkName) Write-Host ([String]::Empty) } break } "Abort" { # # use the oldSubnetID property from the instance to rollback Write-Host "It is important you let the script complete" $oldSubnetId = $aadds.Properties.migrationProperties.oldSubnetID if($aadds.Properties.migrationProperties.oldSubnetID -inotmatch "/") { Write-Host "Old SubnetId is not in resource format. Value: $oldSubnetId... Converting to Resource format" #Get Vnet ResourceId $classicVnet = Get-AzResource -ResourceName $ClassicVirtualNetworkName $classicVnetResourceId = $classicVnet.ResourceId $oldSubnetName = $aadds.Properties.migrationProperties.oldSubnetID $oldSubnetId = $classicVnetResourceId + "/subnets/" + "$oldSubnetName" } Write-Host "Old SubnetId: $oldSubnetID" Write-Host "This process may take up to 30 minutes. Please wait..." Write-Host ([String]::Empty) $consent = Read-Host -Prompt ("Do you want to abort the migration for {0} (Y/N)" -f $ManagedDomainFqdn) if("Y" -ne $consent) { Write-Host -ForegroundColor Yellow "[Canceled!] The user canceled the migration." return } Write-Host "Processing your request... " (Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $oldSubnetId} -Force) | Out-Null # # Validate Write-Host -Foreground Green "[Process Complete!]" Write-Host "Validating ..." -NoNewline $confirm = $null $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue if($null -eq $confirm) { Write-Host -ForegroundColor Yellow "[Undetermined!]" Write-Host -ForegroundColor Yellow "The script could not validate the abort status." Write-Host -ForegroundColor Yellow ( "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties).Properties") return } # # Check the properties for successful migration if($confirm.properties.serviceStatus -ne "Running") { Write-Host -ForegroundColor Red "[Failed!]" Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} did not abort its preparation for migration (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus) } else { Write-Host -ForegroundColor Green "[Pass!]" Write-Host ([String]::Empty) Write-Host ([String]::Empty) Write-Host "This instance of Azure AD Domain Services has returned to its original classic virtual network." Write-Host ([String]::Empty) } break } default { Write-Host -ForegroundColor Red "Unknown Command." } } $actionStop = Get-Date Write-Host "Elapsed Time: " ($actionStop - $actionStart) } # End Process # SIG # Begin signature block # MIInNwYJKoZIhvcNAQcCoIInKDCCJyQCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA85ZIG8pNAyuYl # h4BrhNpnTLqVyl92D60xtYD7DqoaDKCCEXAwggiCMIIHaqADAgECAhM2AAAA6Gad # G0hCpUxFAAEAAADoMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH # QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe # Fw0xOTAzMjUxMzE3MTBaFw0yMDAzMjQxMzE3MTBaMC8xLTArBgNVBAMTJE1pY3Jv # c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB # BQADggEPADCCAQoCggEBANzmuspUXRFHozpraZYcR8lLf8oaCK27bhl7agSI00Vc # GZy2slaHQ8JZ+Bqiao7e2hpEVxeJ0s9lfIUe30ye3RwDa7oNloC8u8fa/W0QusGD # T7p4c7wwbRJ5MrXowwB/nSgsOKtoCoJMpk6LDpRhgwhn4va4PjVrajBxrxN1eVIP # Kw1GPkzh3qkLQ0SIhuiYUlZur4HSG6Mdkl7jYk1ifVtNupf+FO4Nflw+ZRsczZUg # jo74fVEoBI9qzrZSkCg5wku1qGsTXrd9DtRgOQEEp96NruISfEb22ZZtpMrJg71H # p/oAEqqlOBN5FIjzWi+mxznE1CNMBNFCbtsZOvHVSJMCAwEAAaOCBYMwggV/MCkG # CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sCATAKBggrBgEFBQcDAzA9BgkrBgEE # AYI3FQcEMDAuBiYrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWCE2K5IhaaW # JgIBZAIBDTCCAnYGCCsGAQUFBwEBBIICaDCCAmQwYgYIKwYBBQUHMAKGVmh0dHA6 # Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DZXJ0cy9CWTJQS0lDU0NBMDEu # QU1FLkdCTF9BTUUlMjBDUyUyMENBJTIwMDEoMSkuY3J0MFIGCCsGAQUFBzAChkZo # dHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9CWTJQS0lDU0NBMDEuQU1FLkdCTF9BTUUl # MjBDUyUyMENBJTIwMDEoMSkuY3J0MFIGCCsGAQUFBzAChkZodHRwOi8vY3JsMi5h # bWUuZ2JsL2FpYS9CWTJQS0lDU0NBMDEuQU1FLkdCTF9BTUUlMjBDUyUyMENBJTIw # MDEoMSkuY3J0MFIGCCsGAQUFBzAChkZodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9C # WTJQS0lDU0NBMDEuQU1FLkdCTF9BTUUlMjBDUyUyMENBJTIwMDEoMSkuY3J0MFIG # CCsGAQUFBzAChkZodHRwOi8vY3JsNC5hbWUuZ2JsL2FpYS9CWTJQS0lDU0NBMDEu # QU1FLkdCTF9BTUUlMjBDUyUyMENBJTIwMDEoMSkuY3J0MIGtBggrBgEFBQcwAoaB # oGxkYXA6Ly8vQ049QU1FJTIwQ1MlMjBDQSUyMDAxLENOPUFJQSxDTj1QdWJsaWMl # MjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERD # PUFNRSxEQz1HQkw/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp # ZmljYXRpb25BdXRob3JpdHkwHQYDVR0OBBYEFMhZoWfS7cerFd3KJYxV4M3+DOEi # MA4GA1UdDwEB/wQEAwIHgDBQBgNVHREESTBHpEUwQzEpMCcGA1UECxMgTWljcm9z # b2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xFjAUBgNVBAUTDTIzNjE2OSs0NTMz # NzQwggHUBgNVHR8EggHLMIIBxzCCAcOgggG/oIIBu4Y8aHR0cDovL2NybC5taWNy # b3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o # dHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o # dHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o # dHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o # dHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3JshoG6 # bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QlkyUEtJQ1NDQTAxLENO # PUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1D # b25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/Y2VydGlmaWNhdGVSZXZvY2F0aW9u # TGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MB8GA1Ud # IwQYMBaAFBtmohn8m+ul2oSPGJjpEKTDe5K9MB8GA1UdJQQYMBYGCisGAQQBgjdb # AgEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUAA4IBAQCVZn2MgvVx6Lix7aYfjSp6 # t9NYHifbtXl3VxQk20PyxzmNbXoXHQMtgWioOWP4SaQ0Jpw23TgpczqPCS/BWy0E # t2iZ12XatAQRPqrsU4YKcTTExKEPa/gdOz63Okmi+5GQH78d53M5I39DJWzPja7d # RdZgASuswapduSUZMAFJJOslCFtBYAuzrJDy+UH2k7NZQ4+ExtFuuwZZA16c1IbQ # O9JwjGdYna9ZlNtWIc2RSDeNjX8St40y7hhxxrszktg13D1oGZX8+oeQBsPyzigY # U+5JuPoUWGkFBUL8LKR6z3wddTWFZWrW5zfy2aQTxSYOpRYNcUmuAYfLBVhSNI/j # MIII5jCCBs6gAwIBAgITHwAAABS0xR/G8oC+cQAAAAAAFDANBgkqhkiG9w0BAQsF # ADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRAw # DgYDVQQDEwdhbWVyb290MB4XDTE2MDkxNTIxMzMwM1oXDTIxMDkxNTIxNDMwM1ow # QTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMG # A1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC # AQEA1VeBAtb5+tD3G4C53TfNJNxmYfzhiXKtKQzSGxuav660bTS1VEeDDjSnFhsm # nlb6GkPCeYmCJwWgZGs+3oWJ8yad3//VoP99bXG8azzTJmT2PFM1yKxUXUJgi7I9 # y3C4ll/ATfBwbGGRXD+2PdkdlVpxKWzeNEPVwbCtxWjUhHr6Ecy9R6O23j+2/RSZ # SgfzYctDzDWhNf0PvGPflm31PSk4+ozca337/Ozu0+naDKg5i/zFHhfSJZkq5dPP # G6C8wDrdiwHh6G5IGrMd2QXnmvEfjtpPqE+G8MeWbszaWxlxEjQJQC6PBwn+8Qt4 # Vqlc0am3Z3fBw8kzRunOs8Mn/wIDAQABo4IE2jCCBNYwEAYJKwYBBAGCNxUBBAMC # AQEwIwYJKwYBBAGCNxUCBBYEFJH8M85CnvaT5uJ9VNcIGLu413FlMB0GA1UdDgQW # BBQbZqIZ/JvrpdqEjxiY6RCkw3uSvTCCAQQGA1UdJQSB/DCB+QYHKwYBBQIDBQYI # KwYBBQUHAwEGCCsGAQUFBwMCBgorBgEEAYI3FAIBBgkrBgEEAYI3FQYGCisGAQQB # gjcKAwwGCSsGAQQBgjcVBgYIKwYBBQUHAwkGCCsGAQUFCAICBgorBgEEAYI3QAEB # BgsrBgEEAYI3CgMEAQYKKwYBBAGCNwoDBAYJKwYBBAGCNxUFBgorBgEEAYI3FAIC # BgorBgEEAYI3FAIDBggrBgEFBQcDAwYKKwYBBAGCN1sBAQYKKwYBBAGCN1sCAQYK # KwYBBAGCN1sDAQYKKwYBBAGCN1sFAQYKKwYBBAGCN1sEAQYKKwYBBAGCN1sEAjAZ # BgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwEgYDVR0TAQH/ # BAgwBgEB/wIBADAfBgNVHSMEGDAWgBQpXlFeZK40ueusnA2njHUB0QkLKDCCAWgG # A1UdHwSCAV8wggFbMIIBV6CCAVOgggFPhiNodHRwOi8vY3JsMS5hbWUuZ2JsL2Ny # bC9hbWVyb290LmNybIYxaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJh # L2NybC9hbWVyb290LmNybIYjaHR0cDovL2NybDIuYW1lLmdibC9jcmwvYW1lcm9v # dC5jcmyGI2h0dHA6Ly9jcmwzLmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshoGqbGRh # cDovLy9DTj1hbWVyb290LENOPUFNRVJPT1QsQ049Q0RQLENOPVB1YmxpYyUyMEtl # eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9QU1F # LERDPUdCTD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0Q2xh # c3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwggGrBggrBgEFBQcBAQSCAZ0wggGZMDcG # CCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJv # b3QuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp # aW5mcmEvY2VydHMvQU1FUk9PVF9hbWVyb290LmNydDA3BggrBgEFBQcwAoYraHR0 # cDovL2NybDIuYW1lLmdibC9haWEvQU1FUk9PVF9hbWVyb290LmNydDA3BggrBgEF # BQcwAoYraHR0cDovL2NybDMuYW1lLmdibC9haWEvQU1FUk9PVF9hbWVyb290LmNy # dDCBogYIKwYBBQUHMAKGgZVsZGFwOi8vL0NOPWFtZXJvb3QsQ049QUlBLENOPVB1 # YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRp # b24sREM9QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9 # Y2VydGlmaWNhdGlvbkF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAKLdKhpqP # H6QBaM3CAOqQi8oA4WQeZLW3QOXNmWm7UA018DQEa1yTqEQbuD5OlR1Wu/F289Dm # XNTdsZM4GTKEaZehIiVaMoLvEJtu5h6CTyfWqPetNyOJqR1sGqod0Xwn5/G/zcTY # Sxn5K3N8KdlcDrZAIyfq3yaEJYHGnA9eJ/f1RrfbJgeo/RAhICctOONwfpsBXcgi # TuTmlD/k0DqogvzJgPq9GOkIyX/dxk7IkPzX/n484s0zHR4IKU58U3G1oPSQmZ5O # HAvgHaEASkdN5E20HyJv5zN7du+QY08fI+VIci6pagLfXHYaTX3ZJ/MUM9XU+oU5 # y4qMLzTj1JIG0LVfuHK8yoB7h2inyTe7bn6h2G8NxZ02aKZ0xa+n/JnoXKNsaVPG # 1SoTuItMsXV5pQtIShsBqnXqFjY3bJMlMhIofMcjiuOwRCW+prZ+PoYvE2P+ML7g # s3L65GZ9BdKF3fSW3TvmpOujPQ23rzSle9WGxFJ02fNbaF9C7bG44uDzMoZU4P+u # vQaB7KE4OMqAvYYfFy1tv1dpVIN/qhx0H/9oNiOJpuZZ39ZibLt9DXbsq5qwyHmd # JXaisxwB53wJshUjc1i76xqFPUNGb8EZQ3aFKl2w9B47vfBi+nU3sN0tpnLPtew4 # LHWq4LBD5uiNZVBOYosZ6BKhSlk1+Y/0y1IxghUdMIIVGQIBATBYMEExEzARBgoJ # kiaJk/IsZAEZFgNHQkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFN # RSBDUyBDQSAwMQITNgAAAOhmnRtIQqVMRQABAAAA6DANBglghkgBZQMEAgEFAKCB # rjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYK # KwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg6BrMYUioCdv6BCi6yRlNoENkvdYR # kEwPI34Sk+x8rpYwQgYKKwYBBAGCNwIBDDE0MDKgFIASAE0AaQBjAHIAbwBzAG8A # ZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTANBgkqhkiG9w0BAQEFAASC # AQCDK3zdRl1oaZ511ZPrOQMWO4W8Qg1xSLdJOvcB2Vamafw0j5XYDdRq5R5zJKiG # qlxduyCt45faoMN+2TmkH95gpEa2AYu+ubPVzhY09/DpXQExSgZyHoGsaoZmamZO # H8LxTErqRcdwvIZTDa7etz0nwAH+CQ0zHDo/huxAkamrY8ARyvnmGwfyoYOxDjrB # RXmRLO//ZcS4Gr8OXL16wYrHQSEfQtyN45bSLsqrcRCsaLQzTEnvsF77zgjvCw7o # 0+AT1dVw0Ao1THlAh4MxTfY1ox2/qk/7915bxt0jDFBT7+aV+MoAT6rODtrdbYQW # XLSCk2SpkOQN2sV3m8hXg+7RoYIS5TCCEuEGCisGAQQBgjcDAwExghLRMIISzQYJ # KoZIhvcNAQcCoIISvjCCEroCAQMxDzANBglghkgBZQMEAgEFADCCAVEGCyqGSIb3 # DQEJEAEEoIIBQASCATwwggE4AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIB # BQAEIAP92UBfzWr8lMzMoYzxRGjztOMVHapn20EhUdq6BuMkAgZd00zXOCsYEzIw # MTkxMjA1MjI0MTQ1LjU4M1owBIACAfSggdCkgc0wgcoxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh # IE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkQ2QkQtRTNFNy0x # Njg1MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOPDCC # BPEwggPZoAMCAQICEzMAAAEeDrzlSxaiAxsAAAAAAR4wDQYJKoZIhvcNAQELBQAw # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMTkxMTEzMjE0MDQwWhcN # MjEwMjExMjE0MDQwWjCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEmMCQG # A1UECxMdVGhhbGVzIFRTUyBFU046RDZCRC1FM0U3LTE2ODUxJTAjBgNVBAMTHE1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDOE7cYEKL89fBcrqzt/Bt1qpVfnrSxYwlYgs3r3C/tGlZeFEon # cyqOa+RRYGQfW+p3AJHwCcWH+sZkONhw5raY7vnCtjtuKt8bvqNQ0aewxXd9utR5 # wWVUX5xKEezwCIfXnpwavixR+Gd6QKy91NcvE8FXQVPdVhDr3FMizOqkqchyHYrj # 4M9LgtxbkiDycaxsav3X68TttcwpBcMCn2obFSZjCaUVzHbGr6EfoL03Teabx0WZ # rEe2x7QT0ZkYQBCYmJS1UXQSAVVjqb1wnMXr7+1H8fHLrd1/dtM2DsR/DXwnwEoz # 9Z1Upreflph3d1V2IbV9zKOefXgp/IB2aRS7AgMBAAGjggEbMIIBFzAdBgNVHQ4E # FgQUjBMo55F4RuBL+36bP9mvJ9pmilswHwYDVR0jBBgwFoAU1WM6XIoxkPNDe3xG # G8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQu # Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENBXzIwMTAtMDctMDEuY3Js # MFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcnQwDAYD # VR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOC # AQEALmTcjnWWI5CCEyJUDSXodjSHPN2w3oiARSDvg5jI27H2hj7r9C+/+eMU5kfk # zI9mTJ/3m1uaUyaGvWO+aGXfF6hTvyhGAQo2oclwuQccPqVqk+9ARrIPptCHRmGh # QAyWEJujVgtWrWN/KtKLHH6GWIBkeExySJF2aTfu7j69cgPz5DDSvl3UmghUBl1u # TXUh/0MeQskhdwfJ4BKUaLO2qAAXmlQH42tRVasa0qNYMdPm7xF1YQVlr1EBnvm9 # lUHTab0NqVF+Eu6kbn3LUs0ogHgWmBAmkQjWOaytaLywMIhHdwYOyp7SwaJUHx69 # cP1XNrOdoknGhUXodOHSXX4hbTCCBnEwggRZoAMCAQICCmEJgSoAAAAAAAIwDQYJ # KoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 # eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1NVowfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18aEssX8XD5WHCdrc+ # Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdNuDgIs0Ldk6zWczBX # JoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NMksHEpl3RYRNuKMYa # +YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2KQk1AUdEPnAY+Z3/1 # ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZzTznL0S6p/TcZL2k # AcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQBgkrBgEEAYI3FQEE # AwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUwGQYJKwYBBAGCNxQC # BAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYD # VR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZF # aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9v # Q2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcw # AoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJB # dXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCBjwYJKwYBBAGCNy4D # MIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vUEtJL2Rv # Y3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABf # AFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEB # CwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F4qn++ldtGTCzwsVm # yWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbMQEBBm9xcF/9c+V4X # NZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mBZdmptWvkx872ynoA # b0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7tiX5rbV0Dp8c6ZZpCM # /2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S4Zz5Hfw42JT0xqUK # loakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3aicaoGig+JFrphpxHL # mtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf5zEHpJM692VHeOj4 # qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsbiSpUObJb2sgNVZl6 # h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJzxlBTeCG+SqaoxFm # MNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB0d4wwP3M5k37Db9d # T+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/edIhJEqGCAs4wggI3 # AgEBMIH4oYHQpIHNMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYD # VQQLEx1UaGFsZXMgVFNTIEVTTjpENkJELUUzRTctMTY4NTElMCMGA1UEAxMcTWlj # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAOckG4+3p # qzET/o43WLrKWYzKsNyggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMDANBgkqhkiG9w0BAQUFAAIFAOGTjAswIhgPMjAxOTEyMDUyMjAwNDNaGA8y # MDE5MTIwNjIyMDA0M1owdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA4ZOMCwIBADAK # AgEAAgIizQIB/zAHAgEAAgIRqDAKAgUA4ZTdiwIBADA2BgorBgEEAYRZCgQCMSgw # JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3 # DQEBBQUAA4GBAIgbNtb++F96jqPElGWNrpwFHepri9gk2K/Huhm1Q7eUtOUR2Psq # hJZB0UA9LW22dniFv5bjzfpiXS9+7dr8WetSz1sdS7P8FiWx2Hhq/YWL/Svpm/Hz # yEgb+DStQKvWvWfq2o9b/nKwlcBOgsyMMkbxSuQHiGhz9PhHDTJldBXuMYIDDTCC # AwkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm # MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAEeDrzl # SxaiAxsAAAAAAR4wDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsq # hkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg2eNLxPdWzQD84tDxlP0DTeseRpJm # n/jWBX7X85SOkoQwgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCBzO+RYw99x # OlHlvaefPKE3cS3NJdWU8foiBBwPjdZfRzCBmDCBgKR+MHwxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l # LVN0YW1wIFBDQSAyMDEwAhMzAAABHg685UsWogMbAAAAAAEeMCIEIJQ7mDkjnO0n # w8mgLBlIgZJM6/AT6Gi7zUJTMgdDNgf+MA0GCSqGSIb3DQEBCwUABIIBAGbw18dT # Tapix0BD9HWi3GK4n3YVvh+IS/NoxnUcP636qFg06nSqekvYNPw8p/xDa0gQzjy/ # 2vCSDEwFZt/pfyjan2G2V2VVxJNP/f8Zo2Ru29g3YKHKDPITiPZrja2uVEWZkRsm # leyaLvsvgRdeIlU0Wf7UX59O4lSC6fEDv4eDA4UtMmrWTI/Q0V7oLQqTPmDDSQbz # p10Hjg4dIgAvNGt4j5mczrxiYiG22OBU5viXSWkN8jIoezP29gFfdsQVBkb6a484 # cWSvvde18hmrRtAhucbnBUjXMUK+xZXdkU8fi7GTIJ3HU0wNLsRtC2axr4Ss3Gpe # y/Yy7o5/ecynuus= # SIG # End signature block |