Migrate-Aadds.ps1
|
<#PSScriptInfo
.VERSION 1.4 .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 01/17/2020 - Parameter type fix 02/12/2020 - Add support for MFA and some message fixes 03/31/2020 - Improve retry conditions 07/19/2020 - Minor ApiVersion fix #> <# .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 Services resource for migration. .PARAMETER Commit [MANADATORY] Causes the script to commit the migration for the prepared classic Azure AD Domain Services resource. .PARAMETER Abort [MANADATORY] Causes the script to abort the migration and reverts the classic Azure AD Domain Services 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")] [string] $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) { $azProfile = Connect-AzAccount -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 Services instance..." -NoNewline ($AzSubs = Get-AzSubscription) | Out-Null foreach($azsub in $AzSubs) { (Select-AzSubscription $azsub.Id) | Out-Null $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue if($null -ne $aadds) { # Found Azure AD Domain Services 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 the specified Azure AD Domain Services with managed domain name: {0}" -f $ManagedDomainFqdn) return } else { Write-Host -ForegroundColor Green "[Found!]" } } else { Select-AzSubscription $subscription -ErrorAction SilentlyContinue $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -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 Azure AD Domain Services 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 or FailedToPerformMigration. # If the action is abort, this should equal PreparedForMigration, FailedToRollbackMigration or FailedToPerformMigration. # If the action is prepare, this should equal Running or FailedToPrepareForMigration. if("commit" -eq $action) { if("PreparedForMigration" -ne $aadds.properties.serviceStatus -and "FailedToPerformMigration" -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!]" } } elseif("abort" -eq $action) { if("PreparedForMigration" -ne $aadds.properties.serviceStatus -and "FailedToRollbackMigration" -ne $aadds.properties.serviceStatus -and "FailedToPerformMigration" -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} -ApiVersion 2017-06-01 -Force) | Out-Null Write-Host -Foreground Green "[Preparation complete!]" Write-Host "Validating ..." -NoNewline $confirm = $null $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -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 -ApiVersion 2017-06-01).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 Domain Services 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} -ApiVersion 2017-06-01 -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 -ApiVersion 2017-06-01).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 # Waiting to give time to refresh the state of Azure AD Domain Services resource. Start-Sleep -Seconds 10 $confirm = $null $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue if($null -eq $confirm) { Write-Host -ForegroundColor Yellow "[Undetermined!]" Write-Host -ForegroundColor Yellow "The script could not validate the Commit status." Write-Host -ForegroundColor Yellow ( "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).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} -ApiVersion 2017-06-01 -Force) | Out-Null # # Validate Write-Host -Foreground Green "[Process Complete!]" Write-Host "Validating ..." -NoNewline $confirm = $null $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -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 -ApiVersion 2017-06-01).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 # MIInMwYJKoZIhvcNAQcCoIInJDCCJyACAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBszBJJPjyo0XMB # 3ynLvGYUmXLJjDvYwckfzqsVcfFM0aCCEW8wggiBMIIHaaADAgECAhM2AAABDBla # ELMo09izAAEAAAEMMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH # QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe # Fw0yMDAyMDkxMzI1MDFaFw0yMTAyMDgxMzI1MDFaMC8xLTArBgNVBAMTJE1pY3Jv # c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB # BQADggEPADCCAQoCggEBAJL4kx4D2erD4cliqomE3dMX+gvfMz/ovrjRwJqG80Kl # kGP+kOn35E80o/Ua/SdfQq3gjLNJSJpa6Yn0ph8FOf7U4NT7a8+zrwBTpZ/7llv9 # /jGf037eKxEWsCtMTRfL1dKBOQhn1lHAZvjKdgIgJAFG7ydg1oKsn0wfGBXSgile # g1IWbTNpR5luLpuHPWRspqDtXCXif/+rjukP5tvDqZmxYP0tQXER4I1eUXiJIXHf # 7dFZR7VxjZ4BP1rEUU8Gk+BMGpTJTTB21MjwtEjF2U5WAv1KeUpxxlYPKEYGgr2/ # lCXgkoWmPWqSLMbLjcX5uLfMP9j/IW/UnpoaReR1gVsCAwEAAaOCBYIwggV+MCkG # CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE # AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D # AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov # L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B # TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0 # dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy # MENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt # ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw # MSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ # MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYI # KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B # TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwga0GCCsGAQUFBzAChoGg # bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy # MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9 # QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm # aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUkku2i4tvXu/fb2UHKKZiDd81U7Aw # DgYDVR0PAQH/BAQDAgeAMFAGA1UdEQRJMEekRTBDMSkwJwYDVQQLEyBNaWNyb3Nv # ZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEWMBQGA1UEBRMNMjM2MTY5KzQ1Nzc5 # NTCCAdQGA1UdHwSCAcswggHHMIIBw6CCAb+gggG7hjxodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpaW5mcmEvQ1JML0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmwxLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmwyLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmwzLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmw0LmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGgbps # ZGFwOi8vL0NOPUFNRSUyMENTJTIwQ0ElMjAwMSxDTj1CWTJQS0lDU0NBMDEsQ049 # Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNv # bmZpZ3VyYXRpb24sREM9QU1FLERDPUdCTD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25M # aXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwHwYDVR0j # BBgwFoAUG2aiGfyb66XahI8YmOkQpMN7kr0wHwYDVR0lBBgwFgYKKwYBBAGCN1sD # AQYIKwYBBQUHAwMwDQYJKoZIhvcNAQELBQADggEBAFdWLRaOg25JZG+Hm01zB/zB # oSC3MUJ7lWHPIE44xH/7Ek9n0KnzXthnL345WNBcnW3pNbqHGVeLx7SlYJFbsiLi # vKm3+FUc71F5AQvySUTOpRvHRmEBgzuZo9t6n211l2GQLWdGMGvzrIaeV81wsP2r # W0G++acIHvczziw0mDTM3UYNeyxI6rFwsZsdfbvzbmsqcZuK9B699sEQoWQO19Fu # 0sIkj3WPKlATUk9dAAhHkwl2dcPckrvhBvwa9rYPLPAjWsFTZLdRTBubE9ukikdd # PDTqTM+9FhlPwo7PGMKyBngj9jp4WsfIyDfVfE1W/LgtDa+0SN7mPPNNbW5SKcMw # ggjmMIIGzqADAgECAhMfAAAAFLTFH8bygL5xAAAAAAAUMA0GCSqGSIb3DQEBCwUA # MDwxEzARBgoJkiaJk/IsZAEZFgNHQkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxEDAO # BgNVBAMTB2FtZXJvb3QwHhcNMTYwOTE1MjEzMzAzWhcNMjEwOTE1MjE0MzAzWjBB # MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRUwEwYD # VQQDEwxBTUUgQ1MgQ0EgMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDVV4EC1vn60PcbgLndN80k3GZh/OGJcq0pDNIbG5q/rrRtNLVUR4MONKcWGyae # VvoaQ8J5iYInBaBkaz7ehYnzJp3f/9Wg/31tcbxrPNMmZPY8UzXIrFRdQmCLsj3L # cLiWX8BN8HBsYZFcP7Y92R2VWnEpbN40Q9XBsK3FaNSEevoRzL1Ho7beP7b9FJlK # B/Nhy0PMNaE1/Q+8Y9+WbfU9KTj6jNxrffv87O7T6doMqDmL/MUeF9IlmSrl088b # oLzAOt2LAeHobkgasx3ZBeea8R+O2k+oT4bwx5ZuzNpbGXESNAlALo8HCf7xC3hW # qVzRqbdnd8HDyTNG6c6zwyf/AgMBAAGjggTaMIIE1jAQBgkrBgEEAYI3FQEEAwIB # ATAjBgkrBgEEAYI3FQIEFgQUkfwzzkKe9pPm4n1U1wgYu7jXcWUwHQYDVR0OBBYE # FBtmohn8m+ul2oSPGJjpEKTDe5K9MIIBBAYDVR0lBIH8MIH5BgcrBgEFAgMFBggr # BgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcVBgYKKwYBBAGC # NwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisGAQQBgjdAAQEG # CysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisGAQQBgjcUAgIG # CisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEEAYI3WwIBBgor # BgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEEAYI3WwQCMBkG # CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjASBgNVHRMBAf8E # CDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHRCQsoMIIBaAYD # VR0fBIIBXzCCAVswggFXoIIBU6CCAU+GI2h0dHA6Ly9jcmwxLmFtZS5nYmwvY3Js # L2FtZXJvb3QuY3JshjFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEv # Y3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9hbWVyb290 # LmNybIYjaHR0cDovL2NybDMuYW1lLmdibC9jcmwvYW1lcm9vdC5jcmyGgapsZGFw # Oi8vL0NOPWFtZXJvb3QsQ049QU1FUk9PVCxDTj1DRFAsQ049UHVibGljJTIwS2V5 # JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1BTUUs # REM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFz # cz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIBnTCCAZkwNwYI # KwYBBQUHMAKGK2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNRVJPT1RfYW1lcm9v # dC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp # bmZyYS9jZXJ0cy9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw # Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUF # BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0 # MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1BSUEsQ049UHVi # bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv # bixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1j # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4ICAQAot0qGmo8f # pAFozcIA6pCLygDhZB5ktbdA5c2ZabtQDTXwNARrXJOoRBu4Pk6VHVa78Xbz0OZc # 1N2xkzgZMoRpl6EiJVoygu8Qm27mHoJPJ9ao9603I4mpHWwaqh3RfCfn8b/NxNhL # Gfkrc3wp2VwOtkAjJ+rfJoQlgcacD14n9/VGt9smB6j9ECEgJy0443B+mwFdyCJO # 5OaUP+TQOqiC/MmA+r0Y6QjJf93GTsiQ/Nf+fjzizTMdHggpTnxTcbWg9JCZnk4c # C+AdoQBKR03kTbQfIm/nM3t275BjTx8j5UhyLqlqAt9cdhpNfdkn8xQz1dT6hTnL # iowvNOPUkgbQtV+4crzKgHuHaKfJN7tufqHYbw3FnTZopnTFr6f8mehco2xpU8bV # KhO4i0yxdXmlC0hKGwGqdeoWNjdskyUyEih8xyOK47BEJb6mtn4+hi8TY/4wvuCz # cvrkZn0F0oXd9JbdO+ak66M9DbevNKV71YbEUnTZ81toX0Ltsbji4PMyhlTg/669 # BoHsoTg4yoC9hh8XLW2/V2lUg3+qHHQf/2g2I4mm5lnf1mJsu30NduyrmrDIeZ0l # dqKzHAHnfAmyFSNzWLvrGoU9Q0ZvwRlDdoUqXbD0Hju98GL6dTew3S2mcs+17Dgs # dargsEPm6I1lUE5iixnoEqFKWTX5j/TLUjGCFRowghUWAgEBMFgwQTETMBEGCgmS # JomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMGA1UEAxMMQU1F # IENTIENBIDAxAhM2AAABDBlaELMo09izAAEAAAEMMA0GCWCGSAFlAwQCAQUAoIGu # MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor # BgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBjXL0BdcqcV53b8kpWO2nZvPfUQdA4 # q5/7rTVSXSBHXDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBm # AHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIB # ABnMuFoRwtX4eaYwRzp26GOH9x53IocCDmjLjxKJzB+9Hkfi7pV3czHGIzc2Q5o/ # dpsRrexSMvQzQYNZted5MH90NYgwyeB/Qhc/SaR8kUVY06xGyrB9ovaTXHR94RCh # Jx+ul5Gq7OUnwS+YOOy8sclN9xdAjmoJGu20da5lyQMuEbSfSN33EaN+svKeP37i # 2GvK1mfdBassCqHcXWJ9OtWstmUQ9jYsjFTWTAErXPw/27qj3sIOpE7P3tbIWe+O # QcCkqnRE2L4xnoUllbgWOqz7F90ClBpATzvysvRYZPm32ZFIh0MphyXGAQQVf3X+ # zjv2DVESwV1yfGXKTmc8AVGhghLiMIIS3gYKKwYBBAGCNwMDATGCEs4wghLKBgkq # hkiG9w0BBwKgghK7MIIStwIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBUQYLKoZIhvcN # AQkQAQSgggFABIIBPDCCATgCAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEF # AAQgiwUqSmavwWYCqGMDNIqW3nfDysp+BZpSEwdgQmcXnBsCBl8V/u5qVxgTMjAy # MDA3MjgwNDE5NDEuNzUzWjAEgAIB9KCB0KSBzTCByjELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046M0JCRC1FMzM4LUU5 # QTExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wggg45MIIE # 8TCCA9mgAwIBAgITMwAAAR3CwgiuPrquSAAAAAABHTANBgkqhkiG9w0BAQsFADB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xOTExMTMyMTQwMzlaFw0y # MTAyMTEyMTQwMzlaMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYD # VQQLEx1UaGFsZXMgVFNTIEVTTjozQkJELUUzMzgtRTlBMTElMCMGA1UEAxMcTWlj # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEP # ADCCAQoCggEBAJyFAfqhfvWYChz5UIApKIOCcRO5wwRonHB1LcdxuA5n+0qtcT8W # 2IY+O147Mx+JKOh6XfRaIFSS0THVzrP/gLdcwhodY2Pv8hHoP1nvuLaK6bQq8hAo # ax+YX1rooyCDYdYzhEl/OdpVa0f1Pkq8i0XawcoMNx479zuFQBojMupUI0wTavpW # vuRh8ie7k0cfSqSA4gZlb0FWCa2l6lZmhK5dwaYX8fUxzfY38q/yxdX+FiUTdNOA # LMDyzm02i+yimHMP1fQByyw2wnSpGpsDu7+yvclm1BrOM+2N/DXAa+HVQwneVyau # Bp3CWWVHDbUrOPVc0S741inyLM8juq+g/OUCAwEAAaOCARswggEXMB0GA1UdDgQW # BBQXXloUYN7I8gi+K0NqCM/ArZvCqTAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYb # xTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j # b20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmww # WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNV # HRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IB # AQBgjJGdkPAMyzjg0BXr4fps+eMb31FfDhF4p2PRJI7kh3AIUSMwuQ8d/P2V7lXe # EAGFrrzzoQzG/dLb3J+lQdbmpsK0sKfwLJ2Jnx7I0pwUe4qYSbDqzJarhT+1Y4eP # jm8AWnXrXZUjf/5tnSeDzYB03qOeMqW7D/BN+2q0bohz+001jrG2pVH5llyrygwS # cp9iPei+zaJbjwvbvIa1YP0XqG4lJEi4hsrbczS+iFE57Pm2edZMtQujVxGPy2Zp # 1MtNxU5zOB+7dnNrTMW4UFtR+QRnSAwbrWcmuQWdeKXJeH3gWHr/0jAUbIOmhgfw # ncEBSn9aFt4F+tDJNVYbzEkwMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg # VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC # ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m # K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm # gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5 # hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm # wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB # wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD # AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE # DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo # dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D # ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC # hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1 # dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw # gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j # cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A # UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL # BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ # at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1 # mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv # SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/ # amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW # hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua # 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio # SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH # czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw # 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P # 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSoYICyzCCAjQC # AQEwgfihgdCkgc0wgcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNV # BAsTHVRoYWxlcyBUU1MgRVNOOjNCQkQtRTMzOC1FOUExMSUwIwYDVQQDExxNaWNy # b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBEI59Ed+Kz # R24NQhD8LH1pHjgnQqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMA0GCSqGSIb3DQEBBQUAAgUA4sm3jTAiGA8yMDIwMDcyODA0MjkwMVoYDzIw # MjAwNzI5MDQyOTAxWjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDiybeNAgEAMAcC # AQACAhB0MAcCAQACAhGYMAoCBQDiywkNAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwG # CisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEF # BQADgYEATXkBJn36rXQT4SBzYWg2rfJBO/vacD1+A2opl+3ahQlsG03lSZPBPnop # E45cT36QtYXA8tfgnmSqD7Kz1C2XjKxgwiZiskN9iaAhVqRbT+sMplvaY1WuC+Fe # mYpMIQ0TFXZm4Xh3O3bxOA1CoJjIH4+9dxrGz/VTyQJis987YK0xggMNMIIDCQIB # ATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD # VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAR3CwgiuPrqu # SAAAAAABHTANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3 # DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCAVg5XeBmbR6rh0Y0YSI44efw2wpHQheEoI # gMW66kONLTCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIAK+DMNCn3d8hwuu # bOkJ7YgKQkXtcRtSXt1yRull75qTMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgUENBIDIwMTACEzMAAAEdwsIIrj66rkgAAAAAAR0wIgQgt4ZdV/KKGQ5MsS74 # Lh9ylXTWZzytxlvwFMV+umlkTp0wDQYJKoZIhvcNAQELBQAEggEATV4VkAi4YLZB # cRmEI8XRuWgrjBB8Djr9hMPsugPpCj8i83xy+tY5mkK0a7ij8sNvURdljHTgXj21 # qatYYlObXMKhCBi90RJQJxhME/lO+RLYUdUarbASSxDZgaT52+ZRQxlGDqUMfadJ # po4/4m+MiiHM6Yo2S+MRwLawIhtGl2NtOQHMNzLgnRerW86KMS60tAYNufbYRoSb # aM7DIaBMZy3EyqxBgiD75rg/57jDBSLLGJDECGwrvmPJycp6UY8xYfw4CFT8fOmI # H5YnqyRkn3A/yQ+tr/JTjAeaZkh2IqpYpEhmXcZmH5Q28MYjLSHsQzdgx7RXRSXt # LAyzZVg/2A== # SIG # End signature block |