[int]$ossize\r
)\r
\r
+# Clear any pre-existing errors\r
+$Error.Clear();\r
+\r
# Start logging\r
$log=$Env:Temp+"\VulkanRT"\r
New-Item -ItemType Directory -Force -Path $log | Out-Null\r
$logascii=$log+"\ConfigLayersAndVulkanDLL.log"\r
+\r
+# Temp to be used for debugging failure to install issue\r
+$logascii2=$Env:Temp+"\ConfigLayersAndVulkanDLL_debug.log"\r
+\r
$log=$log+"\ConfigLayersAndVulkanDLL16.log"\r
-echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log\r
-(Get-Date).ToString() >>$log\r
+\r
+start-transcript -path $log\r
+\r
+Write-Host "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize"\r
+$startTime=Get-Date\r
+Write-Host "Start time : $startTime"\r
\r
$vulkandll = "vulkan-"+$majorabi+".dll"\r
$windrive = $env:SYSTEMDRIVE\r
\r
function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)\r
{\r
- echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log\r
+ Write-Host "UpdateVulkanSysFolder $dir $writeSdkName"\r
\r
# Push the current path on the stack and go to $dir\r
Push-Location -Path $dir\r
# Find all vulkan dll files in this directory\r
dir -name vulkan-$majorabi-*.dll |\r
ForEach-Object {\r
- echo "File $_" >>$log\r
+ Write-Host "File $_"\r
if ($_ -match "=" -or\r
$_ -match "@" -or\r
$_ -match " " -or\r
- ($_.Split('-').count -lt 6) -or\r
- ($_.Split('-').count -gt 8))\r
+ ($_.Split('-').count -lt 6) -or\r
+ ($_.Split('-').count -gt 8) -or\r
+ !$?)\r
{\r
# If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than\r
# 7 dashes, it wasn't installed by the Vulkan Run Time.\r
# Note that we need to use return inside of ForEach-Object is to continue with iteration.\r
- echo "ERROR: Rejected $_ - bad format" >>$log\r
+ Write-Warning "Ignoring $_ - bad format"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
- if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder object $_ is bad format" >>$log;\r
- }\r
\r
# If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time\r
$vulkaninfo=$_ -replace ".dll",".exe"\r
$vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo"\r
- if (-not (Test-Path $vulkaninfo)) {\r
- echo "ERROR: Rejected $_ - vulkaninfo not present" >>$log\r
+ if (-not (Test-Path $vulkaninfo) -or\r
+ !$?) {\r
+ Write-Warning "Rejected $_ - $vulkaninfo not present"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
- if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder failed generating vulkaninfo exe name" >>$log;\r
- }\r
\r
$major=$_.Split('-')[2]\r
$majorOrig=$major\r
$prebuildno="z"*10\r
}\r
}\r
- echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log\r
+ Write-Host "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig"\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder during version parsing" >>$log;\r
+ Write-Warning "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
+ return\r
}\r
\r
# Make sure fields that are supposed to be numbers are numbers\r
if (notNumeric($major)) {\r
- echo "ERROR: Rejected $_ - bad major" >>$log\r
+ Write-Warning "Ignoring $_ - bad major"\r
+\r
+ # Not a real d, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
if (notNumeric($minor)) {\r
- echo "ERROR: Rejected $_ - bad minor" >>$log\r
+ Write-Warning "Ignoring $_ - bad minor"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
if (notNumeric($patch)) {\r
- echo "ERROR: Rejected $_ - bad patch" >>$log\r
+ Write-Warning "Ignoring $_ - bad patch"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
if (notNumeric($buildno)) {\r
- echo "ERROR: Rejected $_ - bad buildno" >>$log\r
+ Write-Warning "Ignoring $_ - bad buildno"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
if (notNumeric($prebuildno)) {\r
if ($prebuildno -ne "z"*10) {\r
- echo "ERROR: Rejected $_ - bad prebuildno" >>$log\r
+ Write-Warning "Ignoring $_ - bad prebuildno"\r
+\r
+ # Not a real error, so just clear it for now.\r
+ $Error.Clear();\r
+\r
+ # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop\r
return\r
}\r
}\r
$prebuildno = $prebuildno.padleft(10,'0')\r
\r
# Add a new element to the $VulkanDllList array\r
- echo "Adding $_ to Vulkan dll list " >>$log\r
+ Write-Host "Adding $_ to Vulkan dll list "\r
$script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"\r
-\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder adding DLL $_ to list" >>$log;\r
+ Write-Error "Error: UpdateVulkanSysFolder adding DLL $_ to list"\r
}\r
}\r
\r
\r
# Sort the list. The most recent vulkan-*.dll will be in the last element of the list.\r
[array]::sort($script:VulkanDllList)\r
-\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder sorting DLL list" >>$log;\r
+ Write-Error "Error: UpdateVulkanSysFolder sorting DLL list" \r
}\r
\r
# Put the name of the most recent vulkan-*.dll in $mrVulkanDLL.\r
# The most recent vulkanDLL is the second word in the last element of the\r
# sorted $VulkanDllList. Copy it to $vulkandll.\r
$mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1]\r
- echo "copy $mrVulkanDll $vulkandll" >>$log\r
+ Write-Host "Copying $mrVulkanDll $vulkandll"\r
Copy-Item $mrVulkanDll $vulkandll -force\r
-\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" >>$log;\r
+ Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll"\r
}\r
\r
# Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe.\r
# We create the source file name for the copy from $mrVulkanDll.\r
$mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe"\r
$mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo"\r
- echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log\r
+ Write-Host "Copying $mrVulkaninfo vulkaninfo.exe"\r
Copy-Item $mrVulkaninfo vulkaninfo.exe -force\r
-\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" >>$log;\r
+ Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe"\r
}\r
\r
# Create the name used in the registry for the SDK associated with $mrVulkanDll.\r
if ($prebuildno -ne "") {\r
$sdktempname=$sdktempname + "." + $prebuildno\r
}\r
- echo "sdkname = $sdktempname" >>$log\r
\r
+ Write-Host "sdkname = $sdktempname"\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder encountered error generating temp SDK name" >>$log;\r
+ Write-Error "Error: UpdateVulkanSysFolder encountered error generating SDK name"\r
}\r
}\r
\r
# Return to our previous folder\r
Pop-Location\r
-\r
if (!$?) {\r
- echo "ERROR: UpdateVulkanSysFolder popping location" >>$log;\r
+ Write-Error "Error: UpdateVulkanSysFolder popping location"\r
}\r
\r
# Only update the overall script-scope SDK name if we're told to\r
# We only care about SYSWOW64 if we're targeting a 64-bit OS\r
if ($ossize -eq 64) {\r
# Update the SYSWOW64 Vulkan DLLS/EXEs\r
- echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log\r
+ Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0"\r
UpdateVulkanSysFolder $winfolder\SYSWOW64 0\r
-\r
if (!$?) {\r
- echo "ERROR: Calling UpdateVulkanSysFolder for 64-bit OS" >>$log\r
+ Write-Error "Error: Calling UpdateVulkanSysFolder for 64-bit OS" \r
}\r
}\r
\r
# Update the SYSTEM32 Vulkan DLLS/EXEs\r
-echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log\r
+Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1"\r
UpdateVulkanSysFolder $winfolder\SYSTEM32 1\r
-\r
if (!$?) {\r
- echo "ERROR: Calling UpdateVulkanSysFolder for all OS" >>$log\r
+ Write-Error "Error: Calling UpdateVulkanSysFolder for all OS"\r
}\r
\r
# Create an array of vulkan sdk install dirs\r
\r
-echo "Creating array of of Vulkan SDK Install dirs" >>$log\r
+Write-Host "Creating array of of Vulkan SDK Install dirs"\r
$mrVulkanDllInstallDir=""\r
$VulkanSdkDirs=@()\r
Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |\r
if ($_ -match "\\VulkanSDK") {\r
# Get the install path from UninstallString\r
$tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString\r
+ if (!$?) {\r
+ Write-Error "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey"\r
+ }\r
$tmp=$tmp -replace "\\Uninstall.exe.*",""\r
$tmp=$tmp -replace ".*=.",""\r
- echo "Adding $tmp to VulkanSDKDirs" >>$log\r
+ Write-Host "Adding $tmp to VulkanSDKDirs"\r
$VulkanSdkDirs+=$tmp\r
if ($regkey -eq $script:sdkname) {\r
# Save away the sdk install dir for the the most recent vulkandll\r
- echo "Setting mrVulkanDllInstallDir to $tmp" >>$log\r
+ Write-Host "Setting mrVulkanDllInstallDir to $tmp"\r
$mrVulkanDllInstallDir=$tmp\r
}\r
}\r
}\r
-\r
if (!$?) {\r
- echo "ERROR: Failed creating array of of Vulkan SDK Install dirs" >>$log\r
+ Write-Error "Error: Failed creating array of of Vulkan SDK Install dirs"\r
}\r
\r
\r
# Search list of sdk install dirs for an sdk compatible with $script:sdkname.\r
# We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK.\r
if ($mrVulkanDllInstallDir -eq "") {\r
- echo "Searching VulkanDllList" >>$log\r
+ Write-Host "Searching VulkanDllList"\r
ForEach ($idx in ($script:VulkanDllList.Length-1)..0) {\r
$tmp=$script:VulkanDllList[$idx]\r
$vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1]\r
if ($vulkanDllPrebuildno) {\r
$regEntry=$regEntry+"."+$vulkanDllPrebuildno\r
}\r
- echo "Comparing $regEntry" >>$log\r
+ Write-Host "Comparing $regEntry"\r
$rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue\r
+ if (!$?) {\r
+ Write-Warning "Ignoring $regEntry because Get-ItemProperty failed to find corresponding SDK registry entry"\r
+ $Error.Clear();\r
+ continue\r
+ }\r
$instDir=$rval\r
$instDir=$instDir -replace "\\Uninstall.exe.*",""\r
$instDir=$instDir -replace ".*=.",""\r
$reMinor=$rval.Split('.')[1]\r
$rePatch=$rval.Split('.')[2]\r
if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {\r
- echo "Setting mrVulkanDllInstallDir to $instDir" >>$log\r
+ Write-Host "Setting mrVulkanDllInstallDir to $instDir"\r
$mrVulkanDllInstallDir=$instDir\r
break\r
}\r
}\r
}\r
-\r
if (!$?) {\r
- echo "ERROR: Failed searching VulkanDLLList" >>$log\r
+ Write-Error "Error: Failed searching VulkanDLLList"\r
}\r
}\r
\r
# Note that we remove only those entries created by Vulkan SDKs. If other\r
# layers were installed that are not from an SDK, we don't mess with them.\r
\r
-echo "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log\r
+Write-Host "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"\r
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |\r
ForEach-Object {\r
$regval=$_\r
ForEach ($sdkdir in $VulkanSdkDirs) {\r
if ($regval -like "$sdkdir\*.json") {\r
Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval\r
- echo "Removed registry value $regval" >>$log\r
+ if (!$?) {\r
+ Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval"\r
+ } else {\r
+ Write-Host "Removed registry value $regval"\r
+ }\r
}\r
}\r
}\r
\r
if (!$?) {\r
- echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log\r
+ Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"\r
}\r
\r
# Remove 32-bit layer registry value if we're targeting a 64-bit OS\r
ForEach ($sdkdir in $VulkanSdkDirs) {\r
if ($regval -like "$sdkdir\*.json") {\r
Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval\r
- echo "Removed WOW6432Node registry value $regval" >>$log\r
+ if (!$?) {\r
+ Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval"\r
+ } else {\r
+ Write-Host "Removed WOW6432Node registry value $regval"\r
+ }\r
}\r
}\r
}\r
\r
if (!$?) {\r
- echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log\r
+ Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"\r
}\r
}\r
\r
\r
# Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from\r
\r
-echo "Creating new layer registry values" >>$log\r
+Write-Host "Creating new layer registry values"\r
if ($mrVulkanDllInstallDir -ne "") {\r
\r
# Create registry keys if they don't exist\r
if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) {\r
- echo "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log\r
+ Write-Host "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"\r
New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null\r
-\r
if (!$?) {\r
- echo "ERROR: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log\r
+ Write-Error "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"\r
}\r
}\r
if ($ossize -eq 64) {\r
if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) {\r
- echo "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log\r
+ Write-Host "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"\r
New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null\r
-\r
if (!$?) {\r
- echo "ERROR: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log\r
+ Write-Error "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"\r
}\r
}\r
}\r
\r
\r
if ($ossize -eq 64) {\r
- \r
# Create registry values in normal registry location for 64-bit items on a 64-bit OS\r
Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |\r
ForEach-Object {\r
- echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log\r
+ Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_"\r
New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null\r
-\r
if (!$?) {\r
- echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log\r
+ Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_"\r
}\r
}\r
+ if (!$?) {\r
+ Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object "\r
+ }\r
\r
# Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS\r
Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |\r
ForEach-Object {\r
- echo "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" >>$log\r
+ Write-Host "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_"\r
New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null\r
-\r
if (!$?) {\r
- echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin32\$_" >>$log\r
+ Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_"\r
}\r
}\r
- \r
+ if (!$?) {\r
+ Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object "\r
+ }\r
} else {\r
- \r
# Create registry values in normal registry location for 32-bit items on a 32-bit OS\r
Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |\r
ForEach-Object {\r
- echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log\r
+ Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_"\r
New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null\r
-\r
if (!$?) {\r
- echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log\r
+ Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_"\r
}\r
}\r
- \r
+ if (!$?) {\r
+ Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object "\r
+ }\r
}\r
}\r
\r
# Final log output\r
-echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log\r
-(Get-Date).ToString() >>$log\r
+Write-Host "ConfigLayersAndVulkanDLL.ps1 completed"\r
+$endTime=Get-Date\r
+Write-Host "End time: $endTime"\r
+\r
+Stop-Transcript\r
\r
# Convert logfile to ascii\r
-cat $log | out-File -encoding ascii -filepath $logascii\r
-remove-item $log\r
+Get-Content $log | Out-File -encoding ascii -filepath $logascii\r
+\r
+# Temp to be used for debugging failure to install issue (as VulkanRT folder might get removed)\r
+Get-Content $log | Out-File -encoding ascii -filepath $logascii2\r
+\r
\r
+# Remove the unicode log as we no longer need it.\r
+Remove-Item $log\r
\r
\r
# SIG # Begin signature block\r