Created
January 5, 2024 19:40
-
-
Save ThioJoe/96d911749c18f9d64e2c60cdc11fa62f to your computer and use it in GitHub Desktop.
PowerShell script to copy GPU drivers to Hyper-V Virtual Machine for passthrough.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Description: This script will automatically copy the necessary GPU drivers from your current host machine into a Hyper-V Virtual Machine | |
# so you can pass through the GPU to the VM. You should run this whenever you update your graphics drivers on the host. | |
# | |
# Author: ThioJoe -- https://github.com/ThioJoe | |
# | |
# Note: Currently this only works for Nvidia GPUs. But it does support if you have multiple GPUs. | |
# | |
# OPTIONAL ARGUMENTS: | |
# -debug | Enables debug messages that pause the script for each step (No additional string required, just add -debug) | |
# -name | Sets the virtual machine name so it doesn't need to ask | |
# -username | The username for the admin account on the VM to use. Otherwise it will prompt when running script | |
# -password | The password for the admin account on the VM to use. Otherwise it will prompt when running script | |
# | |
# Example: .\Whatever-Script-Name.ps1 -debug -name Whatever_VM_Name -username blah -password somepassword | |
# Initialize variables | |
$enable_debug = $false | |
$VMNameArgument = $null | |
$Username = $null | |
$Password = $null | |
# Process command line arguments | |
for ($i = 0; $i -lt $args.Length; $i++) { | |
switch ($args[$i]) { | |
"-debug" { | |
$enable_debug = $true | |
} | |
"-name" { | |
if ($args.Length -gt $i + 1) { | |
$VMNameArgument = $args[$i + 1] | |
$i++ | |
} | |
} | |
"-username" { | |
if ($args.Length -gt $i + 1) { | |
$Username = $args[$i + 1] | |
$i++ | |
} | |
} | |
"-password" { | |
if ($args.Length -gt $i + 1) { | |
$Password = $args[$i + 1] | ConvertTo-SecureString -AsPlainText -Force | |
$i++ | |
} | |
} | |
} | |
} | |
# Get VM Name - First checks if there is an argument giving the name | |
# If no argument is given, it prompts the user | |
# It tests if the VM name is valid. If it is not, or the argument is invalid, it will prompt user again | |
function Get-VMName { | |
param ( | |
[string]$NameFromArgument | |
) | |
if ($NameFromArgument) { | |
$vm = Get-VM -Name $NameFromArgument -ErrorAction SilentlyContinue | |
if ($vm) { | |
return $NameFromArgument | |
} else { | |
Write-Host "VM with name '$NameFromArgument' not found. Are you sure you're running this script as administrator?" -ForegroundColor Red | |
} | |
} | |
do { | |
$VMName = Read-Host "Please enter the name of the VM" | |
$vm = Get-VM -Name $VMName -ErrorAction SilentlyContinue | |
if (-not $vm) { | |
Write-Host "VM with name '$VMName' not found. Are you sure you're running this script as administrator?" -ForegroundColor Red | |
} | |
} while (-not $vm) | |
return $VMName | |
} | |
# Function to handle debug messages | |
function Show-DebugMessage { | |
param ( | |
[string]$Message | |
) | |
if ($enable_debug) { Read-Host "Debug Step: $Message - Press Enter to continue..." } | |
} | |
function Handle-CredentialError { | |
Write-Host "The credential is invalid. Please ensure you're entering the correct credentials." -ForegroundColor Red | |
Write-Host " > In the 'username' box be sure to enter the username just as it appears from within the virtual machine." -ForegroundColor Red | |
Read-Host "Press Enter to exit..." # This line will pause the script | |
return | |
} | |
function Handle-AdminError { | |
Write-Host "Error: The input VMName parameter does not resolve to any virtual machine." -ForegroundColor Red | |
Write-Host " > Likely reason is this script must be run as administrator." -ForegroundColor Red | |
Read-Host "Press Enter to exit..." # This line will pause the script | |
} | |
# ----------------------------------------------------------------------------------------------------------------------- | |
# ----------------------------------------------------- BEGIN ----------------------------------------------------------- | |
# ----------------------------------------------------------------------------------------------------------------------- | |
# Get VM Name from arguments or user | |
$VMName = Get-VMName -NameFromArgument $VMNameArgument | |
# Create a new persistent PowerShell session to the VM | |
Write-Host "" | |
Write-Host "Next you will need to enter the account credentials of an admin account on the VM in the pop up box." | |
Write-Host "" | |
try { | |
if ($Username -and $Password) { | |
$Credential = New-Object System.Management.Automation.PSCredential ($Username, $Password) | |
} else { | |
Write-Host "Enter the account credentials of an admin account on the VM." | |
Read-Host "Press Enter to continue..." # This line will pause the script | |
$Credential = Get-Credential | |
} | |
$s = New-PSSession -VMName $VMName -Credential $Credential -ErrorAction Stop | |
} catch { | |
if ($_.Exception.Message -match "The credential is invalid" -or $_.FullyQualifiedErrorId -match "PSSessionStateBroken") { | |
Handle-CredentialError | |
} elseif ($_.Exception.Message -match "The input VMName" -or $_.FullyQualifiedErrorId -match "InvalidVMNameNotSingle") { | |
Handle-AdminError | |
} else { | |
Write-Error "An unexpected error occurred: $_" | |
Read-Host "Press Enter to exit..." # This line will pause the script | |
} | |
return | |
} | |
Write-Host "`nPowerShell Session Established. Beginning... `n" | |
# Clear existing nv_ folders in HostDriverStore\FileRepository on the guest | |
Show-DebugMessage "Clearing Existing nv_ folders in FileRepository on Guest VM" | |
Write-Host "`n Removing old nv_ folders in FileRepository on VM... `n" | |
$remotePath = "C:\Windows\System32\HostDriverStore\FileRepository" | |
Invoke-Command -Session $s -ScriptBlock { | |
param ($Path) | |
Get-ChildItem -Path $Path -Directory | Where-Object { $_.Name -like "nv_*" } | ForEach-Object { | |
Remove-Item -Path $_.FullName -Recurse -Force | |
} | |
} -ArgumentList $remotePath | |
# Copy nv* files from System32 (excluding nvspinfo.exe and NvAgent.dll) | |
Show-DebugMessage "Copying nv* files to Guest VM" | |
Write-Host "`n Copying nv* files to Guest VM system32 directory... `n" | |
$system32Path = "C:\Windows\System32" | |
$vmSystem32Path = "C:\Windows\System32" | |
$excludeFiles = @("nvspinfo.exe", "NvAgent.dll") | |
Get-ChildItem -Path $system32Path -Filter "nv*" | Where-Object { $excludeFiles -notcontains $_.Name -and -not $_.PSIsContainer } | ForEach-Object { | |
$sourcePath = $_.FullName | |
$destinationPath = Join-Path -Path $vmSystem32Path -ChildPath $_.Name | |
Copy-Item -ToSession $s -Path $sourcePath -Destination $destinationPath -Recurse | |
} | |
# Sets temporary directory on local host | |
$tempDirectory = "$env:TEMP\NVDriverZips" | |
# Cleanup Any Previous Leftover Host Temp Directories, if they exist | |
if (Test-Path $tempDirectory) { | |
Show-DebugMessage "Removing Previous temporary directory $tempDirectory" | |
Remove-Item -Path $tempDirectory -Recurse -Force | |
} | |
# Create temporary directory for storing zip files | |
Show-DebugMessage "Creating temporary directory $tempDirectory" | |
New-Item -Path $tempDirectory -ItemType Directory -Force | |
# Copy nv_ folders from DriverStore\FileRepository | |
Show-DebugMessage "Zipping and copying nv_ folders to HostDriverStore\FileRepository" | |
Write-Host "`n Zipping nv_ folders and copying to HostDriverStore\FileRepository on VM `n" | |
$driverStorePath = "C:\Windows\System32\DriverStore\FileRepository" | |
$vmHostDriverStorePath = "C:\Windows\System32\HostDriverStore\FileRepository" | |
$vmTempPath = "C:\GPU_DRIVER_TEMP" | |
# Cleanup & Create Temp Directory: Check for and delete any previous existing temporary directory on VM, then create new one | |
Show-DebugMessage "Removing existing temporary directory on VM if applicable, and creating new temp directory: $vmTempPath" | |
Invoke-Command -Session $s -ScriptBlock { | |
param ($Path, $EnableDebug) | |
if (Test-Path $Path) { | |
if ($EnableDebug) { Write-Host "Old temporary path found and is being removed: $Path" } | |
Remove-Item -Path $Path -Recurse -Force | |
} | |
if ($EnableDebug) { Write-Host "New temporary directory is being created: $Path" } | |
New-Item -Path $Path -ItemType Directory -Force | |
} -ArgumentList $vmTempPath, $enable_debug | |
# Get folders in FileRepository beginning with nv_ to copy over. | |
Get-ChildItem -Path $driverStorePath -Directory | Where-Object { $_.Name -match "nv_" } | ForEach-Object { | |
$folderName = $_.Name | |
$zipPath = Join-Path -Path $tempDirectory -ChildPath "$folderName.zip" | |
# Compress the contents of the folder, excluding the root directory itself. Potentially faster than copying one by one. | |
Show-DebugMessage "Compressing folder $folderName to zip file" | |
Compress-Archive -Path "$($_.FullName)\*" -DestinationPath $zipPath -CompressionLevel NoCompression | |
$vmZipPath = Join-Path -Path $vmTempPath -ChildPath "$folderName.zip" | |
Show-DebugMessage "Copying zip file to VM temp directory" | |
Copy-Item -ToSession $s -Path $zipPath -Destination $vmZipPath | |
} | |
# Extract zip files on VM | |
Show-DebugMessage "Extracting Zip File to destination within VM" | |
Invoke-Command -Session $s -ScriptBlock { | |
param ($ZipDirectory, $Destination, $EnableDebug) | |
Get-ChildItem -Path $ZipDirectory -Filter "*.zip" | ForEach-Object { | |
$zipFile = $_.FullName | |
$extractPath = Join-Path -Path $Destination -ChildPath $_.BaseName | |
if ($EnableDebug) { Write-Host "Expanding zip file: $zipFile to $extractPath" } | |
Expand-Archive -Path $zipFile -DestinationPath $extractPath | |
Remove-Item -Path $zipFile | |
} | |
} -ArgumentList $vmTempPath, $vmHostDriverStorePath, $enable_debug | |
# Clean up local temporary directory | |
Show-DebugMessage "Removing local temporary directory." | |
Remove-Item -Path $tempDirectory -Recurse -Force | |
# Remove temporary directory on VM | |
Show-DebugMessage "Removing VM Temporary Directory" | |
Invoke-Command -Session $s -ScriptBlock { | |
param ($Path) | |
Remove-Item -Path $Path -Recurse -Force | |
} -ArgumentList $vmTempPath | |
# Close the session | |
Show-DebugMessage "Ending Powershell Session" | |
Remove-PSSession $s | |
Write-Host "`nFinished. You should now restart the virtual machine." | |
Write-Host "If you haven't allocated the GPU resources before, you'll need to do that now after the VM is shutdown. (See my other script: Allocate-GPUs-VM.ps1 )" | |
Show-DebugMessage "Script finished." | |
# SIG # Begin signature block | |
# MIIplwYJKoZIhvcNAQcCoIIpiDCCKYQCAQExDzANBglghkgBZQMEAgEFADB5Bgor | |
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG | |
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAEAcVhrtRUtpTS | |
# 7ezGXa4CGHKhLLF9JwFUB7vGMufitKCCDoMwggawMIIEmKADAgECAhAIrUCyYNKc | |
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK | |
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV | |
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z | |
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg | |
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg | |
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw | |
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 | |
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr | |
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF | |
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F | |
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh | |
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ | |
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay | |
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI | |
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp | |
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro | |
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB | |
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ | |
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P | |
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk | |
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC | |
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v | |
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j | |
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED | |
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql | |
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF | |
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h | |
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw | |
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld | |
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw | |
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP | |
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE | |
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn | |
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji | |
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq | |
# yK+p/pQd52MbOoZWeE4wggfLMIIFs6ADAgECAhAIDbJ1eLBvhEUmSTXbMO0DMA0G | |
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg | |
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg | |
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjMwMzA0MDAwMDAwWhcNMjUwMTA0 | |
# MjM1OTU5WjCB0zETMBEGCysGAQQBgjc8AgEDEwJVUzEYMBYGCysGAQQBgjc8AgEC | |
# EwdXeW9taW5nMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlvbjEXMBUGA1UE | |
# BRMOMjAyMS0wMDEwNTUxMTkxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdXeW9taW5n | |
# MREwDwYDVQQHEwhTaGVyaWRhbjEbMBkGA1UEChMSVGhpbyBTb2Z0d2FyZSwgTExD | |
# MRswGQYDVQQDExJUaGlvIFNvZnR3YXJlLCBMTEMwggIiMA0GCSqGSIb3DQEBAQUA | |
# A4ICDwAwggIKAoICAQCyUph17S2KERvqfBBVI2wuQIVe+uZffJjzfWX1H9G0TnfS | |
# QWLTyXGxb/nT6nnwN/7ibHJldTwsSTaPOTkvaSnZuz0+AZPRXIiT/DuV3loOSqPX | |
# MYv1uQKDvLFzc+WOGkt2+cMXTFkP4joCPvkKb5+M2fapeNVxej7C5h4Ef3ABlg3o | |
# otc2xdZjGvPnxA9dnbdlNzJsRnjHHKPYwknl3QVra4PfP74D8K7dCxTzZUQpYYGy | |
# kZ05VHSuAG2HaPzr5o6CBnDv1ITvHX92JraAMcBd/gfcJsWoPH05mFgQfKDP3wru | |
# TQ9Ql2y67BFRXJR3RogMmu1FLsKzyP8yuZfcr7IWIiFgwYUzFs5k6FFy9kt1Cvs+ | |
# zyFtUPUeWtv01hZY+MC2/Qdy/CqGPkyPs4woh5ajEx1GcY11laRFUADWtgXJY0gG | |
# gl5suB8V4iaGt9iA0frfLyWq/F0h9U4tKnHucgf3DT58hM29el/3VqJx7ERgAc78 | |
# XRBgXDNxSsQpFsr/MvGGax27ayTvwMQm25UUbNTyFo0Nb0wxYXPYlA38+DwdXDYK | |
# q5BkNqqot44C/xZImP/F8ecnyIY9M2nhMtX49pC6zGJw6wtdhG5bKJFDRCwpy1wi | |
# vCVifhV2M3RuydUW1StYunzbhwQAAI6bg2Gz6vmLd6QZ69Zt6YxSDhrNVce41QID | |
# AQABo4ICAjCCAf4wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYD | |
# VR0OBBYEFHSwnMhQo43ayv0NcY2KnesS3hJWMA4GA1UdDwEB/wQEAwIHgDATBgNV | |
# HSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3Js | |
# My5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQw | |
# OTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQu | |
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAy | |
# MUNBMS5jcmwwPQYDVR0gBDYwNDAyBgVngQwBAzApMCcGCCsGAQUFBwIBFhtodHRw | |
# Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsG | |
# AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0 | |
# dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT | |
# aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZI | |
# hvcNAQELBQADggIBADDtgBDkKblvpa1Q24nmKq/hI8tRYPV7E2Umhk2BlSoBC+6M | |
# bNCDDltR/3OqFo6x9MxEuZnO4rC2eUMR4M/Xkj6E1GEKmm9ZOBTvgj6VDM5qv87G | |
# 8S1fq8yNr3srRLCtt7XXeVnRacSXAzD9NKr5QjZqOnD7uqWchvDMhVyT1WSvUACO | |
# 8K/Hr3kXtPIpLN3T6vxe9TwAwDxSk3/eeAHIQJN2EdcbhDEvDcOpkEse7bGNdZGG | |
# unlWOfBwCYuRarznUxz7kr8+MZIf3TixpOBHKjcGUeOAvPysqPBv+I6my7yrYirJ | |
# OlxqEOoY8psBU7z4L6vctr9/5DjltG4wQLjVfFpVHpizsk/EYr/jdHFmcqD6/edY | |
# PhMPaT8ItORC/EaXyBmOcKapegl9ay03kKztykuV/jsTRMFfGpGq/fTVY6R3bxMw | |
# HO3odlQnEvtGVXox8A4kp/6HZy4mh0BXJLjj+JZrEukizOnMa5Yr4H50GutgGfCL | |
# 7JqEBzv5pr+1Lyhkuwc2zBtcP9zrDdFqvi2rIQqU2OksE2wSuy2YnsiR1ekSxVNl | |
# JqrJXzEfZUprneVKOypREFFwek6cWbgXlJLr6XvBjq/hANBdhueMOJHkJoosL3SZ | |
# 7hAAPeUnGF5LQVK5dSHYVvcOT90g/eJ0NCX7wSDKjJ6A5weLkEZD+l/ef4VtMYIa | |
# ajCCGmYCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu | |
# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT | |
# QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAIDbJ1eLBvhEUmSTXbMO0DMA0GCWCGSAFl | |
# AwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB | |
# gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkE | |
# MSIEIDKhYLamfsJb1ybdzTMu2TjDLcjBu8EtPJljnD/yLoEkMA0GCSqGSIb3DQEB | |
# AQUABIICACQpk4+JQbuMD0f1SHC5TBGXWKN2kSTGi7Jr82EzrznYANRjxhEa2W3l | |
# 2p+CpvDWCSvKk6DUzcwHDx0o7gk9IGJ9lardzMeholAGdOITyLXpjHrXeelUvxOd | |
# jRBV21+H1dqjL07BizkKfXmcTjZcrW7QD7Kw7MA8LunrxY+XMfdcwE+zTEwm5NwR | |
# zqWLpe30fS/na6V24r4q/yS+N/aEbpdTAeWJtiEjtX4sUnPdMftHcjkNTbQVlovF | |
# JnFQVml4p1nnUcNraJd+W0JrKz7D65QII7frABhQgddbWJqpb7kTu4NhXH+XZPSm | |
# tXehiWBwYRrdoX+GwjzZnVDrMymJ6AM/S/eLKjd7tdOUhgDg0xDUDbPflex3XObS | |
# kYrPztWcUDAWOnx6meN6+R79v4Ur93F1bNlez9zcRo5VmxOSh+sxJKITMcPC8ly0 | |
# wgORFDnFewTzVPCzuch9haB/YKkxwKEoXQpt4wJPt7/aKaOPKrkJWlTp8Ttg23o2 | |
# sbXWv7X25+0R8hPSjzcesarebIRDRfw1vQJYyefoUlnkALJCTsYD7B1tb5q7ft4/ | |
# ZRblhZSOWIi6/trKbnTlrgSnQFEDFFBz9DwfCZYDhbiDWRKQlla6WCTmZnDDPtmG | |
# 08I4ieveVlK0BW069OblI+SYSq5DWajG996VfZc8DN8xoJpbSEMsoYIXQDCCFzwG | |
# CisGAQQBgjcDAwExghcsMIIXKAYJKoZIhvcNAQcCoIIXGTCCFxUCAQMxDzANBglg | |
# hkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcwZQIBAQYJYIZIAYb9bAcBMDEw | |
# DQYJYIZIAWUDBAIBBQAEIFbHkbEEmCT6OTCOhdWr0LGx9L1wDRhGxmxpCFmsXBQB | |
# AhEA3Uzg/PRVLpLhMUjm54xYtRgPMjAyNDAxMDUxOTI3MDNaoIITCTCCBsIwggSq | |
# oAMCAQICEAVEr/OUnQg5pr/bP1/lYRYwDQYJKoZIhvcNAQELBQAwYzELMAkGA1UE | |
# BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2Vy | |
# dCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0y | |
# MzA3MTQwMDAwMDBaFw0zNDEwMTMyMzU5NTlaMEgxCzAJBgNVBAYTAlVTMRcwFQYD | |
# VQQKEw5EaWdpQ2VydCwgSW5jLjEgMB4GA1UEAxMXRGlnaUNlcnQgVGltZXN0YW1w | |
# IDIwMjMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCjU0WHHYOOW6w+ | |
# VLMj4M+f1+XS512hDgncL0ijl3o7Kpxn3GIVWMGpkxGnzaqyat0QKYoeYmNp01ic | |
# NXG/OpfrlFCPHCDqx5o7L5Zm42nnaf5bw9YrIBzBl5S0pVCB8s/LB6YwaMqDQtr8 | |
# fwkklKSCGtpqutg7yl3eGRiF+0XqDWFsnf5xXsQGmjzwxS55DxtmUuPI1j5f2kPT | |
# hPXQx/ZILV5FdZZ1/t0QoRuDwbjmUpW1R9d4KTlr4HhZl+NEK0rVlc7vCBfqgmRN | |
# /yPjyobutKQhZHDr1eWg2mOzLukF7qr2JPUdvJscsrdf3/Dudn0xmWVHVZ1KJC+s | |
# K5e+n+T9e3M+Mu5SNPvUu+vUoCw0m+PebmQZBzcBkQ8ctVHNqkxmg4hoYru8QRt4 | |
# GW3k2Q/gWEH72LEs4VGvtK0VBhTqYggT02kefGRNnQ/fztFejKqrUBXJs8q818Q7 | |
# aESjpTtC/XN97t0K/3k0EH6mXApYTAA+hWl1x4Nk1nXNjxJ2VqUk+tfEayG66B80 | |
# mC866msBsPf7Kobse1I4qZgJoXGybHGvPrhvltXhEBP+YUcKjP7wtsfVx95sJPC/ | |
# QoLKoHE9nJKTBLRpcCcNT7e1NtHJXwikcKPsCvERLmTgyyIryvEoEyFJUX4GZtM7 | |
# vvrrkTjYUQfKlLfiUKHzOtOKg8tAewIDAQABo4IBizCCAYcwDgYDVR0PAQH/BAQD | |
# AgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYDVR0g | |
# BBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1NhS9z | |
# KXaaL3WMaiCPnshvMB0GA1UdDgQWBBSltu8T5+/N0GSh1VapZTGj3tXjSTBaBgNV | |
# HR8EUzBRME+gTaBLhklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU | |
# cnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3JsMIGQBggrBgEF | |
# BQcBAQSBgzCBgDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t | |
# MFgGCCsGAQUFBzAChkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl | |
# cnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3J0MA0GCSqG | |
# SIb3DQEBCwUAA4ICAQCBGtbeoKm1mBe8cI1PijxonNgl/8ss5M3qXSKS7IwiAqm4 | |
# z4Co2efjxe0mgopxLxjdTrbebNfhYJwr7e09SI64a7p8Xb3CYTdoSXej65CqEtcn | |
# hfOOHpLawkA4n13IoC4leCWdKgV6hCmYtld5j9smViuw86e9NwzYmHZPVrlSwrad | |
# OKmB521BXIxp0bkrxMZ7z5z6eOKTGnaiaXXTUOREEr4gDZ6pRND45Ul3CFohxbTP | |
# mJUaVLq5vMFpGbrPFvKDNzRusEEm3d5al08zjdSNd311RaGlWCZqA0Xe2VC1UIyv | |
# Vr1MxeFGxSjTredDAHDezJieGYkD6tSRN+9NUvPJYCHEVkft2hFLjDLDiOZY4rbb | |
# PvlfsELWj+MXkdGqwFXjhr+sJyxB0JozSqg21Llyln6XeThIX8rC3D0y33XWNmda | |
# ifj2p8flTzU8AL2+nCpseQHc2kTmOt44OwdeOVj0fHMxVaCAEcsUDH6uvP6k63ll | |
# qmjWIso765qCNVcoFstp8jKastLYOrixRoZruhf9xHdsFWyuq69zOuhJRrfVf8y2 | |
# OMDY7Bz1tqG4QyzfTkx9HmhwwHcK1ALgXGC7KP845VJa1qwXIiNO9OzTF/tQa/8H | |
# dx9xl0RBybhG02wyfFgvZ0dl5Rtztpn5aywGRu9BHvDwX+Db2a2QgESvgBBBijCC | |
# Bq4wggSWoAMCAQICEAc2N7ckVHzYR6z9KGYqXlswDQYJKoZIhvcNAQELBQAwYjEL | |
# MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 | |
# LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0 | |
# MB4XDTIyMDMyMzAwMDAwMFoXDTM3MDMyMjIzNTk1OVowYzELMAkGA1UEBhMCVVMx | |
# FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVz | |
# dGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCCAiIwDQYJKoZI | |
# hvcNAQEBBQADggIPADCCAgoCggIBAMaGNQZJs8E9cklRVcclA8TykTepl1Gh1tKD | |
# 0Z5Mom2gsMyD+Vr2EaFEFUJfpIjzaPp985yJC3+dH54PMx9QEwsmc5Zt+FeoAn39 | |
# Q7SE2hHxc7Gz7iuAhIoiGN/r2j3EF3+rGSs+QtxnjupRPfDWVtTnKC3r07G1decf | |
# BmWNlCnT2exp39mQh0YAe9tEQYncfGpXevA3eZ9drMvohGS0UvJ2R/dhgxndX7RU | |
# CyFobjchu0CsX7LeSn3O9TkSZ+8OpWNs5KbFHc02DVzV5huowWR0QKfAcsW6Th+x | |
# tVhNef7Xj3OTrCw54qVI1vCwMROpVymWJy71h6aPTnYVVSZwmCZ/oBpHIEPjQ2OA | |
# e3VuJyWQmDo4EbP29p7mO1vsgd4iFNmCKseSv6De4z6ic/rnH1pslPJSlRErWHRA | |
# KKtzQ87fSqEcazjFKfPKqpZzQmiftkaznTqj1QPgv/CiPMpC3BhIfxQ0z9JMq++b | |
# Pf4OuGQq+nUoJEHtQr8FnGZJUlD0UfM2SU2LINIsVzV5K6jzRWC8I41Y99xh3pP+ | |
# OcD5sjClTNfpmEpYPtMDiP6zj9NeS3YSUZPJjAw7W4oiqMEmCPkUEBIDfV8ju2Tj | |
# Y+Cm4T72wnSyPx4JduyrXUZ14mCjWAkBKAAOhFTuzuldyF4wEr1GnrXTdrnSDmuZ | |
# DNIztM2xAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW | |
# BBS6FtltTYUvcyl2mi91jGogj57IbzAfBgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/ | |
# 57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYI | |
# KwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j | |
# b20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp | |
# Q2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9j | |
# cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAGA1Ud | |
# IAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEA | |
# fVmOwJO2b5ipRCIBfmbW2CFC4bAYLhBNE88wU86/GPvHUF3iSyn7cIoNqilp/GnB | |
# zx0H6T5gyNgL5Vxb122H+oQgJTQxZ822EpZvxFBMYh0MCIKoFr2pVs8Vc40BIiXO | |
# lWk/R3f7cnQU1/+rT4osequFzUNf7WC2qk+RZp4snuCKrOX9jLxkJodskr2dfNBw | |
# CnzvqLx1T7pa96kQsl3p/yhUifDVinF2ZdrM8HKjI/rAJ4JErpknG6skHibBt94q | |
# 6/aesXmZgaNWhqsKRcnfxI2g55j7+6adcq/Ex8HBanHZxhOACcS2n82HhyS7T6NJ | |
# uXdmkfFynOlLAlKnN36TU6w7HQhJD5TNOXrd/yVjmScsPT9rp/Fmw0HNT7ZAmyEh | |
# QNC3EyTN3B14OuSereU0cZLXJmvkOHOrpgFPvT87eK1MrfvElXvtCl8zOYdBeHo4 | |
# 6Zzh3SP9HSjTx/no8Zhf+yvYfvJGnXUsHicsJttvFXseGYs2uJPU5vIXmVnKcPA3 | |
# v5gA3yAWTyf7YGcWoWa63VXAOimGsJigK+2VQbc61RWYMbRiCQ8KvYHZE/6/pNHz | |
# V9m8BPqC3jLfBInwAM1dwvnQI38AC+R2AibZ8GV2QqYphwlHK+Z/GqSFD/yYlvZV | |
# VCsfgPrA8g4r5db7qS9EFUrnEw4d2zc4GqEr9u3WfPwwggWNMIIEdaADAgECAhAO | |
# mxiO+dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUw | |
# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x | |
# JDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEw | |
# MDAwMDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxE | |
# aWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMT | |
# GERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIP | |
# ADCCAgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprN | |
# rnsbhA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVy | |
# r2iTcMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4 | |
# IWGbNOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13j | |
# rclPXuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4Q | |
# kXCrVYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQn | |
# vKFPObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu | |
# 5tTvkpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/ | |
# 8tWMcCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQp | |
# JYls5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFf | |
# xCBRa2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGj | |
# ggE6MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/ | |
# 57qYrhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8B | |
# Af8EBAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz | |
# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj | |
# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6 | |
# oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElE | |
# Um9vdENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEB | |
# AHCgv0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0a | |
# FPQTSnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNE | |
# m0Mh65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZq | |
# aVSwuKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCs | |
# WKAOQGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9Fc | |
# rBjDTZ9ztwGpn1eqXijiuZQxggN2MIIDcgIBATB3MGMxCzAJBgNVBAYTAlVTMRcw | |
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3Rl | |
# ZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0ECEAVEr/OUnQg5pr/b | |
# P1/lYRYwDQYJYIZIAWUDBAIBBQCggdEwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ | |
# EAEEMBwGCSqGSIb3DQEJBTEPFw0yNDAxMDUxOTI3MDNaMCsGCyqGSIb3DQEJEAIM | |
# MRwwGjAYMBYEFGbwKzLCwskPgl3OqorJxk8ZnM9AMC8GCSqGSIb3DQEJBDEiBCAw | |
# tfW1wCm/X6gPk7B9XcjbJK2OAc+DNQtLOVHU6z0JHDA3BgsqhkiG9w0BCRACLzEo | |
# MCYwJDAiBCDS9uRt7XQizNHUQFdoQTZvgoraVZquMxavTRqa1Ax4KDANBgkqhkiG | |
# 9w0BAQEFAASCAgBoHhBQ/X4BHmrBorR0xD9LOaG9rphKyMZOIbtF9+rnaf0CfdCc | |
# kMny1erOETHaLOsQiqb30QDAeufbIKMnJ8mhfZsbIB5Eu4Em3gsC1lhnfWiXFzyA | |
# NuupB8Grp37+DqtRo6+xUXeXYqjWXNfCLcY1ZjvXzH6j4WFl/uSkt/EcnaDwuM2t | |
# XWohxVTd6d8F6odcXB4un7+IA8YSDU+RhrKzZQvqW+es1IKpZ6KYaKdVeroAGClo | |
# +CegFDYn+bgFRVljE6mgseo78H0dSf91Ijcp7CFbM8bm+h3cHn5PPrPkCCkSBS8u | |
# Y93Hd47GAMHcF91BMG5W59vrmf2w3DAUT2u5qcQmt0+IoGHh9V8LmdyOaJga+KrG | |
# d3iWWiwVHz2EJ0+p7sQCrcII8jci4yAxNDfAs6MJBglOcrj49YxAopUWhlbecOxZ | |
# vlukQr5CAnj8QbjTD/xZLunZtqGbGv7Z78FjZYiGpslRf55LU3YVpjURRXc4231O | |
# eebTlv+XzlUqyOZrKqbn0NgnxELiQbLlGbKlglCdp5mveQFSNEPqhhkaR01WtofX | |
# al+vzMnclUZRxpO7/9iJbRH97wlSiykKbCcff/One8GHAthHzqddwslEGpUpgJrO | |
# +PxNXOdNngnsu6uJxbu/ZAfbrSxqi2mZl/D248dBoHqxNAx8+eA8AJdsKg== | |
# SIG # End signature block |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment