Compare commits

...

6 Commits
v1.60 ... v1.65

Author SHA1 Message Date
Pete Batard
2fc1739224 Add UEFI Shell 25H1 downloads 2025-06-12 17:42:16 +01:00
Pete Batard
96c3637863 Add UEFI Shell 24H2 downloads
* Also add a new -PlatformArch option, to help avoid the very time consuming WMI call to autodetect the native CPU arch.
2024-11-24 22:26:40 +00:00
Pete Batard
c034a4e72a Fix localization of error message 715-123130
* As usual, Microsoft are completely unable to properly process UTF-8 content, even if
  the response from an Invoke-WebRequest query explicitly specifies "charset=utf-8".
* So, once again, we need to force PowerShell's hand to treat the content as UTF-8.
* Also improve the default error message if we can't get it from Microsoft.
2024-11-20 13:51:17 +00:00
Pete Batard
ce405fa35c Switch to using the new JSON Windows download API
* This simplifies things quite a bit since we were converting HTML to XML to JSON before.
* Also drop the custom User Agent for now.
  We'll have to see how long it takes Microsoft to go back to filtering out PowerShell...
* Closes #98.
2024-11-19 22:42:39 +00:00
Pete Batard
5402fc6222 Add ARM64 Windows 11 downloads
* Gotta really praise Microsoft for having designed their download servers to
  handle multiple archs for the same Windows SKUs... and then completely throw
  that out of the window to instead make Windows 11 ARM64 a different SKU.
* Now, because we don't want to be *AS MORONIC AS MICROSOFT*, we go the extra
  mile (and issue multiple requests, using multiple session IDs) to make the
  ARM64 *ARCHITECTURE* fall into the fold of where it belongs, i.e. as a user
  selectable property of a single Windows 11 release.
* Closes #97.
2024-11-18 01:52:22 +00:00
Pete Batard
f8cec58032 Clean up and update
* Drop Korean exception, since Microsoft no longer serves Korean specific images, and simplify Chinese exceptions.
* Drop Windows 7 ISO handling, since Microsoft no longer serves Windows 7 ISOs.
* Update Firefox user agent version.
* Add a new -Debug switch to dump responses, and simplify verbosity handling.
2024-11-15 13:15:01 +00:00
2 changed files with 374 additions and 350 deletions

720
Fido.ps1
View File

@@ -1,6 +1,6 @@
#
# Fido v1.60 - Feature ISO Downloader, for retail Windows images and UEFI Shell
# Copyright © 2019-2024 Pete Batard <pete@akeo.ie>
# Fido v1.65 - ISO Downloader, for Microsoft Windows and UEFI Shell
# Copyright © 2019-2025 Pete Batard <pete@akeo.ie>
# Command line support: Copyright © 2021 flx5
# ConvertTo-ImageSource: Copyright © 2016 Chris Carter
#
@@ -24,7 +24,7 @@
#region Parameters
param(
# (Optional) The title to display on the application window.
[string]$AppTitle = "Fido - Feature ISO Downloader",
[string]$AppTitle = "Fido - ISO Downloader",
# (Optional) '|' separated UI localization strings.
[string]$LocData,
# (Optional) Forced locale
@@ -46,8 +46,13 @@ param(
[string]$Arch,
# (Optional) Only display the download URL [Toggles commandline mode]
[switch]$GetUrl = $false,
# (Optional) Specify the architecture of the underlying CPU.
# This avoids a VERY TIME CONSUMING call to WMI to autodetect the arch.
[string]$PlatformArch,
# (Optional) Increase verbosity
[switch]$Verbose = $false
[switch]$Verbose = $false,
# (Optional) Produce debugging information
[switch]$Debug = $false
)
#endregion
@@ -132,16 +137,16 @@ if (!$Cmd) {
#endregion
#region Data
$zh = 0x10000
$ko = 0x20000
$WindowsVersions = @(
@(
@("Windows 11", "windows11"),
@(
"24H2 (Build 26100.1742 - 2024.10)",
@("Windows 11 Home/Pro/Edu", 3113),
@("Windows 11 Home China ", ($zh + 3115))
@("Windows 11 Pro China ", ($zh + 3114))
# Thanks to Microsoft's hare-brained decision not to treat ARM64 as a CPU arch,
# like they did for x86 and x64, we have to handle multiple IDs for each release...
@("Windows 11 Home/Pro/Edu", @(3113, 3131)),
@("Windows 11 Home China ", @(3115, 3132)),
@("Windows 11 Pro China ", @(3114, 3133))
)
),
@(
@@ -149,11 +154,21 @@ $WindowsVersions = @(
@(
"22H2 v1 (Build 19045.2965 - 2023.05)",
@("Windows 10 Home/Pro/Edu", 2618),
@("Windows 10 Home China ", ($zh + 2378))
@("Windows 10 Home China ", 2378)
)
)
@(
@("UEFI Shell 2.2", "UEFI_SHELL 2.2"),
@(
"25H1 (edk2-stable202505)",
@("Release", 0),
@("Debug", 1)
),
@(
"24H2 (edk2-stable202411)",
@("Release", 0),
@("Debug", 1)
),
@(
"24H1 (edk2-stable202405)",
@("Release", 0),
@@ -344,17 +359,6 @@ function ConvertTo-ImageSource
}
}
function Throw-Error([object]$Req, [string]$Alt)
{
$Err = $(GetElementById -Request $Req -Id "errorModalMessage").innerText -replace "<[^>]+>" -replace "\s+", " "
if (!$Err) {
$Err = $Alt
} else {
$Err = [System.Text.Encoding]::UTF8.GetString([byte[]][char[]]$Err)
}
throw $Err
}
# Translate a message string
function Get-Translation([string]$Text)
{
@@ -379,14 +383,31 @@ function Get-Translation([string]$Text)
return $Text
}
# Some PowerShells don't have Microsoft.mshtml assembly (comes with MS Office?)
# so we can't use ParsedHtml or IHTMLDocument[2|3] features there...
function GetElementById([object]$Request, [string]$Id)
# Get the underlying *native* CPU architecture
function Get-Arch
{
try {
return $Request.ParsedHtml.IHTMLDocument3_GetElementByID($Id)
} catch {
return $Request.AllElements | ? {$_.id -eq $Id}
$Arch = Get-CimInstance -ClassName Win32_Processor | Select-Object -ExpandProperty Architecture
switch($Arch) {
0 { return "x86" }
1 { return "MIPS" }
2 { return "Alpha" }
3 { return "PowerPC" }
5 { return "ARM32" }
6 { return "IA64" }
9 { return "x64" }
12 { return "ARM64" }
default { return "Unknown"}
}
}
# Convert a Microsoft arch type code to a formal architecture name
function Get-Arch-From-Type([int]$Type)
{
switch($Type) {
0 { return "x86" }
1 { return "x64" }
2 { return "ARM64" }
default { return "Unknown"}
}
}
@@ -403,17 +424,6 @@ function Error([string]$ErrorMessage)
$script:ExitCode = 2
}
}
function Get-RandomDate()
{
[DateTime]$Min = "1/1/2008"
[DateTime]$Max = [DateTime]::Now
$RandomGen = new-object random
$RandomTicks = [Convert]::ToInt64( ($Max.ticks * 1.0 - $Min.Ticks * 1.0 ) * $RandomGen.NextDouble() + $Min.Ticks * 1.0 )
$Date = new-object DateTime($RandomTicks)
return $Date.ToString("yyyyMMdd")
}
#endregion
#region Form
@@ -441,25 +451,24 @@ if ($Cmd) {
$ltrm = ""
}
$MaxStage = 4
$SessionId = [guid]::NewGuid()
# Can't reuse the same sessionId for x64 and ARM64. The Microsoft servers
# are purposefully designed to ever process one specific download request
# that matches the last SKUs retrieved.
$SessionId = @($null) * 2
$ExitCode = 100
$Locale = $Locale
$RequestData = @{}
# This GUID applies to all visitors, regardless of their locale
$RequestData["GetLangs"] = @("a8f8f489-4c7f-463a-9ca6-5cff94d8d041", "getskuinformationbyproductedition" )
# This GUID applies to visitors of the en-US download page. Other locales may get a different GUID.
$RequestData["GetLinks"] = @("6e2a1789-ef16-4f27-a296-74ef7ef5d96b", "GetProductDownloadLinksBySku" )
# Create a semi-random Linux User-Agent string
$FirefoxVersion = Get-Random -Minimum 90 -Maximum 110
$FirefoxDate = Get-RandomDate
$UserAgent = "Mozilla/5.0 (X11; Linux i586; rv:$FirefoxVersion.0) Gecko/$FirefoxDate Firefox/$FirefoxVersion.0"
$Verbosity = 2
if ($Cmd) {
if ($GetUrl) {
$Verbosity = 0
} elseif (!$Verbose) {
$Verbosity = 1
}
$OrgId = "y6jn8c31"
$ProfileId = "606624d44113"
$Verbosity = 1
if ($Debug) {
$Verbosity = 5
} elseif ($Verbose) {
$Verbosity = 2
} elseif ($Cmd -and $GetUrl) {
$Verbosity = 0
}
if (!$PlatformArch) {
$PlatformArch = Get-Arch
}
#endregion
@@ -504,13 +513,7 @@ function Check-Locale
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
# Looks Microsoft are filtering our script according to the first query it performs with the spoofed user agent.
# So, to continue this pointless cat and mouse game, we simply add an extra first query with the default user agent.
# Also: "Hi Microsoft. You sure have A LOT OF RESOURCES TO WASTE to have assigned folks of yours to cripple scripts
# that merely exist because you have chosen to make the user experience from your download website utterly subpar.
# And while I am glad senpai noticed me (UwU), I feel compelled to ask: Don't you guys have better things to do?"
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 $url | Out-Null
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 -UserAgent $UserAgent $url | Out-Null
} catch {
# Of course PowerShell 7 had to BREAK $_.Exception.Status on timeouts...
if ($_.Exception.Status -eq "Timeout" -or $_.Exception.GetType().Name -eq "TaskCanceledException") {
@@ -520,6 +523,33 @@ function Check-Locale
}
}
function Get-Code-715-123130-Message
{
try {
$url = "https://www.microsoft.com/" + $QueryLocale + "/software-download/windows11"
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
$r = Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 $url
# Microsoft's handling of UTF-8 content is soooooooo *UTTERLY BROKEN*!!!
$r = [System.Text.Encoding]::UTF8.GetString($r.RawContentStream.ToArray())
# PowerShell 7 forces us to parse the HTML ourselves
$r = $r -replace "`n" -replace "`r"
$pattern = '.*<input id="msg-01" type="hidden" value="(.*?)"/>.*'
$msg = [regex]::Match($r, $pattern).Groups[1].Value
$msg = $msg -replace "&lt;", "<" -replace "<[^>]+>" -replace "\s+", " "
if (($msg -eq $null) -or !($msg -match "715-123130")) {
throw
}
} catch {
$msg = "Your IP address has been banned by Microsoft for issuing too many ISO download requests or for "
$msg += "belonging to a region of the world where sanctions currently apply. Please try again later.`r`n"
$msg += "If you believe this ban to be in error, you can try contacting Microsoft by referring to "
$msg += "message code 715-123130 and session ID "
}
return $msg
}
# Return an array of releases (e.g. 20H2, 21H1, ...) for the selected Windows version
function Get-Windows-Releases([int]$SelectedVersion)
{
@@ -541,8 +571,8 @@ function Get-Windows-Editions([int]$SelectedVersion, [int]$SelectedRelease)
foreach ($release in $WindowsVersions[$SelectedVersion][$SelectedRelease])
{
if ($release -is [array]) {
if (($release[1] -lt 0x10000) -or ($Locale.StartsWith("ko") -and ($release[1] -band $ko)) -or ($Locale.StartsWith("zh") -and ($release[1] -band $zh))) {
$editions += @(New-Object PsObject -Property @{ Edition = $release[0]; Id = $($release[1] -band 0xFFFF) })
if (!($release[0].Contains("China")) -or ($Locale.StartsWith("zh"))) {
$editions += @(New-Object PsObject -Property @{ Edition = $release[0]; Id = $release[1] })
}
}
}
@@ -550,86 +580,86 @@ function Get-Windows-Editions([int]$SelectedVersion, [int]$SelectedRelease)
}
# Return an array of languages for the selected edition
function Get-Windows-Languages([int]$SelectedVersion, [int]$SelectedEdition)
function Get-Windows-Languages([int]$SelectedVersion, [object]$SelectedEdition)
{
$languages = @()
$i = 0;
if ($WindowsVersions[$SelectedVersion][0][1] -eq "WIN7") {
foreach ($entry in $Windows7Versions[$SelectedEdition]) {
if ($entry[0] -ne "") {
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = $entry[0]; Language = $entry[1]; Id = $i })
$langs = @()
if ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
$langs += @(New-Object PsObject -Property @{ DisplayName = "English (US)"; Name = "en-us"; Data = @($null) })
} else {
$languages = [ordered]@{}
$SessionIndex = 0
foreach ($EditionId in $SelectedEdition) {
$SessionId[$SessionIndex] = [guid]::NewGuid()
# Microsoft download protection now requires the sessionId to be whitelisted through vlscppe.microsoft.com/tags
$url = "https://vlscppe.microsoft.com/tags"
$url += "?org_id=" + $OrgId
$url += "&session_id=" + $SessionId[$SessionIndex]
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
try {
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 $url | Out-Null
} catch {
Error($_.Exception.Message)
return @()
}
$url = "https://www.microsoft.com/software-download-connector/api/getskuinformationbyproductedition"
$url += "?profile=" + $ProfileId
$url += "&productEditionId=" + $EditionId
$url += "&SKU=undefined"
$url += "&friendlyFileName=undefined"
$url += "&Locale=" + $QueryLocale
$url += "&sessionID=" + $SessionId[$SessionIndex]
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
try {
$r = Invoke-RestMethod -UseBasicParsing -TimeoutSec $DefaultTimeout -SessionVariable "Session" $url
if ($r -eq $null) {
throw "Could not retrieve languages from server"
}
if ($Verbosity -ge 5) {
Write-Host "=============================================================================="
Write-Host ($r | ConvertTo-Json)
Write-Host "=============================================================================="
}
if ($r.Errors) {
throw $r.Errors[0].Value
}
foreach ($Sku in $r.Skus) {
if (!$languages.Contains($Sku.Language)) {
$languages[$Sku.Language] = @{ DisplayName = $Sku.LocalizedLanguage; Data = @() }
}
$languages[$Sku.Language].Data += @{ SessionIndex = $SessionIndex; SkuId = $Sku.Id }
}
if ($languages.Length -eq 0) {
throw "Could not parse languages"
}
} catch {
Error($_.Exception.Message)
return @()
}
$SessionIndex++
}
# Need to convert to an array since PowerShell treats them differently from hashtable
$i = 0
$script:SelectedIndex = 0
foreach($language in $languages.Keys) {
$langs += @(New-Object PsObject -Property @{ DisplayName = $languages[$language].DisplayName; Name = $language; Data = $languages[$language].Data })
if (Select-Language($language)) {
$script:SelectedIndex = $i
}
$i++
}
} elseif ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = "English (US)"; Language = "en-us"; Id = 0 })
} else {
# Microsoft download protection now requires the sessionId to be whitelisted through vlscppe.microsoft.com/tags
$url = "https://vlscppe.microsoft.com/tags?org_id=y6jn8c31&session_id=" + $SessionId
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
try {
Invoke-WebRequest -UseBasicParsing -TimeoutSec $DefaultTimeout -MaximumRedirection 0 -UserAgent $UserAgent $url | Out-Null
} catch {
Error($_.Exception.Message)
return @()
}
$url = "https://www.microsoft.com/" + $QueryLocale + "/api/controls/contentinclude/html"
$url += "?pageId=" + $RequestData["GetLangs"][0]
$url += "&host=www.microsoft.com"
$url += "&segments=software-download," + $WindowsVersions[$SelectedVersion][0][1]
$url += "&query=&action=" + $RequestData["GetLangs"][1]
$url += "&sessionId=" + $SessionId
$url += "&productEditionId=" + [Math]::Abs($SelectedEdition)
$url += "&sdVersion=2"
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
$script:SelectedIndex = 0
try {
$r = Invoke-WebRequest -Method Post -UseBasicParsing -TimeoutSec $DefaultTimeout -UserAgent $UserAgent -SessionVariable "Session" $url
if ($r -match "errorModalMessage") {
Throw-Error -Req $r -Alt "Could not retrieve languages from server"
}
$r = $r -replace "`n" -replace "`r"
$pattern = '.*<select id="product-languages"[^>]*>(.*)</select>.*'
$html = [regex]::Match($r, $pattern).Groups[1].Value
# Go through an XML conversion to keep all PowerShells happy...
$html = $html.Replace("selected value", "value")
$html = "<options>" + $html + "</options>"
$xml = [xml]$html
foreach ($var in $xml.options.option) {
$json = $var.value | ConvertFrom-Json;
if ($json) {
$languages += @(New-Object PsObject -Property @{ DisplayLanguage = $var.InnerText; Language = $json.language; Id = $json.id })
if (Select-Language($json.language)) {
$script:SelectedIndex = $i
}
$i++
}
}
if ($languages.Length -eq 0) {
Throw-Error -Req $r -Alt "Could not parse languages"
}
} catch {
Error($_.Exception.Message)
return @()
}
}
return $languages
return $langs
}
# Return an array of download links for each supported arch
function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease, [int]$SelectedEdition, [string]$SkuId, [string]$LanguageName)
function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease, [object]$SelectedEdition, [PSCustomObject]$SelectedLanguage)
{
$links = @()
if ($WindowsVersions[$SelectedVersion][0][1] -eq "WIN7") {
foreach ($Version in $Windows7Versions[$SelectedEdition][$SkuId][2]) {
$links += @(New-Object PsObject -Property @{ Type = $Version[0]; Link = $Version[1] })
}
} elseif ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
if ($WindowsVersions[$SelectedVersion][0][1].StartsWith("UEFI_SHELL")) {
$tag = $WindowsVersions[$SelectedVersion][$SelectedRelease][0].Split(' ')[0]
$shell_version = $WindowsVersions[$SelectedVersion][0][1].Split(' ')[1]
$url = "https://github.com/pbatard/UEFI-Shell/releases/download/" + $tag
@@ -653,69 +683,62 @@ function Get-Windows-Download-Links([int]$SelectedVersion, [int]$SelectedRelease
$archs += $sep + $arch
$sep = ", "
}
$links += @(New-Object PsObject -Property @{ Type = $archs; Link = $link })
$links += @(New-Object PsObject -Property @{ Arch = $archs; Url = $link })
} catch {
Error($_.Exception.Message)
return @()
}
} else {
$url = "https://www.microsoft.com/" + $QueryLocale + "/api/controls/contentinclude/html"
$url += "?pageId=" + $RequestData["GetLinks"][0]
$url += "&host=www.microsoft.com"
$url += "&segments=software-download," + $WindowsVersions[$SelectedVersion][0][1]
$url += "&query=&action=" + $RequestData["GetLinks"][1]
$url += "&sessionId=" + $SessionId
$url += "&skuId=" + $SkuId
$url += "&language=" + $LanguageName
$url += "&sdVersion=2"
if ($Verbosity -ge 2) {
Write-Host Querying $url
foreach ($Entry in $SelectedLanguage.Data) {
$url = "https://www.microsoft.com/software-download-connector/api/GetProductDownloadLinksBySku"
$url += "?profile=" + $ProfileId
$url += "&productEditionId=undefined"
$url += "&SKU=" + $Entry.SkuId
$url += "&friendlyFileName=undefined"
$url += "&Locale=" + $QueryLocale
$url += "&sessionID=" + $SessionId[$Entry.SessionIndex]
if ($Verbosity -ge 2) {
Write-Host Querying $url
}
try {
# Must add a referer for this request, else Microsoft's servers may deny it
$ref = "https://www.microsoft.com/software-download/windows11"
$r = Invoke-RestMethod -Headers @{ "Referer" = $ref } -UseBasicParsing -TimeoutSec $DefaultTimeout -SessionVariable "Session" $url
if ($r -eq $null) {
throw "Could not retrieve architectures from server"
}
if ($Verbosity -ge 5) {
Write-Host "=============================================================================="
Write-Host ($r | ConvertTo-Json)
Write-Host "=============================================================================="
}
if ($r.Errors) {
if ( $r.Errors[0].Type -eq 9) {
$msg = Get-Code-715-123130-Message
throw $msg + $SessionId[$Entry.SessionIndex] + "."
} else {
throw $r.Errors[0].Value
}
}
foreach ($ProductDownloadOption in $r.ProductDownloadOptions) {
$links += @(New-Object PsObject -Property @{ Arch = (Get-Arch-From-Type $ProductDownloadOption.DownloadType); Url = $ProductDownloadOption.Uri })
}
if ($links.Length -eq 0) {
throw "Could not retrieve ISO download links"
}
} catch {
Error($_.Exception.Message)
return @()
}
$SessionIndex++
}
$i = 0
$script:SelectedIndex = 0
try {
$Is64 = [Environment]::Is64BitOperatingSystem
# Must add a referer for this request, else Microsoft's servers will deny it
$ref = "https://www.microsoft.com/software-download/windows11"
$r = Invoke-WebRequest -Method Post -Headers @{ "Referer" = $ref } -UseBasicParsing -TimeoutSec $DefaultTimeout -UserAgent $UserAgent -WebSession $Session $url
if ($r -match "errorModalMessage") {
$Alt = [regex]::Match($r.Content, '<p id="errorModalMessage">(.+?)<\/p>').Groups[1].Value -replace "<[^>]+>" -replace "\s+", " " -replace "\?\?\?", "-"
$Alt = [System.Text.Encoding]::UTF8.GetString([byte[]][char[]]$Alt)
if (!$Alt) {
$Alt = "Could not retrieve architectures from server"
} elseif ($Alt -match "715-123130") {
$Alt += " " + $SessionId + "."
}
Throw-Error -Req $r -Alt $Alt
foreach($link in $links) {
if ($link.Arch -eq $PlatformArch) {
$script:SelectedIndex = $i
}
$pattern = '(?s)(<input.*?></input>)'
ForEach-Object { [regex]::Matches($r, $pattern) } | ForEach-Object { $html += $_.Groups[1].value }
# Need to fix the HTML and JSON data so that it is well-formed
$html = $html.Replace("class=product-download-hidden", "")
$html = $html.Replace("type=hidden", "")
$html = $html.Replace("&nbsp;", " ")
$html = $html.Replace("IsoX86", "&quot;x86&quot;")
$html = $html.Replace("IsoX64", "&quot;x64&quot;")
$html = "<inputs>" + $html + "</inputs>"
$xml = [xml]$html
foreach ($var in $xml.inputs.input) {
$json = $var.value | ConvertFrom-Json;
if ($json) {
if (($Is64 -and $json.DownloadType -eq "x64") -or (!$Is64 -and $json.DownloadType -eq "x86")) {
$script:SelectedIndex = $i
}
$links += @(New-Object PsObject -Property @{ Type = $json.DownloadType; Link = $json.Uri })
$i++
}
}
if ($links.Length -eq 0) {
Throw-Error -Req $r -Alt "Could not retrieve ISO download links"
}
} catch {
Error($_.Exception.Message)
return @()
$i++
}
}
return $links
@@ -849,21 +872,21 @@ if ($Cmd) {
$Lang = $Lang.replace(')', '\)')
}
$i = 0
$winLanguage = $null
foreach ($language in $languages) {
if ($Lang -eq "List") {
Write-Host " -" $language.Language
} elseif ((!$Lang -and $script:SelectedIndex -eq $i) -or ($Lang -and $language.Language -match $Lang)) {
Write-Host " -" $language.Name
} elseif ((!$Lang -and $script:SelectedIndex -eq $i) -or ($Lang -and $language.Name -match $Lang)) {
if (!$Lang -and $Verbosity -ge 1) {
Write-Host "No language specified (-Lang). Defaulting to '$($language.Language)'."
Write-Host "No language specified (-Lang). Defaulting to '$($language.Name)'."
}
$Selected += ", " + $language.Language
$winLanguageId = $language.Id
$winLanguageName = $language.Language
$Selected += ", " + $language.Name
$winLanguage = $language
break;
}
$i++
}
if (!$winLanguageId -or !$winLanguageName) {
if ($winLanguage -eq $null) {
if ($Lang -ne "List") {
Write-Host "Invalid Windows language provided."
Write-Host "Use '-Lang List' for a list of available languages or remove the option to use system default."
@@ -872,7 +895,7 @@ if ($Cmd) {
}
# Language selection => Request and populate Arch download links
$links = Get-Windows-Download-Links $winVersionId $winReleaseId $winEditionId $winLanguageId $winLanguageName
$links = Get-Windows-Download-Links $winVersionId $winReleaseId $winEditionId $winLanguage
if (!$links) {
exit 3
}
@@ -882,12 +905,12 @@ if ($Cmd) {
$i = 0
foreach ($link in $links) {
if ($Arch -eq "List") {
Write-Host " -" $link.Type
} elseif ((!$Arch -and $script:SelectedIndex -eq $i) -or ($Arch -and $link.Type -match $Arch)) {
Write-Host " -" $link.Arch
} elseif ((!$Arch -and $script:SelectedIndex -eq $i) -or ($Arch -and $link.Arch -match $Arch)) {
if (!$Arch -and $Verbosity -ge 1) {
Write-Host "No architecture specified (-Arch). Defaulting to '$($link.Type)'."
Write-Host "No architecture specified (-Arch). Defaulting to '$($link.Arch)'."
}
$Selected += ", [" + $link.Type + "]"
$Selected += ", [" + $link.Arch + "]"
$winLink = $link
break;
}
@@ -903,11 +926,11 @@ if ($Cmd) {
# Arch selection => Return selected download link
if ($GetUrl) {
Return $winLink.Link
return $winLink.Url
$ExitCode = 0
} else {
Write-Host "Selected: $Selected"
$ExitCode = Process-Download-Link $winLink.Link
$ExitCode = Process-Download-Link $winLink.Url
}
# Clean up & exit
@@ -981,7 +1004,7 @@ $Continue.add_click({
if ($languages.Length -eq 0) {
break
}
$script:Language = Add-Entry $Stage "Language" $languages "DisplayLanguage"
$script:Language = Add-Entry $Stage "Language" $languages "DisplayName"
$Language.SelectedIndex = $script:SelectedIndex
$XMLForm.Title = $AppTitle
}
@@ -989,11 +1012,11 @@ $Continue.add_click({
4 { # Language selection => Request and populate Arch download links
$XMLForm.Title = Get-Translation($English[12])
Refresh-Control($XMLForm)
$links = Get-Windows-Download-Links $WindowsVersion.SelectedValue.Index $WindowsRelease.SelectedValue.Index $ProductEdition.SelectedValue.Id $Language.SelectedValue.Id $Language.SelectedValue.Language
$links = Get-Windows-Download-Links $WindowsVersion.SelectedValue.Index $WindowsRelease.SelectedValue.Index $ProductEdition.SelectedValue.Id $Language.SelectedValue
if ($links.Length -eq 0) {
break
}
$script:Architecture = Add-Entry $Stage "Architecture" $links "Type"
$script:Architecture = Add-Entry $Stage "Architecture" $links "Arch"
if ($PipeName) {
$XMLForm.Height += $dh / 2;
$Margin = $Continue.Margin
@@ -1015,7 +1038,7 @@ $Continue.add_click({
}
5 { # Arch selection => Return selected download link
$script:ExitCode = Process-Download-Link $Architecture.SelectedValue.Link
$script:ExitCode = Process-Download-Link $Architecture.SelectedValue.Url
$XMLForm.Close()
}
}
@@ -1063,10 +1086,10 @@ $XMLForm.ShowDialog() | Out-Null
exit $ExitCode
# SIG # Begin signature block
# MIItQQYJKoZIhvcNAQcCoIItMjCCLS4CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# MIIteQYJKoZIhvcNAQcCoIItajCCLWYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBtPiNSLEeXGM78
# TkKiKAxxWhAbI0yezasTCr8DiGkJWqCCEkAwggVvMIIEV6ADAgECAhBI/JO0YFWU
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAyD9EfCX0lJe6x
# 83kEpMG1UAMbENelXYurWhqLzco2zKCCEkAwggVvMIIEV6ADAgECAhBI/JO0YFWU
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
@@ -1163,146 +1186,147 @@ exit $ExitCode
# 4a6KRpYwLMYE9/ZBEBP7JpfiMt42q+QF6fyS8xauGiOGBOZW4ch7Wh+GBoe3JZUu
# UPC4wZDC9LeRKz/otodtloaTEnW9YE9gPmfRttMWaNsQTg6y5sc74qLoVY0RSqcW
# B2KScXAjuVHVkJJcOoPSuLoTjOhK3Ug4XbQmRypdteoizdTSnONGmW84RJyXquzi
# rIjw9CnLTggrZiYi9EZTo7URWNaARqLbSFpu0VMkdOBpWdXq5F6x6jslMYIaVzCC
# GlMCAQEwazBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
# rIjw9CnLTggrZiYi9EZTo7URWNaARqLbSFpu0VMkdOBpWdXq5F6x6jslMYIajzCC
# GosCAQEwazBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
# MS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgRVYgUjM2
# AhA3xQo8HaADcccNx8YmkC/lMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIB
# DDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILNxh6sw0CaZahiZLy05HflV
# ycXbxb2NVGIv0+ufLIlXMA0GCSqGSIb3DQEBAQUABIICAKGUtWq3odL66c6bpXzZ
# A94nLOEOtbR2SwcjGIiBrBhUCOYeAf8gs5u6mdYpHFH7RRKST/yH7EaTaY8BMztx
# ftFyXQNOaNFyVQR6exp/r/d4gi3NNCK2zJrrYAElpJSCmtFgMAjrK2U/+FotG7/S
# nrTV/5tNuJ6hmsTHjiuoUQf2lHHio/esepf3w56ciKq5f7BraXJ1TVQXOtNZgk2P
# lTWXq40btbAjcCM6o77P4yeozsHxXQpQWOcmxa5Zq2W6Ew5XcbOF6DBo9a/BxTrx
# 7kThKgFGtm9LtuOLdnFYfB/Eb4Td4xOHyytm0HBE7oRFODATkLjhiJ8dfOeyOYnQ
# 9UGcCnHeKHs6lsto3dsEOn/vWAAAlUInPuV/mhmYMbW2KCkNXl6arhnpZnW3Aa64
# +xgbtmrw7O++qfcFqAoVdwDSjpZCielze+hiEhFF4z87dQf7vx37Y5ytMyF0qXqd
# ywR6MU2z+3yCGiHxo1r1BON+2Ni3jPy0eLoZIuuW2JhMsfGgGy7soLE8K8wzXaWQ
# dfSemD6BZkUmdPpv0wzrzn1CXYxqJH/cHbUDHVa37DhG9zEV8m8EVxesI7F7Xl4F
# nEdxD/q05cTVarVc6p92CdzZLTeHWqkpISHI/gZFtbRUG7T0hTq0uPMUz+OQs9Y0
# h8WODnQNJsBTgjgxHliziuYooYIXPzCCFzsGCisGAQQBgjcDAwExghcrMIIXJwYJ
# KoZIhvcNAQcCoIIXGDCCFxQCAQMxDzANBglghkgBZQMEAgEFADB3BgsqhkiG9w0B
# CRABBKBoBGYwZAIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEIB0nwJD/
# 0FxX+XBujfItu4CZQ3NkYwmbLw7NBdilnF9HAhBMGajPJlkaUKXf9GUG4Yy2GA8y
# MDI0MTAwMzE1NTExOFqgghMJMIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/X+Vh
# FjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNl
# cnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBT
# SEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0MTAxMzIz
# NTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSAw
# HgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X5dLnXaEOCdwvSKOXejsq
# nGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uUUI8cIOrHmjsvlmbjaedp
# /lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa2mq62DvKXd4ZGIX7ReoN
# YWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RChG4PBuOZS
# lbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60pCFkcOvV5aDaY7Mu6QXu
# qvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17cz4y7lI0+9S769SgLDSb
# 495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0rRUGFOpi
# CBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQfqZcClhM
# AD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw9/sqhux7UjipmAmhcbJs
# ca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1Pt7U20clf
# CKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhRB8qUt+JQofM604qDy0B7
# AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNV
# HSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgB
# hv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYE
# FKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9j
# cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZU
# aW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzAB
# hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9j
# YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEy
# NTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAIEa1t6gqbWY
# F7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF7SaCinEvGN1Ott5s1+Fg
# nCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrCQDifXcigLiV4JZ0qBXqE
# KZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFcjGnRuSvExnvPnPp44pMa
# dqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8wWkZus8W8oM3NG6wQSbd
# 3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbFKNOt50MAcN7MmJ4ZiQPq
# 1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP4xeR0arAVeOGv6wnLEHQ
# mjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5AdzaROY6
# 3jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvrmoI1VygWy2nyMpqy0tg6
# uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2obhDLN9OTH0eaHDAdwrU
# AuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9nR2XlG3O2
# mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhH
# rP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD
# ExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcw
# MzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
# Yy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYg
# VGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# xoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo
# +n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQX
# f6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8
# ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6l
# Y2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lX
# KZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU
# 2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2
# RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR
# 8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015L
# dhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNY
# CQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIG
# A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshv
# MB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIB
# hjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUH
# MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDov
# L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQw
# QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZI
# AYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBgu
# EE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFn
# zbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/t
# YLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWK
# cXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7
# pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkP
# lM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4
# c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kad
# dSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYaw
# mKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL
# 5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3b
# NzgaoSv27dZ8/DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZI
# hvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
# MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNz
# dXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVow
# YjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ
# d3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290
# IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjww
# IjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J5
# 8soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMH
# hOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6
# Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQ
# ecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4b
# A3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9
# WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCU
# tNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvo
# ZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/J
# vNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCP
# orF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMB
# Af8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXr
# oq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRt
# MGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEF
# BQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl
# ZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgw
# BgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cH
# vZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8
# UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTn
# f+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxU
# jG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8j
# LfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3Yw
# ggNyAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRp
# bWVTdGFtcGluZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKCB
# 0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI0
# MTAwMzE1NTExOFowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUZvArMsLCyQ+CXc6q
# isnGTxmcz0AwLwYJKoZIhvcNAQkEMSIEICiIwImZvFX0mdpPR+PU3lkBJEFMTA0w
# d/QNTqb6BCS6MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEINL25G3tdCLM0dRAV2hB
# Nm+CitpVmq4zFq9NGprUDHgoMA0GCSqGSIb3DQEBAQUABIICADC+QSFdqt3dgqTu
# mXLoj9HljDAfmY2SD7LcASNiInfmLSQGD9q35dUJTsg0b1dLS5eI48hY6K9h7AO5
# 337AR04wblStvnWUx7MMzoNPD+WPLngl5oeBjluoiOYq/FVZ1ttSmie8lx0O5/e0
# qgoTJdFE2/SJJlKa7BQHvvh6STq24ZMY/IzM3EszFPfTlfAmQab6l+ATZFL84W3X
# 1RmM8k/I9+taqgOUOqNAzdhfBDI2ibgqDbvzR3w4fAogK0MtCCzKuMRa00YDidH4
# XFcszS0HxlJG9L4+tJElO40reS9ip097g13s1gQjUpDp+JEXhe/Lhvdg5n95XN54
# 2uW93Iy7O55ho6zaNAQutmC3KUiJ37HtwCZD4PkMfxhNDBUCBh3EUQ2AFjnqzcDh
# I+rBRSEI3hLhbxSnKRBcdkZHMW11QDaZbB5VaDOpGONItVKwgI3uCa8/B/pbrIWM
# 8X+GKA/7b20ikO/l3UvLmj8RBaToQZ++qgOhKkwg7xg5BNcRtPi5Ab6E5P6y5PRA
# nF7Z8x86+gPN6nKi9K7zQNhvs4mWENyZXayjNT4abA8dc4Mk69fu80IyfzTr1u/N
# m6bvvLMoMW2V59YZXZ97/NaXtr1MxSPtoewvGIfE+cv02jqqNrKtlkRVDgPyOquQ
# LA4ifjB85kOrPfh607d+3nyBVxPC
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIG0D6v+Xe1Sks8mmJujcNm95
# 3bc/RLY5rlt1517igHlqMA0GCSqGSIb3DQEBAQUABIICAFUwPNNSVsHbMJ19wvW7
# Wr8JsO58p3A97jQCskIk8pIrekI/YnX59cFsTmc+dmZcslxjkrL8Qymh6ZHJsph3
# qP99AK8Kq4GqlkC1PO+YEmRTXlGDyZbOU/c/r5JnB6DBA6VZCLAb2xf2ArGsP/nQ
# 4TIWSIvRR0A1pm3OscomB1gfJnC5aCTYNklRKZmYgjvyzewvcJq2z76Lna+2MsSO
# Z+/hzvY/i1Go+jJWX5L4v99ZhOFHkCa9GEo3gB9qmZ5OYxrAxQLJRyX7EE/9K/0h
# BKjqLWmtJZLlnLQCUVZwIwBA94WKpNhiyQbn1I4PgnCbllMhh798Ie/Leg9c+vRy
# gicR2DGo8xnwhQ8akYws6QnGy+ACQTkePI/XQ4sP2Zrbwz4ci7+BO2cogoSd4R9j
# 1MvkxQeosaS8eCH4lHhN47ljTvGD0Nwzz4em4CG4Dxa3ojOuGCLXJlbpmXEBlSFw
# Ij+y2pFz4EgWZ0EXSbtVcMUB+BKXm7RPk789mDKPhYkXroG4vQZ6vMxTZ6CaWBgA
# CARiG6Bt5en84eJU3+UivE7w2l2qP3wMmFsmo6z3wca/AtzeUixJUzZUr2lXsgpL
# 11Zya665uZQ605wSyjZAs5h9WqaM13ZhXlZkDKXrx/BM+5hNGBHJqrZchL7kHBtP
# ysRp3TbdAcBddNKq5NYrOWdKoYIXdzCCF3MGCisGAQQBgjcDAwExghdjMIIXXwYJ
# KoZIhvcNAQcCoIIXUDCCF0wCAQMxDzANBglghkgBZQMEAgEFADB4BgsqhkiG9w0B
# CRABBKBpBGcwZQIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEIFVKg4Bk
# 66QdVGGeigU62UhX89H4gz2i20pHnPUHmieaAhEAmYZVzIX3YFfY74hTITENYxgP
# MjAyNTA2MTIxNjQwNTFaoIITOjCCBu0wggTVoAMCAQICEAqA7xhLjfEFgtHEdqeV
# dGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD
# ZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFt
# cGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTAeFw0yNTA2MDQwMDAwMDBaFw0z
# NjA5MDMyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgU0hBMjU2IFJTQTQwOTYgVGltZXN0YW1w
# IFJlc3BvbmRlciAyMDI1IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
# AQDQRqwtEsae0OquYFazK1e6b1H/hnAKAd/KN8wZQjBjMqiZ3xTWcfsLwOvRxUwX
# cGx8AUjni6bz52fGTfr6PHRNv6T7zsf1Y/E3IU8kgNkeECqVQ+3bzWYesFtkepEr
# vUSbf+EIYLkrLKd6qJnuzK8Vcn0DvbDMemQFoxQ2Dsw4vEjoT1FpS54dNApZfKY6
# 1HAldytxNM89PZXUP/5wWWURK+IfxiOg8W9lKMqzdIo7VA1R0V3Zp3DjjANwqAf4
# lEkTlCDQ0/fKJLKLkzGBTpx6EYevvOi7XOc4zyh1uSqgr6UnbksIcFJqLbkIXIPb
# cNmA98Oskkkrvt6lPAw/p4oDSRZreiwB7x9ykrjS6GS3NR39iTTFS+ENTqW8m6TH
# uOmHHjQNC3zbJ6nJ6SXiLSvw4Smz8U07hqF+8CTXaETkVWz0dVVZw7knh1WZXOLH
# gDvundrAtuvz0D3T+dYaNcwafsVCGZKUhQPL1naFKBy1p6llN3QgshRta6Eq4B40
# h5avMcpi54wm0i2ePZD5pPIssoszQyF4//3DoK2O65Uck5Wggn8O2klETsJ7u8xE
# ehGifgJYi+6I03UuT1j7FnrqVrOzaQoVJOeeStPeldYRNMmSF3voIgMFtNGh86w3
# ISHNm0IaadCKCkUe2LnwJKa8TIlwCUNVwppwn4D3/Pt5pwIDAQABo4IBlTCCAZEw
# DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5Dv88jHt/f3X85FxYxlQQ89hjOgwHwYD
# VR0jBBgwFoAU729TSunkBnx6yuKQVvYv1Ensy04wDgYDVR0PAQH/BAQDAgeAMBYG
# A1UdJQEB/wQMMAoGCCsGAQUFBwMIMIGVBggrBgEFBQcBAQSBiDCBhTAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMF0GCCsGAQUFBzAChlFodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3Rh
# bXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5jcnQwXwYDVR0fBFgwVjBUoFKgUIZO
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0
# YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3JsMCAGA1UdIAQZMBcwCAYGZ4EM
# AQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEAZSqt8RwnBLmuYEHs
# 0QhEnmNAciH45PYiT9s1i6UKtW+FERp8FgXRGQ/YAavXzWjZhY+hIfP2JkQ38U+w
# tJPBVBajYfrbIYG+Dui4I4PCvHpQuPqFgqp1PzC/ZRX4pvP/ciZmUnthfAEP1HSh
# TrY+2DE5qjzvZs7JIIgt0GCFD9ktx0LxxtRQ7vllKluHWiKk6FxRPyUPxAAYH2Vy
# 1lNM4kzekd8oEARzFAWgeW3az2xejEWLNN4eKGxDJ8WDl/FQUSntbjZ80FU3i54t
# px5F/0Kr15zW/mJAxZMVBrTE2oi0fcI8VMbtoRAmaaslNXdCG1+lqvP4FbrQ6IwS
# BXkZagHLhFU9HCrG/syTRLLhAezu/3Lr00GrJzPQFnCEH1Y58678IgmfORBPC1JK
# kYaEt2OdDh4GmO0/5cHelAK2/gTlQJINqDr6JfwyYHXSd+V08X1JUPvB4ILfJdmL
# +66Gp3CSBXG6IwXMZUXBhtCyIaehr0XkBoDIGMUG1dUtwq1qmcwbdUfcSYCn+Own
# cVUXf53VJUNOaMWMts0VlRYxe5nK+At+DI96HAlXHAL5SlfYxJ7La54i71McVWRP
# 66bW+yERNpbJCjyCYG2j+bdpxo/1Cy4uPcU3AWVPGrbn5PhDBf3Froguzzhk++am
# i+r3Qrx5bIbY3TVzgiFI7Gq3zWcwgga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIM
# OkmGMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERp
# Z2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQy
# MzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFB
# MD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5
# NiBTSEEyNTYgMjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
# AQC0eDHTCphBcr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq
# +RuwOnPhof6pvF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyF
# Q/4Bt0mAxAHeHYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOE
# CS1UkxBvMgEdgkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdg
# lTcaarps0wjUjsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZ
# a/zbCclF83bRVFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLr
# fxnGpTXiUOeSLsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy
# 3tW/AMOMCZIVNSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJW
# nY0v5ydPpOjL6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdg
# JMoiwOrUG2ZdSoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJ
# SjNm2qA+sdFUeEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkw
# EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ens
# y04wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQD
# AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy
# dDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGln
# aUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglg
# hkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSm
# f83Qh8WIGjB/T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83a
# fsl3YTj+IQhQE7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5
# nWMQwr8Myb9rEVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ
# 2iA/wdG2th9y1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu
# 4y81hjajV/gxdEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgc
# GV00TYr2Lr3ty9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+
# qNNjqFzeGxcytL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll
# 38F0cuJG7uEBYTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66R
# zIg9sC+NJpud/v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDp
# MPx0LckTetiSuEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8Wh
# baM2tszWkPZPubdcMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkq
# hkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB
# c3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5
# WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
# ExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJv
# b3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1K
# PDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2r
# snnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C
# 8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBf
# sXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
# QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8
# rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaY
# dj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+
# wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw
# ++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+N
# P8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7F
# wI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUw
# AwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAU
# Reuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEB
# BG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsG
# AQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
# cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAow
# CDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/
# Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLe
# JLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE
# 1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9Hda
# XFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbO
# byMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYID
# fDCCA3gCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJT
# QTQwOTYgU0hBMjU2IDIwMjUgQ0ExAhAKgO8YS43xBYLRxHanlXRoMA0GCWCGSAFl
# AwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0B
# CQUxDxcNMjUwNjEyMTY0MDUxWjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBTdYjCs
# hgotMGvaOLFoeVIwB/tBfjAvBgkqhkiG9w0BCQQxIgQg35PS9apyj4fIocaxvDAi
# MgXlOvUJct7X2EDTTLjZpUkwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgSqA/oizX
# XITFXJOPgo5na5yuyrM/420mmqM08UYRCjMwDQYJKoZIhvcNAQEBBQAEggIAshbp
# lhND+o9w+y0SiX5zATSYhuu+kEkM4HE/hoEVu1yb+XiyKixIZWi9BKI3ldiIih50
# LbdC/yy+/Vemw5HWf6EiuayjG1cVh5X8cAkbPI8yLKfBh+fuUbeOVdhzL95cEFtX
# Uy07t5+qgzTHE70fraGSZ6R+8c44fmlA4YsdMbf8HfG1aegGxyCIYvo9WBZDFSkC
# 5apIjeM/zaxo8Hb6UE/aSywOondgEDsr6/72f/OEuOtciybhChNSnF/gDYJlX+u6
# I4TMkFbxB2IK+JVLPsSieOuSQgNqWy2jdc8V13QXOj8lsSGfwT8NDYeRe9GhpMAC
# 4p2B4EeJWqXJ2561EhDlhTBNoTD/VAwoXBmDnXHX78lKIV8NhuA7FH96OTBGWhTH
# KhNyhx1SsDEaDkZZ9rkyGG4I+YwVGRlhseUcdFGvJF2iL+UMjt0onjZi4nPZGhj+
# nKO/V+aHbBTVVi28VCMrMkovnVERHbTFOOBfTftM+vi9d3ML1O88W9FafvIFQCzF
# 1TAiPjKZ+ggbDBeZsydHDsmruS5kxevVi8f/97dVOM3nuDk4bXHS9iWNKq2lmdgg
# Mv03dutprWoOmgHxnttS8FIeyDumWlXnyLWrZmRljPsr9kGur2BPvf9leBdKUfj/
# kBbmniJxrdJz3ggAQhJeSJTCWL1WHeEa5YoE2zQ=
# SIG # End signature block

View File

@@ -1,5 +1,5 @@
Fido: A PowerShell download script for Microsoft Windows and UEFI Shell ISOs
============================================================================
Fido: A PowerShell script to download Windows and UEFI Shell ISOs
=================================================================
[![Licence](https://img.shields.io/badge/license-GPLv3-blue.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0.en.html)
[![Github stats](https://img.shields.io/github/downloads/pbatard/Fido/total.svg?style=flat-square)](https://github.com/pbatard/Fido/releases)