diff --git a/AppPackages/KiwixWebApp_0.9.91.0_AnyCPU_bundle.appxupload b/AppPackages/KiwixWebApp_0.9.91.0_AnyCPU_bundle.appxupload deleted file mode 100644 index 10590603..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_AnyCPU_bundle.appxupload and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.ps1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.ps1 deleted file mode 100644 index 2467ff4f..00000000 --- a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.ps1 +++ /dev/null @@ -1,750 +0,0 @@ -# -# Add-AppxDevPackage.ps1 is a PowerShell script designed to install app -# packages created by Visual Studio for developers. To run this script from -# Explorer, right-click on its icon and choose "Run with PowerShell". -# -# Visual Studio supplies this script in the folder generated with its -# "Prepare Package" command. The same folder will also contain the app -# package (a .appx file), the signing certificate (a .cer file), and a -# "Dependencies" subfolder containing all the framework packages used by the -# app. -# -# This script simplifies installing these packages by automating the -# following functions: -# 1. Find the app package and signing certificate in the script directory -# 2. Prompt the user to acquire a developer license and to install the -# certificate if necessary -# 3. Find dependency packages that are applicable to the operating system's -# CPU architecture -# 4. Install the package along with all applicable dependencies -# -# All command line parameters are reserved for use internally by the script. -# Users should launch this script from Explorer. -# - -# .Link -# http://go.microsoft.com/fwlink/?LinkId=243053 - -param( - [switch]$Force = $false, - [switch]$GetDeveloperLicense = $false, - [string]$CertificatePath = $null -) - -$ErrorActionPreference = "Stop" - -# The language resources for this script are placed in the -# "Add-AppDevPackage.resources" subfolder alongside the script. Since the -# current working directory might not be the directory that contains the -# script, we need to create the full path of the resources directory to -# pass into Import-LocalizedData -$ScriptPath = $null -try -{ - $ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path - $ScriptDir = Split-Path -Parent $ScriptPath -} -catch {} - -if (!$ScriptPath) -{ - PrintMessageAndExit $UiStrings.ErrorNoScriptPath $ErrorCodes.NoScriptPath -} - -$LocalizedResourcePath = Join-Path $ScriptDir "Add-AppDevPackage.resources" -Import-LocalizedData -BindingVariable UiStrings -BaseDirectory $LocalizedResourcePath - -$ErrorCodes = Data { - ConvertFrom-StringData @' - Success = 0 - NoScriptPath = 1 - NoPackageFound = 2 - ManyPackagesFound = 3 - NoCertificateFound = 4 - ManyCertificatesFound = 5 - BadCertificate = 6 - PackageUnsigned = 7 - CertificateMismatch = 8 - ForceElevate = 9 - LaunchAdminFailed = 10 - GetDeveloperLicenseFailed = 11 - InstallCertificateFailed = 12 - AddPackageFailed = 13 - ForceDeveloperLicense = 14 - CertUtilInstallFailed = 17 - CertIsCA = 18 - BannedEKU = 19 - NoBasicConstraints = 20 - NoCodeSigningEku = 21 - InstallCertificateCancelled = 22 - BannedKeyUsage = 23 - ExpiredCertificate = 24 -'@ -} - -function PrintMessageAndExit($ErrorMessage, $ReturnCode) -{ - Write-Host $ErrorMessage - if (!$Force) - { - Pause - } - exit $ReturnCode -} - -# -# Warns the user about installing certificates, and presents a Yes/No prompt -# to confirm the action. The default is set to No. -# -function ConfirmCertificateInstall -{ - $Answer = $host.UI.PromptForChoice( - "", - $UiStrings.WarningInstallCert, - [System.Management.Automation.Host.ChoiceDescription[]]@($UiStrings.PromptYesString, $UiStrings.PromptNoString), - 1) - - return $Answer -eq 0 -} - -# -# Validates whether a file is a valid certificate using CertUtil. -# This needs to be done before calling Get-PfxCertificate on the file, otherwise -# the user will get a cryptic "Password: " prompt for invalid certs. -# -function ValidateCertificateFormat($FilePath) -{ - # certutil -verify prints a lot of text that we don't need, so it's redirected to $null here - certutil.exe -verify $FilePath > $null - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorBadCertificate -f $FilePath, $LastExitCode) $ErrorCodes.BadCertificate - } - - # Check if certificate is expired - $cert = Get-PfxCertificate $FilePath - if (($cert.NotBefore -gt (Get-Date)) -or ($cert.NotAfter -lt (Get-Date))) - { - PrintMessageAndExit ($UiStrings.ErrorExpiredCertificate -f $FilePath) $ErrorCodes.ExpiredCertificate - } -} - -# -# Verify that the developer certificate meets the following restrictions: -# - The certificate must contain a Basic Constraints extension, and its -# Certificate Authority (CA) property must be false. -# - The certificate's Key Usage extension must be either absent, or set to -# only DigitalSignature. -# - The certificate must contain an Extended Key Usage (EKU) extension with -# Code Signing usage. -# - The certificate must NOT contain any other EKU except Code Signing and -# Lifetime Signing. -# -# These restrictions are enforced to decrease security risks that arise from -# trusting digital certificates. -# -function CheckCertificateRestrictions -{ - Set-Variable -Name BasicConstraintsExtensionOid -Value "2.5.29.19" -Option Constant - Set-Variable -Name KeyUsageExtensionOid -Value "2.5.29.15" -Option Constant - Set-Variable -Name EkuExtensionOid -Value "2.5.29.37" -Option Constant - Set-Variable -Name CodeSigningEkuOid -Value "1.3.6.1.5.5.7.3.3" -Option Constant - Set-Variable -Name LifetimeSigningEkuOid -Value "1.3.6.1.4.1.311.10.3.13" -Option Constant - - $CertificateExtensions = (Get-PfxCertificate $CertificatePath).Extensions - $HasBasicConstraints = $false - $HasCodeSigningEku = $false - - foreach ($Extension in $CertificateExtensions) - { - # Certificate must contain the Basic Constraints extension - if ($Extension.oid.value -eq $BasicConstraintsExtensionOid) - { - # CA property must be false - if ($Extension.CertificateAuthority) - { - PrintMessageAndExit $UiStrings.ErrorCertIsCA $ErrorCodes.CertIsCA - } - $HasBasicConstraints = $true - } - - # If key usage is present, it must be set to digital signature - elseif ($Extension.oid.value -eq $KeyUsageExtensionOid) - { - if ($Extension.KeyUsages -ne "DigitalSignature") - { - PrintMessageAndExit ($UiStrings.ErrorBannedKeyUsage -f $Extension.KeyUsages) $ErrorCodes.BannedKeyUsage - } - } - - elseif ($Extension.oid.value -eq $EkuExtensionOid) - { - # Certificate must contain the Code Signing EKU - $EKUs = $Extension.EnhancedKeyUsages.Value - if ($EKUs -contains $CodeSigningEkuOid) - { - $HasCodeSigningEKU = $True - } - - # EKUs other than code signing and lifetime signing are not allowed - foreach ($EKU in $EKUs) - { - if ($EKU -ne $CodeSigningEkuOid -and $EKU -ne $LifetimeSigningEkuOid) - { - PrintMessageAndExit ($UiStrings.ErrorBannedEKU -f $EKU) $ErrorCodes.BannedEKU - } - } - } - } - - if (!$HasBasicConstraints) - { - PrintMessageAndExit $UiStrings.ErrorNoBasicConstraints $ErrorCodes.NoBasicConstraints - } - if (!$HasCodeSigningEKU) - { - PrintMessageAndExit $UiStrings.ErrorNoCodeSigningEku $ErrorCodes.NoCodeSigningEku - } -} - -# -# Performs operations that require administrative privileges: -# - Prompt the user to obtain a developer license -# - Install the developer certificate (if -Force is not specified, also prompts the user to confirm) -# -function DoElevatedOperations -{ - if ($GetDeveloperLicense) - { - Write-Host $UiStrings.GettingDeveloperLicense - - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - try - { - Show-WindowsDeveloperLicenseRegistration - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - } - - if ($CertificatePath) - { - Write-Host $UiStrings.InstallingCertificate - - # Make sure certificate format is valid and usage constraints are followed - ValidateCertificateFormat $CertificatePath - CheckCertificateRestrictions - - # If -Force is not specified, warn the user and get consent - if ($Force -or (ConfirmCertificateInstall)) - { - # Add cert to store - certutil.exe -addstore TrustedPeople $CertificatePath - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorCertUtilInstallFailed -f $LastExitCode) $ErrorCodes.CertUtilInstallFailed - } - } - else - { - PrintMessageAndExit $UiStrings.ErrorInstallCertificateCancelled $ErrorCodes.InstallCertificateCancelled - } - } -} - -# -# Checks whether the machine is missing a valid developer license. -# -function CheckIfNeedDeveloperLicense -{ - $Result = $true - try - { - $Result = (Get-WindowsDeveloperLicense | Where-Object { $_.IsValid } | Measure-Object).Count -eq 0 - } - catch {} - - return $Result -} - -# -# Launches an elevated process running the current script to perform tasks -# that require administrative privileges. This function waits until the -# elevated process terminates, and checks whether those tasks were successful. -# -function LaunchElevated -{ - # Set up command line arguments to the elevated process - $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"' - - if ($Force) - { - $RelaunchArgs += ' -Force' - } - if ($NeedDeveloperLicense) - { - $RelaunchArgs += ' -GetDeveloperLicense' - } - if ($NeedInstallCertificate) - { - $RelaunchArgs += ' -CertificatePath "' + $DeveloperCertificatePath.FullName + '"' - } - - # Launch the process and wait for it to finish - try - { - $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorLaunchAdminFailed $ErrorCodes.LaunchAdminFailed - } - - while (!($AdminProcess.HasExited)) - { - Start-Sleep -Seconds 2 - } - - # Check if all elevated operations were successful - if ($NeedDeveloperLicense) - { - if (CheckIfNeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - else - { - Write-Host $UiStrings.AcquireLicenseSuccessful - } - } - if ($NeedInstallCertificate) - { - $Signature = Get-AuthenticodeSignature $DeveloperPackagePath -Verbose - if ($Signature.Status -ne "Valid") - { - PrintMessageAndExit ($UiStrings.ErrorInstallCertificateFailed -f $Signature.Status) $ErrorCodes.InstallCertificateFailed - } - else - { - Write-Host $UiStrings.InstallCertificateSuccessful - } - } -} - -# -# Finds all applicable dependency packages according to OS architecture, and -# installs the developer package with its dependencies. The expected layout -# of dependencies is: -# -# -# \Dependencies -# .appx -# \x86 -# .appx -# \x64 -# .appx -# \arm -# .appx -# -function InstallPackageWithDependencies -{ - $DependencyPackagesDir = (Join-Path $ScriptDir "Dependencies") - $DependencyPackages = @() - if (Test-Path $DependencyPackagesDir) - { - # Get architecture-neutral dependencies - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - - # Get architecture-specific dependencies - if (($Env:Processor_Architecture -eq "x86" -or $Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x86"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x86\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x64"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x64\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "arm") -and (Test-Path (Join-Path $DependencyPackagesDir "arm"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "arm\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - } - Write-Host $UiStrings.InstallingPackage - - $AddPackageSucceeded = $False - try - { - if ($DependencyPackages.FullName.Count -gt 0) - { - Write-Host $UiStrings.DependenciesFound - $DependencyPackages.FullName - Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath $DependencyPackages.FullName -ForceApplicationShutdown - } - else - { - Add-AppxPackage -Path $DeveloperPackagePath.FullName -ForceApplicationShutdown - } - $AddPackageSucceeded = $? - } - catch - { - $Error[0] # Dump details about the last error - } - - if (!$AddPackageSucceeded) - { - if ($NeedInstallCertificate) - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailedWithCert $ErrorCodes.AddPackageFailed - } - else - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailed $ErrorCodes.AddPackageFailed - } - } -} - -# -# Main script logic when the user launches the script without parameters. -# -function DoStandardOperations -{ - # List all .appx files in the script directory - $PackagePath = Get-ChildItem (Join-Path $ScriptDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - $PackageCount = ($PackagePath | Measure-Object).Count - - # List all .appxbundle files in the script directory - $BundlePath = Get-ChildItem (Join-Path $ScriptDir "*.appxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $BundleCount = ($BundlePath | Measure-Object).Count - - # List all .eappx files in the script directory - $EncryptedPackagePath = Get-ChildItem (Join-Path $ScriptDir "*.eappx") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedPackageCount = ($EncryptedPackagePath | Measure-Object).Count - - # List all .eappxbundle files in the script directory - $EncryptedBundlePath = Get-ChildItem (Join-Path $ScriptDir "*.eappxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedBundleCount = ($EncryptedBundlePath | Measure-Object).Count - - $NumberOfPackagesAndBundles = $PackageCount + $BundleCount + $EncryptedPackageCount + $EncryptedBundleCount - - # There must be exactly 1 package/bundle - if ($NumberOfPackagesAndBundles -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoPackageFound $ErrorCodes.NoPackageFound - } - elseif ($NumberOfPackagesAndBundles -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyPackagesFound $ErrorCodes.ManyPackagesFound - } - - if ($PackageCount -eq 1) - { - $DeveloperPackagePath = $PackagePath - Write-Host ($UiStrings.PackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($BundleCount -eq 1) - { - $DeveloperPackagePath = $BundlePath - Write-Host ($UiStrings.BundleFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedPackageCount -eq 1) - { - $DeveloperPackagePath = $EncryptedPackagePath - Write-Host ($UiStrings.EncryptedPackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedBundleCount -eq 1) - { - $DeveloperPackagePath = $EncryptedBundlePath - Write-Host ($UiStrings.EncryptedBundleFound -f $DeveloperPackagePath.FullName) - } - - # The package must be signed - $PackageSignature = Get-AuthenticodeSignature $DeveloperPackagePath - $PackageCertificate = $PackageSignature.SignerCertificate - if (!$PackageCertificate) - { - PrintMessageAndExit $UiStrings.ErrorPackageUnsigned $ErrorCodes.PackageUnsigned - } - - # Test if the package signature is trusted. If not, the corresponding certificate - # needs to be present in the current directory and needs to be installed. - $NeedInstallCertificate = ($PackageSignature.Status -ne "Valid") - - if ($NeedInstallCertificate) - { - # List all .cer files in the script directory - $DeveloperCertificatePath = Get-ChildItem (Join-Path $ScriptDir "*.cer") | Where-Object { $_.Mode -NotMatch "d" } - $DeveloperCertificateCount = ($DeveloperCertificatePath | Measure-Object).Count - - # There must be exactly 1 certificate - if ($DeveloperCertificateCount -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoCertificateFound $ErrorCodes.NoCertificateFound - } - elseif ($DeveloperCertificateCount -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyCertificatesFound $ErrorCodes.ManyCertificatesFound - } - - Write-Host ($UiStrings.CertificateFound -f $DeveloperCertificatePath.FullName) - - # The .cer file must have the format of a valid certificate - ValidateCertificateFormat $DeveloperCertificatePath - - # The package signature must match the certificate file - if ($PackageCertificate -ne (Get-PfxCertificate $DeveloperCertificatePath)) - { - PrintMessageAndExit $UiStrings.ErrorCertificateMismatch $ErrorCodes.CertificateMismatch - } - } - - $NeedDeveloperLicense = CheckIfNeedDeveloperLicense - - # Relaunch the script elevated with the necessary parameters if needed - if ($NeedDeveloperLicense -or $NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActions - if ($NeedDeveloperLicense) - { - Write-Host $UiStrings.ElevateActionDevLicense - } - if ($NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActionCertificate - } - - $IsAlreadyElevated = ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544") - if ($IsAlreadyElevated) - { - if ($Force -and $NeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - if ($Force -and $NeedInstallCertificate) - { - Write-Warning $UiStrings.WarningInstallCert - } - } - else - { - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceElevate $ErrorCodes.ForceElevate - } - else - { - Write-Host $UiStrings.ElevateActionsContinue - Pause - } - } - - LaunchElevated - } - - InstallPackageWithDependencies -} - -# -# Main script entry point -# -if ($GetDeveloperLicense -or $CertificatePath) -{ - DoElevatedOperations -} -else -{ - DoStandardOperations - PrintMessageAndExit $UiStrings.Success $ErrorCodes.Success -} - -# SIG # Begin signature block -# MIIiAQYJKoZIhvcNAQcCoIIh8jCCIe4CAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAnYmBUpv/sjF9s -# UpSJeaz8bsgho4m0HYf/wsPXcJL9raCCC4QwggUMMIID9KADAgECAhMzAAABT+fG -# YslG9Kl/AAAAAAFPMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD -# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy -# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p -# bmcgUENBIDIwMTAwHhcNMTYxMTE3MjE1OTE0WhcNMTgwMjE3MjE1OTE0WjCBgzEL -# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v -# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q -# UjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEAtImQinYMrMU9obyB6NdQCLtaaaeux8y4W704DyFR -# Rggj0b0imXO3KO/3B6sr+Uj3pRQFqU0kG21hlpyDnTPALHmZ8F3z7NVE36XNWfp2 -# rQY/xkoD5uotlBDCZm/9YtBQitEikSOXZTShxJoCXpLiuHwoeMJe40b3yu84V4is -# VgZYypgbx6jXXjaumkUw47a3PRjCpyeweU1T2DLmdqNQKvY/urtBHiSGTZibep72 -# LOK8kGBl+5Zp+uATaOKJKi51GJ3Cbbgh9JleKn8xoKcNzO9PEW7+SUJOYd43yyue -# QO/Oq15wCHOlcnu3Rs5bMlNdijlRb7DXqHjdoyhvXu5CHwIDAQABo4IBezCCAXcw -# HwYDVR0lBBgwFgYKKwYBBAGCNz0GAQYIKwYBBQUHAwMwHQYDVR0OBBYEFJIOoRFx -# ti9VDcMP9MlcdC5aDGq/MFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQLEwRNT1BSMTQw -# MgYDVQQFEysyMzA4NjUrYjRiMTI4NzgtZTI5My00M2U5LWIyMWUtN2QzMDcxOWQ0 -# NTJmMB8GA1UdIwQYMBaAFOb8X3u7IgBY5HJOtfQhdCMy5u+sMFYGA1UdHwRPME0w -# S6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz -# L01pY0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNybDBaBggrBgEFBQcBAQROMEwwSgYI -# KwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWlj -# Q29kU2lnUENBXzIwMTAtMDctMDYuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN -# AQELBQADggEBABHAuWpDNf6FsTiADbh0dSyNcUm4PEHtLb3iBjaQdiuJ5baB6Ybj -# GIyWkzJCp6f2tzQlOdDGekPq23dwzNTpQuuoxVUCdXie2BC+BxvKlGP7PA9x7tRV -# Z9cp9mq/B7zlj4Lq+KHiczM/FJJeobplVzdFhYBc1izGizxqh6MHEcvs2XE4IDUk -# PVS9zFWJ9HcQm+WZqg+uxjyOn9oAT8994bPAIPdSMfciSNVhjX8mAhl9g8xhkyrd -# uNziCLOn3+EEd2DI9Kw1yzHlbHVRxTd7E2pOlWuPQJ7ITT6uvVnFINbCeK23ZFs7 -# 0MAVcDQU5cWephzH9P/2y0jB4o3zbs6qtKAwggZwMIIEWKADAgECAgphDFJMAAAA -# AAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz -# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv -# cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB -# dXRob3JpdHkgMjAxMDAeFw0xMDA3MDYyMDQwMTdaFw0yNTA3MDYyMDUwMTdaMH4x -# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt -# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p -# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUA -# A4IBDwAwggEKAoIBAQDpDmRQeWe1xOP9CQBMnpSs91Zo6kTYz8VYT6mldnxtRbrT -# OZK0pB75+WWC5BfSj/1EnAjoZZPOLFWEv30I4y4rqEErGLeiS25JTGsVB97R0sKJ -# HnGUzbV/S7SvCNjMiNZrF5Q6k84mP+zm/jSYV9UdXUn2siou1YW7WT/4kLQrg3TK -# K7M7RuPwRknBF2ZUyRy9HcRVYldy+Ge5JSA03l2mpZVeqyiAzdWynuUDtWPTshTI -# wciKJgpZfwfs/w7tgBI1TBKmvlJb9aba4IsLSHfWhUfVELnG6Krui2otBVxgxrQq -# W5wjHF9F4xoUHm83yxkzgGqJTaNqZmN4k9Uwz5UfAgMBAAGjggHjMIIB3zAQBgkr -# BgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU5vxfe7siAFjkck619CF0IzLm76wwGQYJ -# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -# MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w -# TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj -# dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK -# BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N -# aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgZ0GA1UdIASBlTCBkjCBjwYJKwYB -# BAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v -# UEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBn -# AGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqG -# SIb3DQEBCwUAA4ICAQAadO9XTyl7xBaFeLhQ0yL8CZ2sgpf4NP8qLJeVEuXkv8+/ -# k8jjNKnbgbjcHgC+0jVvr+V/eZV35QLU8evYzU4eG2GiwlojGvCMqGJRRWcI4z88 -# HpP4MIUXyDlAptcOsyEp5aWhaYwik8x0mOehR0PyU6zADzBpf/7SJSBtb2HT3wfV -# 2XIALGmGdj1R26Y5SMk3YW0H3VMZy6fWYcK/4oOrD+Brm5XWfShRsIlKUaSabMi3 -# H0oaDmmp19zBftFJcKq2rbtyR2MX+qbWoqaG7KgQRJtjtrJpiQbHRoZ6GD/oxR0h -# 1Xv5AiMtxUHLvx1MyBbvsZx//CJLSYpuFeOmf3Zb0VN5kYWd1dLbPXM18zyuVLJS -# R2rAqhOV0o4R2plnXjKM+zeF0dx1hZyHxlpXhcK/3Q2PjJst67TuzyfTtV5p+qQW -# BAGnJGdzz01Ptt4FVpd69+lSTfR3BU+FxtgL8Y7tQgnRDXbjI1Z4IiY2vsqxjG6q -# HeSF2kczYo+kyZEzX3EeQK+YZcki6EIhJYocLWDZN4lBiSoWD9dhPJRoYFLv1keZ -# oIBA7hWBdz6c4FMYGlAdOJWbHmYzEyc5F3iHNs5Ow1+y9T1HU7bg5dsLYT0q15Is -# zjdaPkBCMaQfEAjCVpy/JF1RAp1qedIX09rBlI4HeyVxRKsGaubUxt8jmpZ1xTGC -# FdMwghXPAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u -# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp -# b24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTACEzMA -# AAFP58ZiyUb0qX8AAAAAAU8wDQYJYIZIAWUDBAIBBQCggcIwGQYJKoZIhvcNAQkD -# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ -# KoZIhvcNAQkEMSIEIM6sGgl9EI3BKHGPaKRgrF1O/bVv8y7tQZuqLVzy8rFiMFYG -# CisGAQQBgjcCAQwxSDBGoCyAKgBBAGQAZAAtAEEAcABwAEQAZQB2AFAAYQBjAGsA -# YQBnAGUALgBwAHMAMaEWgBRodHRwOi8vbWljcm9zb2Z0LmNvbTANBgkqhkiG9w0B -# AQEFAASCAQB+h3AYSy8MV5bb3ZfjI9xGXZgMGVKhmRo9yYG3wIelD9RULoRtCN4J -# ScCz++xjjxhUEdJ57ZeRdobQGnjEKyepHccHJsnxiFXUqd8gHWN56LxVKXLK6lgH -# RnSmMm63Z/s6/qA7XdgHKjUGqG0MsZgFiX0DBfVQUQnPPPgkicc2xwWI1G4ZTDVn -# Qoi9zUNb1bvJJhcN1BlPcvKVrVOqBLLfsSDsYGMmLcrh0v9QkMPBefLexqGxoibs -# fvzJiwiCSRTRiC29aUrAP3s6EazYYP866d7F94qZfF5Qy8fy3RnnjErxD1PpgEVx -# EZus2pc23sNrQzNokH1A7q3beEKTKal8oYITSTCCE0UGCisGAQQBgjcDAwExghM1 -# MIITMQYJKoZIhvcNAQcCoIITIjCCEx4CAQMxDzANBglghkgBZQMEAgEFADCCATwG -# CyqGSIb3DQEJEAEEoIIBKwSCAScwggEjAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI -# AWUDBAIBBQAEIJPdm/WIYp5J5+KJJMbxhHziKQ+l8HJ9bF3jCZXkxTgaAgZZVDxZ -# MIMYEjIwMTcwNzIxMDI0NTMxLjA5WjAHAgEBgAIB9KCBuaSBtjCBszELMAkGA1UE -# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc -# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUG -# A1UECxMebkNpcGhlciBEU0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxN -# aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOzTCCBnEwggRZoAMCAQICCmEJ -# gSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI -# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv -# ZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmlj -# YXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1 -# NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT -# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE -# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEB -# AQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18 -# aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdN -# uDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NM -# ksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2K -# Qk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZ -# zTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQ -# BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUw -# GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB -# /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f -# BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv -# ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w -# TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 -# cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCB -# jwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29m -# dC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAd -# AEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAd -# MA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F -# 4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbM -# QEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mB -# ZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7ti -# X5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S -# 4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3ai -# caoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf -# 5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsb -# iSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJ -# zxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB -# 0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/e -# dIhJEjCCBNowggPCoAMCAQICEzMAAACdIJxWd1XUKJoAAAAAAJ0wDQYJKoZIhvcN -# AQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG -# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMTYwOTA3MTc1 -# NjQxWhcNMTgwOTA3MTc1NjQxWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh -# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -# b3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0Ug -# RVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt -# cCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kSYnBFa -# Khouqp9TXW1dvLZZdpHAJlsD5shsX6Mq60wARnQ4FL8qeF2wI0zsbmBI7EnkW3Wm -# cP3z1K5Vbo69BB9nPRn9MXKClKFzsS688BzU2+8huMaptMbCRgcumcw+IQvDLkjf -# DGp1xTWO11mcqztIfp6y4PxUlt4TRzlC0G7WS/2/DKTwC+X66MiIi+6c+3XhxEvo -# yw5kzlfeYKh6Ss5lHLhlliNiO38FT1lm3ekN1fh8vsBM3nsKlhvMVTkEbwYIQTi7 -# 9RnftXoEdwUc4uyMx/Gxml5HbsyyHqPalniB7vAHmIBRvroKFB5+njpZJKFXcwz+ -# QUROlsJUUQ+pxQIDAQABo4IBGzCCARcwHQYDVR0OBBYEFLyGCMpbalrK5L3My4K0 -# FUjqh+WhMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRP -# ME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 -# Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEww -# SgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv -# TWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0l -# BAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEBAH/eJCG9We+01otxylmR -# vi6oRoK7j99kHX3mKgu8KGdL/vl3v7X0TqT96EoPPmcis1aJbZcIWuwjFPV5KhNX -# jJIXnQYh6vOo6hs73NuEmkv3chX2n48nqP+l4tYgiZVNQKkVYF65lwHXMAv/Qmpr -# VtnsWlw2A4DMFi1qwbkzZE/bXmt/2G/AroGlOO06zl1yGoxMFctfk4yy3aoALeP9 -# ZCipqb4QHf4V3CePH46kA+qON9sEJVMf4TJ69zsikMzcKg3BXoYJ1T5W76sloHrL -# MkBY9r0JW7bJ/3tHeXSGpYad2CINV17hqA3GJk4C9v069gGs95e8uZEOYdud0++m -# NmmhggN2MIICXgIBATCB46GBuaSBtjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgT -# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m -# dCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBE -# U0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T -# dGFtcCBTZXJ2aWNloiUKAQEwCQYFKw4DAhoFAAMVABgNrLOMaDCz+HQZsnjOgCs1 -# Lwj6oIHCMIG/pIG8MIG5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv -# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 -# aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIE5UUyBFU046NTdG -# Ni1DMUUwLTU1NEMxKzApBgNVBAMTIk1pY3Jvc29mdCBUaW1lIFNvdXJjZSBNYXN0 -# ZXIgQ2xvY2swDQYJKoZIhvcNAQEFBQACBQDdG19/MCIYDzIwMTcwNzIwMTY1NzM1 -# WhgPMjAxNzA3MjExNjU3MzVaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAN0bX38C -# AQAwBwIBAAICAMEwBwIBAAICGvIwCgIFAN0csP8CAQAwNgYKKwYBBAGEWQoEAjEo -# MCYwDAYKKwYBBAGEWQoDAaAKMAgCAQACAxbjYKEKMAgCAQACAwehIDANBgkqhkiG -# 9w0BAQUFAAOCAQEAIWqW45RvFXwjBVSrRXQeFN9MB35hIxT4uUMbWQqFQLbVXgIz -# lvDhnoXmN+Af/yyC4yWrfIPdy5Vk0EjhwQtfUBhrN54bo7dyVYaY3mL+PJQja8kT -# by1YEgYt68kHiARuHi7uFzWOoJbd6FSqlZDGhPnYZo+fVq4Y3bttuMmSeR8L9BWB -# HFBhX45zzmmacUhN3Nm2J9gZ8ed6KA2U5VJFVDkcVzn63KJtlr+POymNVMgtOts1 -# vq05uRjj9Q9k069YY/GuObtIpPrz36w2h8vhO5Qfpx6ZG04l3uou7E6i7Gl+jXcd -# VkWTutSe2NQyhaqkChfdD8SMCwkA9TeThzFv5jGCAvUwggLxAgEBMIGTMHwxCzAJ -# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k -# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv -# c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAnSCcVndV1CiaAAAAAACdMA0G -# CWCGSAFlAwQCAQUAoIIBMjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ -# KoZIhvcNAQkEMSIEIGQXuTrJKWTDGJqlJk7ANUAEMoswJGjPpK2ahEqAgccVMIHi -# BgsqhkiG9w0BCRACDDGB0jCBzzCBzDCBsQQUGA2ss4xoMLP4dBmyeM6AKzUvCPow -# gZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw -# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAJ0gnFZ3 -# VdQomgAAAAAAnTAWBBRNDOnnwrJaeTO4MiBDM6JW8L7EUTANBgkqhkiG9w0BAQsF -# AASCAQA7G6QRJ53LBnJ6uVwFfelQ9mKLYALTsZ7lB7R2PZ66nT4tePiI4UTtKkKv -# v9poY68a6QLoT5IA2HTYcFSjBK2aYpw0uGG8JJPTGdu8BYawTeXEIvSI6rGXAXTW -# 3enCkwBxl08u8oGFje3vP34DQXVMUWYD2HU58Z+aV4gDbF97gAGz5BkwzixG7IcD -# BdzPaVtWZkGS5ww1d0Hh+NyVFPiIaBGkuz9PbrbfNK4uPFwoeXzdXbbCTX5N1mOW -# 5pDO39vyzcqITMBeZ6ogkGjm5NIKjGMA1gl+kHT23iNtXHYJFK+df2r5o/wmytP8 -# GU3tn8zSkac5pn6bu8Gl1M3ndtx5 -# SIG # End signature block diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 deleted file mode 100644 index c30a3d93..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 deleted file mode 100644 index e1f88020..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 deleted file mode 100644 index 4f7fae23..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 deleted file mode 100644 index a990b390..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 deleted file mode 100644 index d42629f5..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 deleted file mode 100644 index bda59582..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744b984..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 deleted file mode 100644 index 1ef787c8..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 deleted file mode 100644 index cb5f65d1..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 deleted file mode 100644 index 21b785eb..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 deleted file mode 100644 index 71d22424..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 deleted file mode 100644 index 4b574d68..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744c26a..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/KiwixWebApp_0.9.91.0_AnyCPU.appxbundle b/AppPackages/KiwixWebApp_0.9.91.0_Test/KiwixWebApp_0.9.91.0_AnyCPU.appxbundle deleted file mode 100644 index 557fc999..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/KiwixWebApp_0.9.91.0_AnyCPU.appxbundle and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.91.0_Test/KiwixWebApp_0.9.91.0_AnyCPU.cer b/AppPackages/KiwixWebApp_0.9.91.0_Test/KiwixWebApp_0.9.91.0_AnyCPU.cer deleted file mode 100644 index 20a5b8a4..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.91.0_Test/KiwixWebApp_0.9.91.0_AnyCPU.cer and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_AnyCPU_bundle.appxupload b/AppPackages/KiwixWebApp_0.9.92.0_AnyCPU_bundle.appxupload deleted file mode 100644 index 3ef70d3e..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_AnyCPU_bundle.appxupload and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.ps1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.ps1 deleted file mode 100644 index 2467ff4f..00000000 --- a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.ps1 +++ /dev/null @@ -1,750 +0,0 @@ -# -# Add-AppxDevPackage.ps1 is a PowerShell script designed to install app -# packages created by Visual Studio for developers. To run this script from -# Explorer, right-click on its icon and choose "Run with PowerShell". -# -# Visual Studio supplies this script in the folder generated with its -# "Prepare Package" command. The same folder will also contain the app -# package (a .appx file), the signing certificate (a .cer file), and a -# "Dependencies" subfolder containing all the framework packages used by the -# app. -# -# This script simplifies installing these packages by automating the -# following functions: -# 1. Find the app package and signing certificate in the script directory -# 2. Prompt the user to acquire a developer license and to install the -# certificate if necessary -# 3. Find dependency packages that are applicable to the operating system's -# CPU architecture -# 4. Install the package along with all applicable dependencies -# -# All command line parameters are reserved for use internally by the script. -# Users should launch this script from Explorer. -# - -# .Link -# http://go.microsoft.com/fwlink/?LinkId=243053 - -param( - [switch]$Force = $false, - [switch]$GetDeveloperLicense = $false, - [string]$CertificatePath = $null -) - -$ErrorActionPreference = "Stop" - -# The language resources for this script are placed in the -# "Add-AppDevPackage.resources" subfolder alongside the script. Since the -# current working directory might not be the directory that contains the -# script, we need to create the full path of the resources directory to -# pass into Import-LocalizedData -$ScriptPath = $null -try -{ - $ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path - $ScriptDir = Split-Path -Parent $ScriptPath -} -catch {} - -if (!$ScriptPath) -{ - PrintMessageAndExit $UiStrings.ErrorNoScriptPath $ErrorCodes.NoScriptPath -} - -$LocalizedResourcePath = Join-Path $ScriptDir "Add-AppDevPackage.resources" -Import-LocalizedData -BindingVariable UiStrings -BaseDirectory $LocalizedResourcePath - -$ErrorCodes = Data { - ConvertFrom-StringData @' - Success = 0 - NoScriptPath = 1 - NoPackageFound = 2 - ManyPackagesFound = 3 - NoCertificateFound = 4 - ManyCertificatesFound = 5 - BadCertificate = 6 - PackageUnsigned = 7 - CertificateMismatch = 8 - ForceElevate = 9 - LaunchAdminFailed = 10 - GetDeveloperLicenseFailed = 11 - InstallCertificateFailed = 12 - AddPackageFailed = 13 - ForceDeveloperLicense = 14 - CertUtilInstallFailed = 17 - CertIsCA = 18 - BannedEKU = 19 - NoBasicConstraints = 20 - NoCodeSigningEku = 21 - InstallCertificateCancelled = 22 - BannedKeyUsage = 23 - ExpiredCertificate = 24 -'@ -} - -function PrintMessageAndExit($ErrorMessage, $ReturnCode) -{ - Write-Host $ErrorMessage - if (!$Force) - { - Pause - } - exit $ReturnCode -} - -# -# Warns the user about installing certificates, and presents a Yes/No prompt -# to confirm the action. The default is set to No. -# -function ConfirmCertificateInstall -{ - $Answer = $host.UI.PromptForChoice( - "", - $UiStrings.WarningInstallCert, - [System.Management.Automation.Host.ChoiceDescription[]]@($UiStrings.PromptYesString, $UiStrings.PromptNoString), - 1) - - return $Answer -eq 0 -} - -# -# Validates whether a file is a valid certificate using CertUtil. -# This needs to be done before calling Get-PfxCertificate on the file, otherwise -# the user will get a cryptic "Password: " prompt for invalid certs. -# -function ValidateCertificateFormat($FilePath) -{ - # certutil -verify prints a lot of text that we don't need, so it's redirected to $null here - certutil.exe -verify $FilePath > $null - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorBadCertificate -f $FilePath, $LastExitCode) $ErrorCodes.BadCertificate - } - - # Check if certificate is expired - $cert = Get-PfxCertificate $FilePath - if (($cert.NotBefore -gt (Get-Date)) -or ($cert.NotAfter -lt (Get-Date))) - { - PrintMessageAndExit ($UiStrings.ErrorExpiredCertificate -f $FilePath) $ErrorCodes.ExpiredCertificate - } -} - -# -# Verify that the developer certificate meets the following restrictions: -# - The certificate must contain a Basic Constraints extension, and its -# Certificate Authority (CA) property must be false. -# - The certificate's Key Usage extension must be either absent, or set to -# only DigitalSignature. -# - The certificate must contain an Extended Key Usage (EKU) extension with -# Code Signing usage. -# - The certificate must NOT contain any other EKU except Code Signing and -# Lifetime Signing. -# -# These restrictions are enforced to decrease security risks that arise from -# trusting digital certificates. -# -function CheckCertificateRestrictions -{ - Set-Variable -Name BasicConstraintsExtensionOid -Value "2.5.29.19" -Option Constant - Set-Variable -Name KeyUsageExtensionOid -Value "2.5.29.15" -Option Constant - Set-Variable -Name EkuExtensionOid -Value "2.5.29.37" -Option Constant - Set-Variable -Name CodeSigningEkuOid -Value "1.3.6.1.5.5.7.3.3" -Option Constant - Set-Variable -Name LifetimeSigningEkuOid -Value "1.3.6.1.4.1.311.10.3.13" -Option Constant - - $CertificateExtensions = (Get-PfxCertificate $CertificatePath).Extensions - $HasBasicConstraints = $false - $HasCodeSigningEku = $false - - foreach ($Extension in $CertificateExtensions) - { - # Certificate must contain the Basic Constraints extension - if ($Extension.oid.value -eq $BasicConstraintsExtensionOid) - { - # CA property must be false - if ($Extension.CertificateAuthority) - { - PrintMessageAndExit $UiStrings.ErrorCertIsCA $ErrorCodes.CertIsCA - } - $HasBasicConstraints = $true - } - - # If key usage is present, it must be set to digital signature - elseif ($Extension.oid.value -eq $KeyUsageExtensionOid) - { - if ($Extension.KeyUsages -ne "DigitalSignature") - { - PrintMessageAndExit ($UiStrings.ErrorBannedKeyUsage -f $Extension.KeyUsages) $ErrorCodes.BannedKeyUsage - } - } - - elseif ($Extension.oid.value -eq $EkuExtensionOid) - { - # Certificate must contain the Code Signing EKU - $EKUs = $Extension.EnhancedKeyUsages.Value - if ($EKUs -contains $CodeSigningEkuOid) - { - $HasCodeSigningEKU = $True - } - - # EKUs other than code signing and lifetime signing are not allowed - foreach ($EKU in $EKUs) - { - if ($EKU -ne $CodeSigningEkuOid -and $EKU -ne $LifetimeSigningEkuOid) - { - PrintMessageAndExit ($UiStrings.ErrorBannedEKU -f $EKU) $ErrorCodes.BannedEKU - } - } - } - } - - if (!$HasBasicConstraints) - { - PrintMessageAndExit $UiStrings.ErrorNoBasicConstraints $ErrorCodes.NoBasicConstraints - } - if (!$HasCodeSigningEKU) - { - PrintMessageAndExit $UiStrings.ErrorNoCodeSigningEku $ErrorCodes.NoCodeSigningEku - } -} - -# -# Performs operations that require administrative privileges: -# - Prompt the user to obtain a developer license -# - Install the developer certificate (if -Force is not specified, also prompts the user to confirm) -# -function DoElevatedOperations -{ - if ($GetDeveloperLicense) - { - Write-Host $UiStrings.GettingDeveloperLicense - - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - try - { - Show-WindowsDeveloperLicenseRegistration - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - } - - if ($CertificatePath) - { - Write-Host $UiStrings.InstallingCertificate - - # Make sure certificate format is valid and usage constraints are followed - ValidateCertificateFormat $CertificatePath - CheckCertificateRestrictions - - # If -Force is not specified, warn the user and get consent - if ($Force -or (ConfirmCertificateInstall)) - { - # Add cert to store - certutil.exe -addstore TrustedPeople $CertificatePath - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorCertUtilInstallFailed -f $LastExitCode) $ErrorCodes.CertUtilInstallFailed - } - } - else - { - PrintMessageAndExit $UiStrings.ErrorInstallCertificateCancelled $ErrorCodes.InstallCertificateCancelled - } - } -} - -# -# Checks whether the machine is missing a valid developer license. -# -function CheckIfNeedDeveloperLicense -{ - $Result = $true - try - { - $Result = (Get-WindowsDeveloperLicense | Where-Object { $_.IsValid } | Measure-Object).Count -eq 0 - } - catch {} - - return $Result -} - -# -# Launches an elevated process running the current script to perform tasks -# that require administrative privileges. This function waits until the -# elevated process terminates, and checks whether those tasks were successful. -# -function LaunchElevated -{ - # Set up command line arguments to the elevated process - $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"' - - if ($Force) - { - $RelaunchArgs += ' -Force' - } - if ($NeedDeveloperLicense) - { - $RelaunchArgs += ' -GetDeveloperLicense' - } - if ($NeedInstallCertificate) - { - $RelaunchArgs += ' -CertificatePath "' + $DeveloperCertificatePath.FullName + '"' - } - - # Launch the process and wait for it to finish - try - { - $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorLaunchAdminFailed $ErrorCodes.LaunchAdminFailed - } - - while (!($AdminProcess.HasExited)) - { - Start-Sleep -Seconds 2 - } - - # Check if all elevated operations were successful - if ($NeedDeveloperLicense) - { - if (CheckIfNeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - else - { - Write-Host $UiStrings.AcquireLicenseSuccessful - } - } - if ($NeedInstallCertificate) - { - $Signature = Get-AuthenticodeSignature $DeveloperPackagePath -Verbose - if ($Signature.Status -ne "Valid") - { - PrintMessageAndExit ($UiStrings.ErrorInstallCertificateFailed -f $Signature.Status) $ErrorCodes.InstallCertificateFailed - } - else - { - Write-Host $UiStrings.InstallCertificateSuccessful - } - } -} - -# -# Finds all applicable dependency packages according to OS architecture, and -# installs the developer package with its dependencies. The expected layout -# of dependencies is: -# -# -# \Dependencies -# .appx -# \x86 -# .appx -# \x64 -# .appx -# \arm -# .appx -# -function InstallPackageWithDependencies -{ - $DependencyPackagesDir = (Join-Path $ScriptDir "Dependencies") - $DependencyPackages = @() - if (Test-Path $DependencyPackagesDir) - { - # Get architecture-neutral dependencies - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - - # Get architecture-specific dependencies - if (($Env:Processor_Architecture -eq "x86" -or $Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x86"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x86\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x64"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x64\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "arm") -and (Test-Path (Join-Path $DependencyPackagesDir "arm"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "arm\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - } - Write-Host $UiStrings.InstallingPackage - - $AddPackageSucceeded = $False - try - { - if ($DependencyPackages.FullName.Count -gt 0) - { - Write-Host $UiStrings.DependenciesFound - $DependencyPackages.FullName - Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath $DependencyPackages.FullName -ForceApplicationShutdown - } - else - { - Add-AppxPackage -Path $DeveloperPackagePath.FullName -ForceApplicationShutdown - } - $AddPackageSucceeded = $? - } - catch - { - $Error[0] # Dump details about the last error - } - - if (!$AddPackageSucceeded) - { - if ($NeedInstallCertificate) - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailedWithCert $ErrorCodes.AddPackageFailed - } - else - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailed $ErrorCodes.AddPackageFailed - } - } -} - -# -# Main script logic when the user launches the script without parameters. -# -function DoStandardOperations -{ - # List all .appx files in the script directory - $PackagePath = Get-ChildItem (Join-Path $ScriptDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - $PackageCount = ($PackagePath | Measure-Object).Count - - # List all .appxbundle files in the script directory - $BundlePath = Get-ChildItem (Join-Path $ScriptDir "*.appxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $BundleCount = ($BundlePath | Measure-Object).Count - - # List all .eappx files in the script directory - $EncryptedPackagePath = Get-ChildItem (Join-Path $ScriptDir "*.eappx") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedPackageCount = ($EncryptedPackagePath | Measure-Object).Count - - # List all .eappxbundle files in the script directory - $EncryptedBundlePath = Get-ChildItem (Join-Path $ScriptDir "*.eappxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedBundleCount = ($EncryptedBundlePath | Measure-Object).Count - - $NumberOfPackagesAndBundles = $PackageCount + $BundleCount + $EncryptedPackageCount + $EncryptedBundleCount - - # There must be exactly 1 package/bundle - if ($NumberOfPackagesAndBundles -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoPackageFound $ErrorCodes.NoPackageFound - } - elseif ($NumberOfPackagesAndBundles -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyPackagesFound $ErrorCodes.ManyPackagesFound - } - - if ($PackageCount -eq 1) - { - $DeveloperPackagePath = $PackagePath - Write-Host ($UiStrings.PackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($BundleCount -eq 1) - { - $DeveloperPackagePath = $BundlePath - Write-Host ($UiStrings.BundleFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedPackageCount -eq 1) - { - $DeveloperPackagePath = $EncryptedPackagePath - Write-Host ($UiStrings.EncryptedPackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedBundleCount -eq 1) - { - $DeveloperPackagePath = $EncryptedBundlePath - Write-Host ($UiStrings.EncryptedBundleFound -f $DeveloperPackagePath.FullName) - } - - # The package must be signed - $PackageSignature = Get-AuthenticodeSignature $DeveloperPackagePath - $PackageCertificate = $PackageSignature.SignerCertificate - if (!$PackageCertificate) - { - PrintMessageAndExit $UiStrings.ErrorPackageUnsigned $ErrorCodes.PackageUnsigned - } - - # Test if the package signature is trusted. If not, the corresponding certificate - # needs to be present in the current directory and needs to be installed. - $NeedInstallCertificate = ($PackageSignature.Status -ne "Valid") - - if ($NeedInstallCertificate) - { - # List all .cer files in the script directory - $DeveloperCertificatePath = Get-ChildItem (Join-Path $ScriptDir "*.cer") | Where-Object { $_.Mode -NotMatch "d" } - $DeveloperCertificateCount = ($DeveloperCertificatePath | Measure-Object).Count - - # There must be exactly 1 certificate - if ($DeveloperCertificateCount -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoCertificateFound $ErrorCodes.NoCertificateFound - } - elseif ($DeveloperCertificateCount -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyCertificatesFound $ErrorCodes.ManyCertificatesFound - } - - Write-Host ($UiStrings.CertificateFound -f $DeveloperCertificatePath.FullName) - - # The .cer file must have the format of a valid certificate - ValidateCertificateFormat $DeveloperCertificatePath - - # The package signature must match the certificate file - if ($PackageCertificate -ne (Get-PfxCertificate $DeveloperCertificatePath)) - { - PrintMessageAndExit $UiStrings.ErrorCertificateMismatch $ErrorCodes.CertificateMismatch - } - } - - $NeedDeveloperLicense = CheckIfNeedDeveloperLicense - - # Relaunch the script elevated with the necessary parameters if needed - if ($NeedDeveloperLicense -or $NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActions - if ($NeedDeveloperLicense) - { - Write-Host $UiStrings.ElevateActionDevLicense - } - if ($NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActionCertificate - } - - $IsAlreadyElevated = ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544") - if ($IsAlreadyElevated) - { - if ($Force -and $NeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - if ($Force -and $NeedInstallCertificate) - { - Write-Warning $UiStrings.WarningInstallCert - } - } - else - { - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceElevate $ErrorCodes.ForceElevate - } - else - { - Write-Host $UiStrings.ElevateActionsContinue - Pause - } - } - - LaunchElevated - } - - InstallPackageWithDependencies -} - -# -# Main script entry point -# -if ($GetDeveloperLicense -or $CertificatePath) -{ - DoElevatedOperations -} -else -{ - DoStandardOperations - PrintMessageAndExit $UiStrings.Success $ErrorCodes.Success -} - -# SIG # Begin signature block -# MIIiAQYJKoZIhvcNAQcCoIIh8jCCIe4CAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAnYmBUpv/sjF9s -# UpSJeaz8bsgho4m0HYf/wsPXcJL9raCCC4QwggUMMIID9KADAgECAhMzAAABT+fG -# YslG9Kl/AAAAAAFPMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD -# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy -# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p -# bmcgUENBIDIwMTAwHhcNMTYxMTE3MjE1OTE0WhcNMTgwMjE3MjE1OTE0WjCBgzEL -# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v -# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q -# UjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEAtImQinYMrMU9obyB6NdQCLtaaaeux8y4W704DyFR -# Rggj0b0imXO3KO/3B6sr+Uj3pRQFqU0kG21hlpyDnTPALHmZ8F3z7NVE36XNWfp2 -# rQY/xkoD5uotlBDCZm/9YtBQitEikSOXZTShxJoCXpLiuHwoeMJe40b3yu84V4is -# VgZYypgbx6jXXjaumkUw47a3PRjCpyeweU1T2DLmdqNQKvY/urtBHiSGTZibep72 -# LOK8kGBl+5Zp+uATaOKJKi51GJ3Cbbgh9JleKn8xoKcNzO9PEW7+SUJOYd43yyue -# QO/Oq15wCHOlcnu3Rs5bMlNdijlRb7DXqHjdoyhvXu5CHwIDAQABo4IBezCCAXcw -# HwYDVR0lBBgwFgYKKwYBBAGCNz0GAQYIKwYBBQUHAwMwHQYDVR0OBBYEFJIOoRFx -# ti9VDcMP9MlcdC5aDGq/MFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQLEwRNT1BSMTQw -# MgYDVQQFEysyMzA4NjUrYjRiMTI4NzgtZTI5My00M2U5LWIyMWUtN2QzMDcxOWQ0 -# NTJmMB8GA1UdIwQYMBaAFOb8X3u7IgBY5HJOtfQhdCMy5u+sMFYGA1UdHwRPME0w -# S6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz -# L01pY0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNybDBaBggrBgEFBQcBAQROMEwwSgYI -# KwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWlj -# Q29kU2lnUENBXzIwMTAtMDctMDYuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN -# AQELBQADggEBABHAuWpDNf6FsTiADbh0dSyNcUm4PEHtLb3iBjaQdiuJ5baB6Ybj -# GIyWkzJCp6f2tzQlOdDGekPq23dwzNTpQuuoxVUCdXie2BC+BxvKlGP7PA9x7tRV -# Z9cp9mq/B7zlj4Lq+KHiczM/FJJeobplVzdFhYBc1izGizxqh6MHEcvs2XE4IDUk -# PVS9zFWJ9HcQm+WZqg+uxjyOn9oAT8994bPAIPdSMfciSNVhjX8mAhl9g8xhkyrd -# uNziCLOn3+EEd2DI9Kw1yzHlbHVRxTd7E2pOlWuPQJ7ITT6uvVnFINbCeK23ZFs7 -# 0MAVcDQU5cWephzH9P/2y0jB4o3zbs6qtKAwggZwMIIEWKADAgECAgphDFJMAAAA -# AAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz -# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv -# cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB -# dXRob3JpdHkgMjAxMDAeFw0xMDA3MDYyMDQwMTdaFw0yNTA3MDYyMDUwMTdaMH4x -# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt -# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p -# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUA -# A4IBDwAwggEKAoIBAQDpDmRQeWe1xOP9CQBMnpSs91Zo6kTYz8VYT6mldnxtRbrT -# OZK0pB75+WWC5BfSj/1EnAjoZZPOLFWEv30I4y4rqEErGLeiS25JTGsVB97R0sKJ -# HnGUzbV/S7SvCNjMiNZrF5Q6k84mP+zm/jSYV9UdXUn2siou1YW7WT/4kLQrg3TK -# K7M7RuPwRknBF2ZUyRy9HcRVYldy+Ge5JSA03l2mpZVeqyiAzdWynuUDtWPTshTI -# wciKJgpZfwfs/w7tgBI1TBKmvlJb9aba4IsLSHfWhUfVELnG6Krui2otBVxgxrQq -# W5wjHF9F4xoUHm83yxkzgGqJTaNqZmN4k9Uwz5UfAgMBAAGjggHjMIIB3zAQBgkr -# BgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU5vxfe7siAFjkck619CF0IzLm76wwGQYJ -# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -# MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w -# TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj -# dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK -# BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N -# aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgZ0GA1UdIASBlTCBkjCBjwYJKwYB -# BAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v -# UEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBn -# AGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqG -# SIb3DQEBCwUAA4ICAQAadO9XTyl7xBaFeLhQ0yL8CZ2sgpf4NP8qLJeVEuXkv8+/ -# k8jjNKnbgbjcHgC+0jVvr+V/eZV35QLU8evYzU4eG2GiwlojGvCMqGJRRWcI4z88 -# HpP4MIUXyDlAptcOsyEp5aWhaYwik8x0mOehR0PyU6zADzBpf/7SJSBtb2HT3wfV -# 2XIALGmGdj1R26Y5SMk3YW0H3VMZy6fWYcK/4oOrD+Brm5XWfShRsIlKUaSabMi3 -# H0oaDmmp19zBftFJcKq2rbtyR2MX+qbWoqaG7KgQRJtjtrJpiQbHRoZ6GD/oxR0h -# 1Xv5AiMtxUHLvx1MyBbvsZx//CJLSYpuFeOmf3Zb0VN5kYWd1dLbPXM18zyuVLJS -# R2rAqhOV0o4R2plnXjKM+zeF0dx1hZyHxlpXhcK/3Q2PjJst67TuzyfTtV5p+qQW -# BAGnJGdzz01Ptt4FVpd69+lSTfR3BU+FxtgL8Y7tQgnRDXbjI1Z4IiY2vsqxjG6q -# HeSF2kczYo+kyZEzX3EeQK+YZcki6EIhJYocLWDZN4lBiSoWD9dhPJRoYFLv1keZ -# oIBA7hWBdz6c4FMYGlAdOJWbHmYzEyc5F3iHNs5Ow1+y9T1HU7bg5dsLYT0q15Is -# zjdaPkBCMaQfEAjCVpy/JF1RAp1qedIX09rBlI4HeyVxRKsGaubUxt8jmpZ1xTGC -# FdMwghXPAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u -# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp -# b24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTACEzMA -# AAFP58ZiyUb0qX8AAAAAAU8wDQYJYIZIAWUDBAIBBQCggcIwGQYJKoZIhvcNAQkD -# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ -# KoZIhvcNAQkEMSIEIM6sGgl9EI3BKHGPaKRgrF1O/bVv8y7tQZuqLVzy8rFiMFYG -# CisGAQQBgjcCAQwxSDBGoCyAKgBBAGQAZAAtAEEAcABwAEQAZQB2AFAAYQBjAGsA -# YQBnAGUALgBwAHMAMaEWgBRodHRwOi8vbWljcm9zb2Z0LmNvbTANBgkqhkiG9w0B -# AQEFAASCAQB+h3AYSy8MV5bb3ZfjI9xGXZgMGVKhmRo9yYG3wIelD9RULoRtCN4J -# ScCz++xjjxhUEdJ57ZeRdobQGnjEKyepHccHJsnxiFXUqd8gHWN56LxVKXLK6lgH -# RnSmMm63Z/s6/qA7XdgHKjUGqG0MsZgFiX0DBfVQUQnPPPgkicc2xwWI1G4ZTDVn -# Qoi9zUNb1bvJJhcN1BlPcvKVrVOqBLLfsSDsYGMmLcrh0v9QkMPBefLexqGxoibs -# fvzJiwiCSRTRiC29aUrAP3s6EazYYP866d7F94qZfF5Qy8fy3RnnjErxD1PpgEVx -# EZus2pc23sNrQzNokH1A7q3beEKTKal8oYITSTCCE0UGCisGAQQBgjcDAwExghM1 -# MIITMQYJKoZIhvcNAQcCoIITIjCCEx4CAQMxDzANBglghkgBZQMEAgEFADCCATwG -# CyqGSIb3DQEJEAEEoIIBKwSCAScwggEjAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI -# AWUDBAIBBQAEIJPdm/WIYp5J5+KJJMbxhHziKQ+l8HJ9bF3jCZXkxTgaAgZZVDxZ -# MIMYEjIwMTcwNzIxMDI0NTMxLjA5WjAHAgEBgAIB9KCBuaSBtjCBszELMAkGA1UE -# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc -# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUG -# A1UECxMebkNpcGhlciBEU0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxN -# aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOzTCCBnEwggRZoAMCAQICCmEJ -# gSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI -# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv -# ZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmlj -# YXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1 -# NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT -# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE -# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEB -# AQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18 -# aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdN -# uDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NM -# ksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2K -# Qk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZ -# zTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQ -# BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUw -# GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB -# /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f -# BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv -# ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w -# TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 -# cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCB -# jwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29m -# dC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAd -# AEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAd -# MA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F -# 4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbM -# QEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mB -# ZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7ti -# X5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S -# 4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3ai -# caoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf -# 5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsb -# iSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJ -# zxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB -# 0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/e -# dIhJEjCCBNowggPCoAMCAQICEzMAAACdIJxWd1XUKJoAAAAAAJ0wDQYJKoZIhvcN -# AQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG -# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMTYwOTA3MTc1 -# NjQxWhcNMTgwOTA3MTc1NjQxWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh -# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -# b3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0Ug -# RVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt -# cCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kSYnBFa -# Khouqp9TXW1dvLZZdpHAJlsD5shsX6Mq60wARnQ4FL8qeF2wI0zsbmBI7EnkW3Wm -# cP3z1K5Vbo69BB9nPRn9MXKClKFzsS688BzU2+8huMaptMbCRgcumcw+IQvDLkjf -# DGp1xTWO11mcqztIfp6y4PxUlt4TRzlC0G7WS/2/DKTwC+X66MiIi+6c+3XhxEvo -# yw5kzlfeYKh6Ss5lHLhlliNiO38FT1lm3ekN1fh8vsBM3nsKlhvMVTkEbwYIQTi7 -# 9RnftXoEdwUc4uyMx/Gxml5HbsyyHqPalniB7vAHmIBRvroKFB5+njpZJKFXcwz+ -# QUROlsJUUQ+pxQIDAQABo4IBGzCCARcwHQYDVR0OBBYEFLyGCMpbalrK5L3My4K0 -# FUjqh+WhMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRP -# ME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 -# Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEww -# SgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv -# TWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0l -# BAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEBAH/eJCG9We+01otxylmR -# vi6oRoK7j99kHX3mKgu8KGdL/vl3v7X0TqT96EoPPmcis1aJbZcIWuwjFPV5KhNX -# jJIXnQYh6vOo6hs73NuEmkv3chX2n48nqP+l4tYgiZVNQKkVYF65lwHXMAv/Qmpr -# VtnsWlw2A4DMFi1qwbkzZE/bXmt/2G/AroGlOO06zl1yGoxMFctfk4yy3aoALeP9 -# ZCipqb4QHf4V3CePH46kA+qON9sEJVMf4TJ69zsikMzcKg3BXoYJ1T5W76sloHrL -# MkBY9r0JW7bJ/3tHeXSGpYad2CINV17hqA3GJk4C9v069gGs95e8uZEOYdud0++m -# NmmhggN2MIICXgIBATCB46GBuaSBtjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgT -# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m -# dCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBE -# U0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T -# dGFtcCBTZXJ2aWNloiUKAQEwCQYFKw4DAhoFAAMVABgNrLOMaDCz+HQZsnjOgCs1 -# Lwj6oIHCMIG/pIG8MIG5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv -# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 -# aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIE5UUyBFU046NTdG -# Ni1DMUUwLTU1NEMxKzApBgNVBAMTIk1pY3Jvc29mdCBUaW1lIFNvdXJjZSBNYXN0 -# ZXIgQ2xvY2swDQYJKoZIhvcNAQEFBQACBQDdG19/MCIYDzIwMTcwNzIwMTY1NzM1 -# WhgPMjAxNzA3MjExNjU3MzVaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAN0bX38C -# AQAwBwIBAAICAMEwBwIBAAICGvIwCgIFAN0csP8CAQAwNgYKKwYBBAGEWQoEAjEo -# MCYwDAYKKwYBBAGEWQoDAaAKMAgCAQACAxbjYKEKMAgCAQACAwehIDANBgkqhkiG -# 9w0BAQUFAAOCAQEAIWqW45RvFXwjBVSrRXQeFN9MB35hIxT4uUMbWQqFQLbVXgIz -# lvDhnoXmN+Af/yyC4yWrfIPdy5Vk0EjhwQtfUBhrN54bo7dyVYaY3mL+PJQja8kT -# by1YEgYt68kHiARuHi7uFzWOoJbd6FSqlZDGhPnYZo+fVq4Y3bttuMmSeR8L9BWB -# HFBhX45zzmmacUhN3Nm2J9gZ8ed6KA2U5VJFVDkcVzn63KJtlr+POymNVMgtOts1 -# vq05uRjj9Q9k069YY/GuObtIpPrz36w2h8vhO5Qfpx6ZG04l3uou7E6i7Gl+jXcd -# VkWTutSe2NQyhaqkChfdD8SMCwkA9TeThzFv5jGCAvUwggLxAgEBMIGTMHwxCzAJ -# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k -# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv -# c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAnSCcVndV1CiaAAAAAACdMA0G -# CWCGSAFlAwQCAQUAoIIBMjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ -# KoZIhvcNAQkEMSIEIGQXuTrJKWTDGJqlJk7ANUAEMoswJGjPpK2ahEqAgccVMIHi -# BgsqhkiG9w0BCRACDDGB0jCBzzCBzDCBsQQUGA2ss4xoMLP4dBmyeM6AKzUvCPow -# gZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw -# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAJ0gnFZ3 -# VdQomgAAAAAAnTAWBBRNDOnnwrJaeTO4MiBDM6JW8L7EUTANBgkqhkiG9w0BAQsF -# AASCAQA7G6QRJ53LBnJ6uVwFfelQ9mKLYALTsZ7lB7R2PZ66nT4tePiI4UTtKkKv -# v9poY68a6QLoT5IA2HTYcFSjBK2aYpw0uGG8JJPTGdu8BYawTeXEIvSI6rGXAXTW -# 3enCkwBxl08u8oGFje3vP34DQXVMUWYD2HU58Z+aV4gDbF97gAGz5BkwzixG7IcD -# BdzPaVtWZkGS5ww1d0Hh+NyVFPiIaBGkuz9PbrbfNK4uPFwoeXzdXbbCTX5N1mOW -# 5pDO39vyzcqITMBeZ6ogkGjm5NIKjGMA1gl+kHT23iNtXHYJFK+df2r5o/wmytP8 -# GU3tn8zSkac5pn6bu8Gl1M3ndtx5 -# SIG # End signature block diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 deleted file mode 100644 index c30a3d93..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 deleted file mode 100644 index e1f88020..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 deleted file mode 100644 index 4f7fae23..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 deleted file mode 100644 index a990b390..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 deleted file mode 100644 index d42629f5..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 deleted file mode 100644 index bda59582..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744b984..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 deleted file mode 100644 index 1ef787c8..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 deleted file mode 100644 index cb5f65d1..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 deleted file mode 100644 index 21b785eb..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 deleted file mode 100644 index 71d22424..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 deleted file mode 100644 index 4b574d68..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744c26a..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/KiwixWebApp_0.9.92.0_AnyCPU.appxbundle b/AppPackages/KiwixWebApp_0.9.92.0_Test/KiwixWebApp_0.9.92.0_AnyCPU.appxbundle deleted file mode 100644 index b89b6ea8..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/KiwixWebApp_0.9.92.0_AnyCPU.appxbundle and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.92.0_Test/KiwixWebApp_0.9.92.0_AnyCPU.cer b/AppPackages/KiwixWebApp_0.9.92.0_Test/KiwixWebApp_0.9.92.0_AnyCPU.cer deleted file mode 100644 index 20a5b8a4..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.92.0_Test/KiwixWebApp_0.9.92.0_AnyCPU.cer and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_AnyCPU_bundle.appxupload b/AppPackages/KiwixWebApp_0.9.93.0_AnyCPU_bundle.appxupload deleted file mode 100644 index d655fdc5..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_AnyCPU_bundle.appxupload and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.ps1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.ps1 deleted file mode 100644 index 2467ff4f..00000000 --- a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.ps1 +++ /dev/null @@ -1,750 +0,0 @@ -# -# Add-AppxDevPackage.ps1 is a PowerShell script designed to install app -# packages created by Visual Studio for developers. To run this script from -# Explorer, right-click on its icon and choose "Run with PowerShell". -# -# Visual Studio supplies this script in the folder generated with its -# "Prepare Package" command. The same folder will also contain the app -# package (a .appx file), the signing certificate (a .cer file), and a -# "Dependencies" subfolder containing all the framework packages used by the -# app. -# -# This script simplifies installing these packages by automating the -# following functions: -# 1. Find the app package and signing certificate in the script directory -# 2. Prompt the user to acquire a developer license and to install the -# certificate if necessary -# 3. Find dependency packages that are applicable to the operating system's -# CPU architecture -# 4. Install the package along with all applicable dependencies -# -# All command line parameters are reserved for use internally by the script. -# Users should launch this script from Explorer. -# - -# .Link -# http://go.microsoft.com/fwlink/?LinkId=243053 - -param( - [switch]$Force = $false, - [switch]$GetDeveloperLicense = $false, - [string]$CertificatePath = $null -) - -$ErrorActionPreference = "Stop" - -# The language resources for this script are placed in the -# "Add-AppDevPackage.resources" subfolder alongside the script. Since the -# current working directory might not be the directory that contains the -# script, we need to create the full path of the resources directory to -# pass into Import-LocalizedData -$ScriptPath = $null -try -{ - $ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path - $ScriptDir = Split-Path -Parent $ScriptPath -} -catch {} - -if (!$ScriptPath) -{ - PrintMessageAndExit $UiStrings.ErrorNoScriptPath $ErrorCodes.NoScriptPath -} - -$LocalizedResourcePath = Join-Path $ScriptDir "Add-AppDevPackage.resources" -Import-LocalizedData -BindingVariable UiStrings -BaseDirectory $LocalizedResourcePath - -$ErrorCodes = Data { - ConvertFrom-StringData @' - Success = 0 - NoScriptPath = 1 - NoPackageFound = 2 - ManyPackagesFound = 3 - NoCertificateFound = 4 - ManyCertificatesFound = 5 - BadCertificate = 6 - PackageUnsigned = 7 - CertificateMismatch = 8 - ForceElevate = 9 - LaunchAdminFailed = 10 - GetDeveloperLicenseFailed = 11 - InstallCertificateFailed = 12 - AddPackageFailed = 13 - ForceDeveloperLicense = 14 - CertUtilInstallFailed = 17 - CertIsCA = 18 - BannedEKU = 19 - NoBasicConstraints = 20 - NoCodeSigningEku = 21 - InstallCertificateCancelled = 22 - BannedKeyUsage = 23 - ExpiredCertificate = 24 -'@ -} - -function PrintMessageAndExit($ErrorMessage, $ReturnCode) -{ - Write-Host $ErrorMessage - if (!$Force) - { - Pause - } - exit $ReturnCode -} - -# -# Warns the user about installing certificates, and presents a Yes/No prompt -# to confirm the action. The default is set to No. -# -function ConfirmCertificateInstall -{ - $Answer = $host.UI.PromptForChoice( - "", - $UiStrings.WarningInstallCert, - [System.Management.Automation.Host.ChoiceDescription[]]@($UiStrings.PromptYesString, $UiStrings.PromptNoString), - 1) - - return $Answer -eq 0 -} - -# -# Validates whether a file is a valid certificate using CertUtil. -# This needs to be done before calling Get-PfxCertificate on the file, otherwise -# the user will get a cryptic "Password: " prompt for invalid certs. -# -function ValidateCertificateFormat($FilePath) -{ - # certutil -verify prints a lot of text that we don't need, so it's redirected to $null here - certutil.exe -verify $FilePath > $null - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorBadCertificate -f $FilePath, $LastExitCode) $ErrorCodes.BadCertificate - } - - # Check if certificate is expired - $cert = Get-PfxCertificate $FilePath - if (($cert.NotBefore -gt (Get-Date)) -or ($cert.NotAfter -lt (Get-Date))) - { - PrintMessageAndExit ($UiStrings.ErrorExpiredCertificate -f $FilePath) $ErrorCodes.ExpiredCertificate - } -} - -# -# Verify that the developer certificate meets the following restrictions: -# - The certificate must contain a Basic Constraints extension, and its -# Certificate Authority (CA) property must be false. -# - The certificate's Key Usage extension must be either absent, or set to -# only DigitalSignature. -# - The certificate must contain an Extended Key Usage (EKU) extension with -# Code Signing usage. -# - The certificate must NOT contain any other EKU except Code Signing and -# Lifetime Signing. -# -# These restrictions are enforced to decrease security risks that arise from -# trusting digital certificates. -# -function CheckCertificateRestrictions -{ - Set-Variable -Name BasicConstraintsExtensionOid -Value "2.5.29.19" -Option Constant - Set-Variable -Name KeyUsageExtensionOid -Value "2.5.29.15" -Option Constant - Set-Variable -Name EkuExtensionOid -Value "2.5.29.37" -Option Constant - Set-Variable -Name CodeSigningEkuOid -Value "1.3.6.1.5.5.7.3.3" -Option Constant - Set-Variable -Name LifetimeSigningEkuOid -Value "1.3.6.1.4.1.311.10.3.13" -Option Constant - - $CertificateExtensions = (Get-PfxCertificate $CertificatePath).Extensions - $HasBasicConstraints = $false - $HasCodeSigningEku = $false - - foreach ($Extension in $CertificateExtensions) - { - # Certificate must contain the Basic Constraints extension - if ($Extension.oid.value -eq $BasicConstraintsExtensionOid) - { - # CA property must be false - if ($Extension.CertificateAuthority) - { - PrintMessageAndExit $UiStrings.ErrorCertIsCA $ErrorCodes.CertIsCA - } - $HasBasicConstraints = $true - } - - # If key usage is present, it must be set to digital signature - elseif ($Extension.oid.value -eq $KeyUsageExtensionOid) - { - if ($Extension.KeyUsages -ne "DigitalSignature") - { - PrintMessageAndExit ($UiStrings.ErrorBannedKeyUsage -f $Extension.KeyUsages) $ErrorCodes.BannedKeyUsage - } - } - - elseif ($Extension.oid.value -eq $EkuExtensionOid) - { - # Certificate must contain the Code Signing EKU - $EKUs = $Extension.EnhancedKeyUsages.Value - if ($EKUs -contains $CodeSigningEkuOid) - { - $HasCodeSigningEKU = $True - } - - # EKUs other than code signing and lifetime signing are not allowed - foreach ($EKU in $EKUs) - { - if ($EKU -ne $CodeSigningEkuOid -and $EKU -ne $LifetimeSigningEkuOid) - { - PrintMessageAndExit ($UiStrings.ErrorBannedEKU -f $EKU) $ErrorCodes.BannedEKU - } - } - } - } - - if (!$HasBasicConstraints) - { - PrintMessageAndExit $UiStrings.ErrorNoBasicConstraints $ErrorCodes.NoBasicConstraints - } - if (!$HasCodeSigningEKU) - { - PrintMessageAndExit $UiStrings.ErrorNoCodeSigningEku $ErrorCodes.NoCodeSigningEku - } -} - -# -# Performs operations that require administrative privileges: -# - Prompt the user to obtain a developer license -# - Install the developer certificate (if -Force is not specified, also prompts the user to confirm) -# -function DoElevatedOperations -{ - if ($GetDeveloperLicense) - { - Write-Host $UiStrings.GettingDeveloperLicense - - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - try - { - Show-WindowsDeveloperLicenseRegistration - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - } - - if ($CertificatePath) - { - Write-Host $UiStrings.InstallingCertificate - - # Make sure certificate format is valid and usage constraints are followed - ValidateCertificateFormat $CertificatePath - CheckCertificateRestrictions - - # If -Force is not specified, warn the user and get consent - if ($Force -or (ConfirmCertificateInstall)) - { - # Add cert to store - certutil.exe -addstore TrustedPeople $CertificatePath - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorCertUtilInstallFailed -f $LastExitCode) $ErrorCodes.CertUtilInstallFailed - } - } - else - { - PrintMessageAndExit $UiStrings.ErrorInstallCertificateCancelled $ErrorCodes.InstallCertificateCancelled - } - } -} - -# -# Checks whether the machine is missing a valid developer license. -# -function CheckIfNeedDeveloperLicense -{ - $Result = $true - try - { - $Result = (Get-WindowsDeveloperLicense | Where-Object { $_.IsValid } | Measure-Object).Count -eq 0 - } - catch {} - - return $Result -} - -# -# Launches an elevated process running the current script to perform tasks -# that require administrative privileges. This function waits until the -# elevated process terminates, and checks whether those tasks were successful. -# -function LaunchElevated -{ - # Set up command line arguments to the elevated process - $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"' - - if ($Force) - { - $RelaunchArgs += ' -Force' - } - if ($NeedDeveloperLicense) - { - $RelaunchArgs += ' -GetDeveloperLicense' - } - if ($NeedInstallCertificate) - { - $RelaunchArgs += ' -CertificatePath "' + $DeveloperCertificatePath.FullName + '"' - } - - # Launch the process and wait for it to finish - try - { - $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorLaunchAdminFailed $ErrorCodes.LaunchAdminFailed - } - - while (!($AdminProcess.HasExited)) - { - Start-Sleep -Seconds 2 - } - - # Check if all elevated operations were successful - if ($NeedDeveloperLicense) - { - if (CheckIfNeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - else - { - Write-Host $UiStrings.AcquireLicenseSuccessful - } - } - if ($NeedInstallCertificate) - { - $Signature = Get-AuthenticodeSignature $DeveloperPackagePath -Verbose - if ($Signature.Status -ne "Valid") - { - PrintMessageAndExit ($UiStrings.ErrorInstallCertificateFailed -f $Signature.Status) $ErrorCodes.InstallCertificateFailed - } - else - { - Write-Host $UiStrings.InstallCertificateSuccessful - } - } -} - -# -# Finds all applicable dependency packages according to OS architecture, and -# installs the developer package with its dependencies. The expected layout -# of dependencies is: -# -# -# \Dependencies -# .appx -# \x86 -# .appx -# \x64 -# .appx -# \arm -# .appx -# -function InstallPackageWithDependencies -{ - $DependencyPackagesDir = (Join-Path $ScriptDir "Dependencies") - $DependencyPackages = @() - if (Test-Path $DependencyPackagesDir) - { - # Get architecture-neutral dependencies - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - - # Get architecture-specific dependencies - if (($Env:Processor_Architecture -eq "x86" -or $Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x86"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x86\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x64"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x64\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "arm") -and (Test-Path (Join-Path $DependencyPackagesDir "arm"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "arm\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - } - Write-Host $UiStrings.InstallingPackage - - $AddPackageSucceeded = $False - try - { - if ($DependencyPackages.FullName.Count -gt 0) - { - Write-Host $UiStrings.DependenciesFound - $DependencyPackages.FullName - Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath $DependencyPackages.FullName -ForceApplicationShutdown - } - else - { - Add-AppxPackage -Path $DeveloperPackagePath.FullName -ForceApplicationShutdown - } - $AddPackageSucceeded = $? - } - catch - { - $Error[0] # Dump details about the last error - } - - if (!$AddPackageSucceeded) - { - if ($NeedInstallCertificate) - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailedWithCert $ErrorCodes.AddPackageFailed - } - else - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailed $ErrorCodes.AddPackageFailed - } - } -} - -# -# Main script logic when the user launches the script without parameters. -# -function DoStandardOperations -{ - # List all .appx files in the script directory - $PackagePath = Get-ChildItem (Join-Path $ScriptDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - $PackageCount = ($PackagePath | Measure-Object).Count - - # List all .appxbundle files in the script directory - $BundlePath = Get-ChildItem (Join-Path $ScriptDir "*.appxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $BundleCount = ($BundlePath | Measure-Object).Count - - # List all .eappx files in the script directory - $EncryptedPackagePath = Get-ChildItem (Join-Path $ScriptDir "*.eappx") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedPackageCount = ($EncryptedPackagePath | Measure-Object).Count - - # List all .eappxbundle files in the script directory - $EncryptedBundlePath = Get-ChildItem (Join-Path $ScriptDir "*.eappxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedBundleCount = ($EncryptedBundlePath | Measure-Object).Count - - $NumberOfPackagesAndBundles = $PackageCount + $BundleCount + $EncryptedPackageCount + $EncryptedBundleCount - - # There must be exactly 1 package/bundle - if ($NumberOfPackagesAndBundles -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoPackageFound $ErrorCodes.NoPackageFound - } - elseif ($NumberOfPackagesAndBundles -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyPackagesFound $ErrorCodes.ManyPackagesFound - } - - if ($PackageCount -eq 1) - { - $DeveloperPackagePath = $PackagePath - Write-Host ($UiStrings.PackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($BundleCount -eq 1) - { - $DeveloperPackagePath = $BundlePath - Write-Host ($UiStrings.BundleFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedPackageCount -eq 1) - { - $DeveloperPackagePath = $EncryptedPackagePath - Write-Host ($UiStrings.EncryptedPackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedBundleCount -eq 1) - { - $DeveloperPackagePath = $EncryptedBundlePath - Write-Host ($UiStrings.EncryptedBundleFound -f $DeveloperPackagePath.FullName) - } - - # The package must be signed - $PackageSignature = Get-AuthenticodeSignature $DeveloperPackagePath - $PackageCertificate = $PackageSignature.SignerCertificate - if (!$PackageCertificate) - { - PrintMessageAndExit $UiStrings.ErrorPackageUnsigned $ErrorCodes.PackageUnsigned - } - - # Test if the package signature is trusted. If not, the corresponding certificate - # needs to be present in the current directory and needs to be installed. - $NeedInstallCertificate = ($PackageSignature.Status -ne "Valid") - - if ($NeedInstallCertificate) - { - # List all .cer files in the script directory - $DeveloperCertificatePath = Get-ChildItem (Join-Path $ScriptDir "*.cer") | Where-Object { $_.Mode -NotMatch "d" } - $DeveloperCertificateCount = ($DeveloperCertificatePath | Measure-Object).Count - - # There must be exactly 1 certificate - if ($DeveloperCertificateCount -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoCertificateFound $ErrorCodes.NoCertificateFound - } - elseif ($DeveloperCertificateCount -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyCertificatesFound $ErrorCodes.ManyCertificatesFound - } - - Write-Host ($UiStrings.CertificateFound -f $DeveloperCertificatePath.FullName) - - # The .cer file must have the format of a valid certificate - ValidateCertificateFormat $DeveloperCertificatePath - - # The package signature must match the certificate file - if ($PackageCertificate -ne (Get-PfxCertificate $DeveloperCertificatePath)) - { - PrintMessageAndExit $UiStrings.ErrorCertificateMismatch $ErrorCodes.CertificateMismatch - } - } - - $NeedDeveloperLicense = CheckIfNeedDeveloperLicense - - # Relaunch the script elevated with the necessary parameters if needed - if ($NeedDeveloperLicense -or $NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActions - if ($NeedDeveloperLicense) - { - Write-Host $UiStrings.ElevateActionDevLicense - } - if ($NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActionCertificate - } - - $IsAlreadyElevated = ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544") - if ($IsAlreadyElevated) - { - if ($Force -and $NeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - if ($Force -and $NeedInstallCertificate) - { - Write-Warning $UiStrings.WarningInstallCert - } - } - else - { - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceElevate $ErrorCodes.ForceElevate - } - else - { - Write-Host $UiStrings.ElevateActionsContinue - Pause - } - } - - LaunchElevated - } - - InstallPackageWithDependencies -} - -# -# Main script entry point -# -if ($GetDeveloperLicense -or $CertificatePath) -{ - DoElevatedOperations -} -else -{ - DoStandardOperations - PrintMessageAndExit $UiStrings.Success $ErrorCodes.Success -} - -# SIG # Begin signature block -# MIIiAQYJKoZIhvcNAQcCoIIh8jCCIe4CAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAnYmBUpv/sjF9s -# UpSJeaz8bsgho4m0HYf/wsPXcJL9raCCC4QwggUMMIID9KADAgECAhMzAAABT+fG -# YslG9Kl/AAAAAAFPMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD -# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy -# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p -# bmcgUENBIDIwMTAwHhcNMTYxMTE3MjE1OTE0WhcNMTgwMjE3MjE1OTE0WjCBgzEL -# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v -# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q -# UjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEAtImQinYMrMU9obyB6NdQCLtaaaeux8y4W704DyFR -# Rggj0b0imXO3KO/3B6sr+Uj3pRQFqU0kG21hlpyDnTPALHmZ8F3z7NVE36XNWfp2 -# rQY/xkoD5uotlBDCZm/9YtBQitEikSOXZTShxJoCXpLiuHwoeMJe40b3yu84V4is -# VgZYypgbx6jXXjaumkUw47a3PRjCpyeweU1T2DLmdqNQKvY/urtBHiSGTZibep72 -# LOK8kGBl+5Zp+uATaOKJKi51GJ3Cbbgh9JleKn8xoKcNzO9PEW7+SUJOYd43yyue -# QO/Oq15wCHOlcnu3Rs5bMlNdijlRb7DXqHjdoyhvXu5CHwIDAQABo4IBezCCAXcw -# HwYDVR0lBBgwFgYKKwYBBAGCNz0GAQYIKwYBBQUHAwMwHQYDVR0OBBYEFJIOoRFx -# ti9VDcMP9MlcdC5aDGq/MFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQLEwRNT1BSMTQw -# MgYDVQQFEysyMzA4NjUrYjRiMTI4NzgtZTI5My00M2U5LWIyMWUtN2QzMDcxOWQ0 -# NTJmMB8GA1UdIwQYMBaAFOb8X3u7IgBY5HJOtfQhdCMy5u+sMFYGA1UdHwRPME0w -# S6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz -# L01pY0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNybDBaBggrBgEFBQcBAQROMEwwSgYI -# KwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWlj -# Q29kU2lnUENBXzIwMTAtMDctMDYuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN -# AQELBQADggEBABHAuWpDNf6FsTiADbh0dSyNcUm4PEHtLb3iBjaQdiuJ5baB6Ybj -# GIyWkzJCp6f2tzQlOdDGekPq23dwzNTpQuuoxVUCdXie2BC+BxvKlGP7PA9x7tRV -# Z9cp9mq/B7zlj4Lq+KHiczM/FJJeobplVzdFhYBc1izGizxqh6MHEcvs2XE4IDUk -# PVS9zFWJ9HcQm+WZqg+uxjyOn9oAT8994bPAIPdSMfciSNVhjX8mAhl9g8xhkyrd -# uNziCLOn3+EEd2DI9Kw1yzHlbHVRxTd7E2pOlWuPQJ7ITT6uvVnFINbCeK23ZFs7 -# 0MAVcDQU5cWephzH9P/2y0jB4o3zbs6qtKAwggZwMIIEWKADAgECAgphDFJMAAAA -# AAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz -# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv -# cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB -# dXRob3JpdHkgMjAxMDAeFw0xMDA3MDYyMDQwMTdaFw0yNTA3MDYyMDUwMTdaMH4x -# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt -# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p -# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUA -# A4IBDwAwggEKAoIBAQDpDmRQeWe1xOP9CQBMnpSs91Zo6kTYz8VYT6mldnxtRbrT -# OZK0pB75+WWC5BfSj/1EnAjoZZPOLFWEv30I4y4rqEErGLeiS25JTGsVB97R0sKJ -# HnGUzbV/S7SvCNjMiNZrF5Q6k84mP+zm/jSYV9UdXUn2siou1YW7WT/4kLQrg3TK -# K7M7RuPwRknBF2ZUyRy9HcRVYldy+Ge5JSA03l2mpZVeqyiAzdWynuUDtWPTshTI -# wciKJgpZfwfs/w7tgBI1TBKmvlJb9aba4IsLSHfWhUfVELnG6Krui2otBVxgxrQq -# W5wjHF9F4xoUHm83yxkzgGqJTaNqZmN4k9Uwz5UfAgMBAAGjggHjMIIB3zAQBgkr -# BgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU5vxfe7siAFjkck619CF0IzLm76wwGQYJ -# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -# MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w -# TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj -# dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK -# BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N -# aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgZ0GA1UdIASBlTCBkjCBjwYJKwYB -# BAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v -# UEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBn -# AGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqG -# SIb3DQEBCwUAA4ICAQAadO9XTyl7xBaFeLhQ0yL8CZ2sgpf4NP8qLJeVEuXkv8+/ -# k8jjNKnbgbjcHgC+0jVvr+V/eZV35QLU8evYzU4eG2GiwlojGvCMqGJRRWcI4z88 -# HpP4MIUXyDlAptcOsyEp5aWhaYwik8x0mOehR0PyU6zADzBpf/7SJSBtb2HT3wfV -# 2XIALGmGdj1R26Y5SMk3YW0H3VMZy6fWYcK/4oOrD+Brm5XWfShRsIlKUaSabMi3 -# H0oaDmmp19zBftFJcKq2rbtyR2MX+qbWoqaG7KgQRJtjtrJpiQbHRoZ6GD/oxR0h -# 1Xv5AiMtxUHLvx1MyBbvsZx//CJLSYpuFeOmf3Zb0VN5kYWd1dLbPXM18zyuVLJS -# R2rAqhOV0o4R2plnXjKM+zeF0dx1hZyHxlpXhcK/3Q2PjJst67TuzyfTtV5p+qQW -# BAGnJGdzz01Ptt4FVpd69+lSTfR3BU+FxtgL8Y7tQgnRDXbjI1Z4IiY2vsqxjG6q -# HeSF2kczYo+kyZEzX3EeQK+YZcki6EIhJYocLWDZN4lBiSoWD9dhPJRoYFLv1keZ -# oIBA7hWBdz6c4FMYGlAdOJWbHmYzEyc5F3iHNs5Ow1+y9T1HU7bg5dsLYT0q15Is -# zjdaPkBCMaQfEAjCVpy/JF1RAp1qedIX09rBlI4HeyVxRKsGaubUxt8jmpZ1xTGC -# FdMwghXPAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u -# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp -# b24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTACEzMA -# AAFP58ZiyUb0qX8AAAAAAU8wDQYJYIZIAWUDBAIBBQCggcIwGQYJKoZIhvcNAQkD -# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ -# KoZIhvcNAQkEMSIEIM6sGgl9EI3BKHGPaKRgrF1O/bVv8y7tQZuqLVzy8rFiMFYG -# CisGAQQBgjcCAQwxSDBGoCyAKgBBAGQAZAAtAEEAcABwAEQAZQB2AFAAYQBjAGsA -# YQBnAGUALgBwAHMAMaEWgBRodHRwOi8vbWljcm9zb2Z0LmNvbTANBgkqhkiG9w0B -# AQEFAASCAQB+h3AYSy8MV5bb3ZfjI9xGXZgMGVKhmRo9yYG3wIelD9RULoRtCN4J -# ScCz++xjjxhUEdJ57ZeRdobQGnjEKyepHccHJsnxiFXUqd8gHWN56LxVKXLK6lgH -# RnSmMm63Z/s6/qA7XdgHKjUGqG0MsZgFiX0DBfVQUQnPPPgkicc2xwWI1G4ZTDVn -# Qoi9zUNb1bvJJhcN1BlPcvKVrVOqBLLfsSDsYGMmLcrh0v9QkMPBefLexqGxoibs -# fvzJiwiCSRTRiC29aUrAP3s6EazYYP866d7F94qZfF5Qy8fy3RnnjErxD1PpgEVx -# EZus2pc23sNrQzNokH1A7q3beEKTKal8oYITSTCCE0UGCisGAQQBgjcDAwExghM1 -# MIITMQYJKoZIhvcNAQcCoIITIjCCEx4CAQMxDzANBglghkgBZQMEAgEFADCCATwG -# CyqGSIb3DQEJEAEEoIIBKwSCAScwggEjAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI -# AWUDBAIBBQAEIJPdm/WIYp5J5+KJJMbxhHziKQ+l8HJ9bF3jCZXkxTgaAgZZVDxZ -# MIMYEjIwMTcwNzIxMDI0NTMxLjA5WjAHAgEBgAIB9KCBuaSBtjCBszELMAkGA1UE -# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc -# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUG -# A1UECxMebkNpcGhlciBEU0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxN -# aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOzTCCBnEwggRZoAMCAQICCmEJ -# gSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI -# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv -# ZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmlj -# YXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1 -# NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT -# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE -# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEB -# AQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18 -# aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdN -# uDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NM -# ksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2K -# Qk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZ -# zTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQ -# BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUw -# GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB -# /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f -# BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv -# ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w -# TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 -# cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCB -# jwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29m -# dC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAd -# AEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAd -# MA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F -# 4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbM -# QEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mB -# ZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7ti -# X5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S -# 4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3ai -# caoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf -# 5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsb -# iSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJ -# zxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB -# 0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/e -# dIhJEjCCBNowggPCoAMCAQICEzMAAACdIJxWd1XUKJoAAAAAAJ0wDQYJKoZIhvcN -# AQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG -# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMTYwOTA3MTc1 -# NjQxWhcNMTgwOTA3MTc1NjQxWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh -# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -# b3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0Ug -# RVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt -# cCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kSYnBFa -# Khouqp9TXW1dvLZZdpHAJlsD5shsX6Mq60wARnQ4FL8qeF2wI0zsbmBI7EnkW3Wm -# cP3z1K5Vbo69BB9nPRn9MXKClKFzsS688BzU2+8huMaptMbCRgcumcw+IQvDLkjf -# DGp1xTWO11mcqztIfp6y4PxUlt4TRzlC0G7WS/2/DKTwC+X66MiIi+6c+3XhxEvo -# yw5kzlfeYKh6Ss5lHLhlliNiO38FT1lm3ekN1fh8vsBM3nsKlhvMVTkEbwYIQTi7 -# 9RnftXoEdwUc4uyMx/Gxml5HbsyyHqPalniB7vAHmIBRvroKFB5+njpZJKFXcwz+ -# QUROlsJUUQ+pxQIDAQABo4IBGzCCARcwHQYDVR0OBBYEFLyGCMpbalrK5L3My4K0 -# FUjqh+WhMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRP -# ME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 -# Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEww -# SgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv -# TWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0l -# BAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEBAH/eJCG9We+01otxylmR -# vi6oRoK7j99kHX3mKgu8KGdL/vl3v7X0TqT96EoPPmcis1aJbZcIWuwjFPV5KhNX -# jJIXnQYh6vOo6hs73NuEmkv3chX2n48nqP+l4tYgiZVNQKkVYF65lwHXMAv/Qmpr -# VtnsWlw2A4DMFi1qwbkzZE/bXmt/2G/AroGlOO06zl1yGoxMFctfk4yy3aoALeP9 -# ZCipqb4QHf4V3CePH46kA+qON9sEJVMf4TJ69zsikMzcKg3BXoYJ1T5W76sloHrL -# MkBY9r0JW7bJ/3tHeXSGpYad2CINV17hqA3GJk4C9v069gGs95e8uZEOYdud0++m -# NmmhggN2MIICXgIBATCB46GBuaSBtjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgT -# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m -# dCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBE -# U0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T -# dGFtcCBTZXJ2aWNloiUKAQEwCQYFKw4DAhoFAAMVABgNrLOMaDCz+HQZsnjOgCs1 -# Lwj6oIHCMIG/pIG8MIG5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv -# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 -# aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIE5UUyBFU046NTdG -# Ni1DMUUwLTU1NEMxKzApBgNVBAMTIk1pY3Jvc29mdCBUaW1lIFNvdXJjZSBNYXN0 -# ZXIgQ2xvY2swDQYJKoZIhvcNAQEFBQACBQDdG19/MCIYDzIwMTcwNzIwMTY1NzM1 -# WhgPMjAxNzA3MjExNjU3MzVaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAN0bX38C -# AQAwBwIBAAICAMEwBwIBAAICGvIwCgIFAN0csP8CAQAwNgYKKwYBBAGEWQoEAjEo -# MCYwDAYKKwYBBAGEWQoDAaAKMAgCAQACAxbjYKEKMAgCAQACAwehIDANBgkqhkiG -# 9w0BAQUFAAOCAQEAIWqW45RvFXwjBVSrRXQeFN9MB35hIxT4uUMbWQqFQLbVXgIz -# lvDhnoXmN+Af/yyC4yWrfIPdy5Vk0EjhwQtfUBhrN54bo7dyVYaY3mL+PJQja8kT -# by1YEgYt68kHiARuHi7uFzWOoJbd6FSqlZDGhPnYZo+fVq4Y3bttuMmSeR8L9BWB -# HFBhX45zzmmacUhN3Nm2J9gZ8ed6KA2U5VJFVDkcVzn63KJtlr+POymNVMgtOts1 -# vq05uRjj9Q9k069YY/GuObtIpPrz36w2h8vhO5Qfpx6ZG04l3uou7E6i7Gl+jXcd -# VkWTutSe2NQyhaqkChfdD8SMCwkA9TeThzFv5jGCAvUwggLxAgEBMIGTMHwxCzAJ -# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k -# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv -# c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAnSCcVndV1CiaAAAAAACdMA0G -# CWCGSAFlAwQCAQUAoIIBMjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ -# KoZIhvcNAQkEMSIEIGQXuTrJKWTDGJqlJk7ANUAEMoswJGjPpK2ahEqAgccVMIHi -# BgsqhkiG9w0BCRACDDGB0jCBzzCBzDCBsQQUGA2ss4xoMLP4dBmyeM6AKzUvCPow -# gZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw -# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAJ0gnFZ3 -# VdQomgAAAAAAnTAWBBRNDOnnwrJaeTO4MiBDM6JW8L7EUTANBgkqhkiG9w0BAQsF -# AASCAQA7G6QRJ53LBnJ6uVwFfelQ9mKLYALTsZ7lB7R2PZ66nT4tePiI4UTtKkKv -# v9poY68a6QLoT5IA2HTYcFSjBK2aYpw0uGG8JJPTGdu8BYawTeXEIvSI6rGXAXTW -# 3enCkwBxl08u8oGFje3vP34DQXVMUWYD2HU58Z+aV4gDbF97gAGz5BkwzixG7IcD -# BdzPaVtWZkGS5ww1d0Hh+NyVFPiIaBGkuz9PbrbfNK4uPFwoeXzdXbbCTX5N1mOW -# 5pDO39vyzcqITMBeZ6ogkGjm5NIKjGMA1gl+kHT23iNtXHYJFK+df2r5o/wmytP8 -# GU3tn8zSkac5pn6bu8Gl1M3ndtx5 -# SIG # End signature block diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 deleted file mode 100644 index c30a3d93..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 deleted file mode 100644 index e1f88020..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 deleted file mode 100644 index 4f7fae23..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 deleted file mode 100644 index a990b390..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 deleted file mode 100644 index d42629f5..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 deleted file mode 100644 index bda59582..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744b984..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 deleted file mode 100644 index 1ef787c8..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 deleted file mode 100644 index cb5f65d1..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 deleted file mode 100644 index 21b785eb..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 deleted file mode 100644 index 71d22424..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 deleted file mode 100644 index 4b574d68..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744c26a..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/KiwixWebApp_0.9.93.0_AnyCPU.appxbundle b/AppPackages/KiwixWebApp_0.9.93.0_Test/KiwixWebApp_0.9.93.0_AnyCPU.appxbundle deleted file mode 100644 index a1f51acd..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/KiwixWebApp_0.9.93.0_AnyCPU.appxbundle and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.93.0_Test/KiwixWebApp_0.9.93.0_AnyCPU.cer b/AppPackages/KiwixWebApp_0.9.93.0_Test/KiwixWebApp_0.9.93.0_AnyCPU.cer deleted file mode 100644 index 20a5b8a4..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.93.0_Test/KiwixWebApp_0.9.93.0_AnyCPU.cer and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_AnyCPU_bundle.appxupload b/AppPackages/KiwixWebApp_0.9.94.0_AnyCPU_bundle.appxupload deleted file mode 100644 index 8aed34b3..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_AnyCPU_bundle.appxupload and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.ps1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.ps1 deleted file mode 100644 index 2467ff4f..00000000 --- a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.ps1 +++ /dev/null @@ -1,750 +0,0 @@ -# -# Add-AppxDevPackage.ps1 is a PowerShell script designed to install app -# packages created by Visual Studio for developers. To run this script from -# Explorer, right-click on its icon and choose "Run with PowerShell". -# -# Visual Studio supplies this script in the folder generated with its -# "Prepare Package" command. The same folder will also contain the app -# package (a .appx file), the signing certificate (a .cer file), and a -# "Dependencies" subfolder containing all the framework packages used by the -# app. -# -# This script simplifies installing these packages by automating the -# following functions: -# 1. Find the app package and signing certificate in the script directory -# 2. Prompt the user to acquire a developer license and to install the -# certificate if necessary -# 3. Find dependency packages that are applicable to the operating system's -# CPU architecture -# 4. Install the package along with all applicable dependencies -# -# All command line parameters are reserved for use internally by the script. -# Users should launch this script from Explorer. -# - -# .Link -# http://go.microsoft.com/fwlink/?LinkId=243053 - -param( - [switch]$Force = $false, - [switch]$GetDeveloperLicense = $false, - [string]$CertificatePath = $null -) - -$ErrorActionPreference = "Stop" - -# The language resources for this script are placed in the -# "Add-AppDevPackage.resources" subfolder alongside the script. Since the -# current working directory might not be the directory that contains the -# script, we need to create the full path of the resources directory to -# pass into Import-LocalizedData -$ScriptPath = $null -try -{ - $ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path - $ScriptDir = Split-Path -Parent $ScriptPath -} -catch {} - -if (!$ScriptPath) -{ - PrintMessageAndExit $UiStrings.ErrorNoScriptPath $ErrorCodes.NoScriptPath -} - -$LocalizedResourcePath = Join-Path $ScriptDir "Add-AppDevPackage.resources" -Import-LocalizedData -BindingVariable UiStrings -BaseDirectory $LocalizedResourcePath - -$ErrorCodes = Data { - ConvertFrom-StringData @' - Success = 0 - NoScriptPath = 1 - NoPackageFound = 2 - ManyPackagesFound = 3 - NoCertificateFound = 4 - ManyCertificatesFound = 5 - BadCertificate = 6 - PackageUnsigned = 7 - CertificateMismatch = 8 - ForceElevate = 9 - LaunchAdminFailed = 10 - GetDeveloperLicenseFailed = 11 - InstallCertificateFailed = 12 - AddPackageFailed = 13 - ForceDeveloperLicense = 14 - CertUtilInstallFailed = 17 - CertIsCA = 18 - BannedEKU = 19 - NoBasicConstraints = 20 - NoCodeSigningEku = 21 - InstallCertificateCancelled = 22 - BannedKeyUsage = 23 - ExpiredCertificate = 24 -'@ -} - -function PrintMessageAndExit($ErrorMessage, $ReturnCode) -{ - Write-Host $ErrorMessage - if (!$Force) - { - Pause - } - exit $ReturnCode -} - -# -# Warns the user about installing certificates, and presents a Yes/No prompt -# to confirm the action. The default is set to No. -# -function ConfirmCertificateInstall -{ - $Answer = $host.UI.PromptForChoice( - "", - $UiStrings.WarningInstallCert, - [System.Management.Automation.Host.ChoiceDescription[]]@($UiStrings.PromptYesString, $UiStrings.PromptNoString), - 1) - - return $Answer -eq 0 -} - -# -# Validates whether a file is a valid certificate using CertUtil. -# This needs to be done before calling Get-PfxCertificate on the file, otherwise -# the user will get a cryptic "Password: " prompt for invalid certs. -# -function ValidateCertificateFormat($FilePath) -{ - # certutil -verify prints a lot of text that we don't need, so it's redirected to $null here - certutil.exe -verify $FilePath > $null - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorBadCertificate -f $FilePath, $LastExitCode) $ErrorCodes.BadCertificate - } - - # Check if certificate is expired - $cert = Get-PfxCertificate $FilePath - if (($cert.NotBefore -gt (Get-Date)) -or ($cert.NotAfter -lt (Get-Date))) - { - PrintMessageAndExit ($UiStrings.ErrorExpiredCertificate -f $FilePath) $ErrorCodes.ExpiredCertificate - } -} - -# -# Verify that the developer certificate meets the following restrictions: -# - The certificate must contain a Basic Constraints extension, and its -# Certificate Authority (CA) property must be false. -# - The certificate's Key Usage extension must be either absent, or set to -# only DigitalSignature. -# - The certificate must contain an Extended Key Usage (EKU) extension with -# Code Signing usage. -# - The certificate must NOT contain any other EKU except Code Signing and -# Lifetime Signing. -# -# These restrictions are enforced to decrease security risks that arise from -# trusting digital certificates. -# -function CheckCertificateRestrictions -{ - Set-Variable -Name BasicConstraintsExtensionOid -Value "2.5.29.19" -Option Constant - Set-Variable -Name KeyUsageExtensionOid -Value "2.5.29.15" -Option Constant - Set-Variable -Name EkuExtensionOid -Value "2.5.29.37" -Option Constant - Set-Variable -Name CodeSigningEkuOid -Value "1.3.6.1.5.5.7.3.3" -Option Constant - Set-Variable -Name LifetimeSigningEkuOid -Value "1.3.6.1.4.1.311.10.3.13" -Option Constant - - $CertificateExtensions = (Get-PfxCertificate $CertificatePath).Extensions - $HasBasicConstraints = $false - $HasCodeSigningEku = $false - - foreach ($Extension in $CertificateExtensions) - { - # Certificate must contain the Basic Constraints extension - if ($Extension.oid.value -eq $BasicConstraintsExtensionOid) - { - # CA property must be false - if ($Extension.CertificateAuthority) - { - PrintMessageAndExit $UiStrings.ErrorCertIsCA $ErrorCodes.CertIsCA - } - $HasBasicConstraints = $true - } - - # If key usage is present, it must be set to digital signature - elseif ($Extension.oid.value -eq $KeyUsageExtensionOid) - { - if ($Extension.KeyUsages -ne "DigitalSignature") - { - PrintMessageAndExit ($UiStrings.ErrorBannedKeyUsage -f $Extension.KeyUsages) $ErrorCodes.BannedKeyUsage - } - } - - elseif ($Extension.oid.value -eq $EkuExtensionOid) - { - # Certificate must contain the Code Signing EKU - $EKUs = $Extension.EnhancedKeyUsages.Value - if ($EKUs -contains $CodeSigningEkuOid) - { - $HasCodeSigningEKU = $True - } - - # EKUs other than code signing and lifetime signing are not allowed - foreach ($EKU in $EKUs) - { - if ($EKU -ne $CodeSigningEkuOid -and $EKU -ne $LifetimeSigningEkuOid) - { - PrintMessageAndExit ($UiStrings.ErrorBannedEKU -f $EKU) $ErrorCodes.BannedEKU - } - } - } - } - - if (!$HasBasicConstraints) - { - PrintMessageAndExit $UiStrings.ErrorNoBasicConstraints $ErrorCodes.NoBasicConstraints - } - if (!$HasCodeSigningEKU) - { - PrintMessageAndExit $UiStrings.ErrorNoCodeSigningEku $ErrorCodes.NoCodeSigningEku - } -} - -# -# Performs operations that require administrative privileges: -# - Prompt the user to obtain a developer license -# - Install the developer certificate (if -Force is not specified, also prompts the user to confirm) -# -function DoElevatedOperations -{ - if ($GetDeveloperLicense) - { - Write-Host $UiStrings.GettingDeveloperLicense - - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - try - { - Show-WindowsDeveloperLicenseRegistration - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - } - - if ($CertificatePath) - { - Write-Host $UiStrings.InstallingCertificate - - # Make sure certificate format is valid and usage constraints are followed - ValidateCertificateFormat $CertificatePath - CheckCertificateRestrictions - - # If -Force is not specified, warn the user and get consent - if ($Force -or (ConfirmCertificateInstall)) - { - # Add cert to store - certutil.exe -addstore TrustedPeople $CertificatePath - if ($LastExitCode -lt 0) - { - PrintMessageAndExit ($UiStrings.ErrorCertUtilInstallFailed -f $LastExitCode) $ErrorCodes.CertUtilInstallFailed - } - } - else - { - PrintMessageAndExit $UiStrings.ErrorInstallCertificateCancelled $ErrorCodes.InstallCertificateCancelled - } - } -} - -# -# Checks whether the machine is missing a valid developer license. -# -function CheckIfNeedDeveloperLicense -{ - $Result = $true - try - { - $Result = (Get-WindowsDeveloperLicense | Where-Object { $_.IsValid } | Measure-Object).Count -eq 0 - } - catch {} - - return $Result -} - -# -# Launches an elevated process running the current script to perform tasks -# that require administrative privileges. This function waits until the -# elevated process terminates, and checks whether those tasks were successful. -# -function LaunchElevated -{ - # Set up command line arguments to the elevated process - $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"' - - if ($Force) - { - $RelaunchArgs += ' -Force' - } - if ($NeedDeveloperLicense) - { - $RelaunchArgs += ' -GetDeveloperLicense' - } - if ($NeedInstallCertificate) - { - $RelaunchArgs += ' -CertificatePath "' + $DeveloperCertificatePath.FullName + '"' - } - - # Launch the process and wait for it to finish - try - { - $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru - } - catch - { - $Error[0] # Dump details about the last error - PrintMessageAndExit $UiStrings.ErrorLaunchAdminFailed $ErrorCodes.LaunchAdminFailed - } - - while (!($AdminProcess.HasExited)) - { - Start-Sleep -Seconds 2 - } - - # Check if all elevated operations were successful - if ($NeedDeveloperLicense) - { - if (CheckIfNeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed - } - else - { - Write-Host $UiStrings.AcquireLicenseSuccessful - } - } - if ($NeedInstallCertificate) - { - $Signature = Get-AuthenticodeSignature $DeveloperPackagePath -Verbose - if ($Signature.Status -ne "Valid") - { - PrintMessageAndExit ($UiStrings.ErrorInstallCertificateFailed -f $Signature.Status) $ErrorCodes.InstallCertificateFailed - } - else - { - Write-Host $UiStrings.InstallCertificateSuccessful - } - } -} - -# -# Finds all applicable dependency packages according to OS architecture, and -# installs the developer package with its dependencies. The expected layout -# of dependencies is: -# -# -# \Dependencies -# .appx -# \x86 -# .appx -# \x64 -# .appx -# \arm -# .appx -# -function InstallPackageWithDependencies -{ - $DependencyPackagesDir = (Join-Path $ScriptDir "Dependencies") - $DependencyPackages = @() - if (Test-Path $DependencyPackagesDir) - { - # Get architecture-neutral dependencies - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - - # Get architecture-specific dependencies - if (($Env:Processor_Architecture -eq "x86" -or $Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x86"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x86\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x64"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x64\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - if (($Env:Processor_Architecture -eq "arm") -and (Test-Path (Join-Path $DependencyPackagesDir "arm"))) - { - $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "arm\*.appx") | Where-Object { $_.Mode -NotMatch "d" } - } - } - Write-Host $UiStrings.InstallingPackage - - $AddPackageSucceeded = $False - try - { - if ($DependencyPackages.FullName.Count -gt 0) - { - Write-Host $UiStrings.DependenciesFound - $DependencyPackages.FullName - Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath $DependencyPackages.FullName -ForceApplicationShutdown - } - else - { - Add-AppxPackage -Path $DeveloperPackagePath.FullName -ForceApplicationShutdown - } - $AddPackageSucceeded = $? - } - catch - { - $Error[0] # Dump details about the last error - } - - if (!$AddPackageSucceeded) - { - if ($NeedInstallCertificate) - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailedWithCert $ErrorCodes.AddPackageFailed - } - else - { - PrintMessageAndExit $UiStrings.ErrorAddPackageFailed $ErrorCodes.AddPackageFailed - } - } -} - -# -# Main script logic when the user launches the script without parameters. -# -function DoStandardOperations -{ - # List all .appx files in the script directory - $PackagePath = Get-ChildItem (Join-Path $ScriptDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } - $PackageCount = ($PackagePath | Measure-Object).Count - - # List all .appxbundle files in the script directory - $BundlePath = Get-ChildItem (Join-Path $ScriptDir "*.appxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $BundleCount = ($BundlePath | Measure-Object).Count - - # List all .eappx files in the script directory - $EncryptedPackagePath = Get-ChildItem (Join-Path $ScriptDir "*.eappx") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedPackageCount = ($EncryptedPackagePath | Measure-Object).Count - - # List all .eappxbundle files in the script directory - $EncryptedBundlePath = Get-ChildItem (Join-Path $ScriptDir "*.eappxbundle") | Where-Object { $_.Mode -NotMatch "d" } - $EncryptedBundleCount = ($EncryptedBundlePath | Measure-Object).Count - - $NumberOfPackagesAndBundles = $PackageCount + $BundleCount + $EncryptedPackageCount + $EncryptedBundleCount - - # There must be exactly 1 package/bundle - if ($NumberOfPackagesAndBundles -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoPackageFound $ErrorCodes.NoPackageFound - } - elseif ($NumberOfPackagesAndBundles -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyPackagesFound $ErrorCodes.ManyPackagesFound - } - - if ($PackageCount -eq 1) - { - $DeveloperPackagePath = $PackagePath - Write-Host ($UiStrings.PackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($BundleCount -eq 1) - { - $DeveloperPackagePath = $BundlePath - Write-Host ($UiStrings.BundleFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedPackageCount -eq 1) - { - $DeveloperPackagePath = $EncryptedPackagePath - Write-Host ($UiStrings.EncryptedPackageFound -f $DeveloperPackagePath.FullName) - } - elseif ($EncryptedBundleCount -eq 1) - { - $DeveloperPackagePath = $EncryptedBundlePath - Write-Host ($UiStrings.EncryptedBundleFound -f $DeveloperPackagePath.FullName) - } - - # The package must be signed - $PackageSignature = Get-AuthenticodeSignature $DeveloperPackagePath - $PackageCertificate = $PackageSignature.SignerCertificate - if (!$PackageCertificate) - { - PrintMessageAndExit $UiStrings.ErrorPackageUnsigned $ErrorCodes.PackageUnsigned - } - - # Test if the package signature is trusted. If not, the corresponding certificate - # needs to be present in the current directory and needs to be installed. - $NeedInstallCertificate = ($PackageSignature.Status -ne "Valid") - - if ($NeedInstallCertificate) - { - # List all .cer files in the script directory - $DeveloperCertificatePath = Get-ChildItem (Join-Path $ScriptDir "*.cer") | Where-Object { $_.Mode -NotMatch "d" } - $DeveloperCertificateCount = ($DeveloperCertificatePath | Measure-Object).Count - - # There must be exactly 1 certificate - if ($DeveloperCertificateCount -lt 1) - { - PrintMessageAndExit $UiStrings.ErrorNoCertificateFound $ErrorCodes.NoCertificateFound - } - elseif ($DeveloperCertificateCount -gt 1) - { - PrintMessageAndExit $UiStrings.ErrorManyCertificatesFound $ErrorCodes.ManyCertificatesFound - } - - Write-Host ($UiStrings.CertificateFound -f $DeveloperCertificatePath.FullName) - - # The .cer file must have the format of a valid certificate - ValidateCertificateFormat $DeveloperCertificatePath - - # The package signature must match the certificate file - if ($PackageCertificate -ne (Get-PfxCertificate $DeveloperCertificatePath)) - { - PrintMessageAndExit $UiStrings.ErrorCertificateMismatch $ErrorCodes.CertificateMismatch - } - } - - $NeedDeveloperLicense = CheckIfNeedDeveloperLicense - - # Relaunch the script elevated with the necessary parameters if needed - if ($NeedDeveloperLicense -or $NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActions - if ($NeedDeveloperLicense) - { - Write-Host $UiStrings.ElevateActionDevLicense - } - if ($NeedInstallCertificate) - { - Write-Host $UiStrings.ElevateActionCertificate - } - - $IsAlreadyElevated = ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544") - if ($IsAlreadyElevated) - { - if ($Force -and $NeedDeveloperLicense) - { - PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense - } - if ($Force -and $NeedInstallCertificate) - { - Write-Warning $UiStrings.WarningInstallCert - } - } - else - { - if ($Force) - { - PrintMessageAndExit $UiStrings.ErrorForceElevate $ErrorCodes.ForceElevate - } - else - { - Write-Host $UiStrings.ElevateActionsContinue - Pause - } - } - - LaunchElevated - } - - InstallPackageWithDependencies -} - -# -# Main script entry point -# -if ($GetDeveloperLicense -or $CertificatePath) -{ - DoElevatedOperations -} -else -{ - DoStandardOperations - PrintMessageAndExit $UiStrings.Success $ErrorCodes.Success -} - -# SIG # Begin signature block -# MIIiAQYJKoZIhvcNAQcCoIIh8jCCIe4CAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAnYmBUpv/sjF9s -# UpSJeaz8bsgho4m0HYf/wsPXcJL9raCCC4QwggUMMIID9KADAgECAhMzAAABT+fG -# YslG9Kl/AAAAAAFPMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD -# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy -# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p -# bmcgUENBIDIwMTAwHhcNMTYxMTE3MjE1OTE0WhcNMTgwMjE3MjE1OTE0WjCBgzEL -# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v -# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q -# UjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEAtImQinYMrMU9obyB6NdQCLtaaaeux8y4W704DyFR -# Rggj0b0imXO3KO/3B6sr+Uj3pRQFqU0kG21hlpyDnTPALHmZ8F3z7NVE36XNWfp2 -# rQY/xkoD5uotlBDCZm/9YtBQitEikSOXZTShxJoCXpLiuHwoeMJe40b3yu84V4is -# VgZYypgbx6jXXjaumkUw47a3PRjCpyeweU1T2DLmdqNQKvY/urtBHiSGTZibep72 -# LOK8kGBl+5Zp+uATaOKJKi51GJ3Cbbgh9JleKn8xoKcNzO9PEW7+SUJOYd43yyue -# QO/Oq15wCHOlcnu3Rs5bMlNdijlRb7DXqHjdoyhvXu5CHwIDAQABo4IBezCCAXcw -# HwYDVR0lBBgwFgYKKwYBBAGCNz0GAQYIKwYBBQUHAwMwHQYDVR0OBBYEFJIOoRFx -# ti9VDcMP9MlcdC5aDGq/MFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQLEwRNT1BSMTQw -# MgYDVQQFEysyMzA4NjUrYjRiMTI4NzgtZTI5My00M2U5LWIyMWUtN2QzMDcxOWQ0 -# NTJmMB8GA1UdIwQYMBaAFOb8X3u7IgBY5HJOtfQhdCMy5u+sMFYGA1UdHwRPME0w -# S6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz -# L01pY0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNybDBaBggrBgEFBQcBAQROMEwwSgYI -# KwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWlj -# Q29kU2lnUENBXzIwMTAtMDctMDYuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN -# AQELBQADggEBABHAuWpDNf6FsTiADbh0dSyNcUm4PEHtLb3iBjaQdiuJ5baB6Ybj -# GIyWkzJCp6f2tzQlOdDGekPq23dwzNTpQuuoxVUCdXie2BC+BxvKlGP7PA9x7tRV -# Z9cp9mq/B7zlj4Lq+KHiczM/FJJeobplVzdFhYBc1izGizxqh6MHEcvs2XE4IDUk -# PVS9zFWJ9HcQm+WZqg+uxjyOn9oAT8994bPAIPdSMfciSNVhjX8mAhl9g8xhkyrd -# uNziCLOn3+EEd2DI9Kw1yzHlbHVRxTd7E2pOlWuPQJ7ITT6uvVnFINbCeK23ZFs7 -# 0MAVcDQU5cWephzH9P/2y0jB4o3zbs6qtKAwggZwMIIEWKADAgECAgphDFJMAAAA -# AAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz -# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv -# cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB -# dXRob3JpdHkgMjAxMDAeFw0xMDA3MDYyMDQwMTdaFw0yNTA3MDYyMDUwMTdaMH4x -# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt -# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p -# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUA -# A4IBDwAwggEKAoIBAQDpDmRQeWe1xOP9CQBMnpSs91Zo6kTYz8VYT6mldnxtRbrT -# OZK0pB75+WWC5BfSj/1EnAjoZZPOLFWEv30I4y4rqEErGLeiS25JTGsVB97R0sKJ -# HnGUzbV/S7SvCNjMiNZrF5Q6k84mP+zm/jSYV9UdXUn2siou1YW7WT/4kLQrg3TK -# K7M7RuPwRknBF2ZUyRy9HcRVYldy+Ge5JSA03l2mpZVeqyiAzdWynuUDtWPTshTI -# wciKJgpZfwfs/w7tgBI1TBKmvlJb9aba4IsLSHfWhUfVELnG6Krui2otBVxgxrQq -# W5wjHF9F4xoUHm83yxkzgGqJTaNqZmN4k9Uwz5UfAgMBAAGjggHjMIIB3zAQBgkr -# BgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU5vxfe7siAFjkck619CF0IzLm76wwGQYJ -# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -# MAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8w -# TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj -# dHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBK -# BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N -# aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgZ0GA1UdIASBlTCBkjCBjwYJKwYB -# BAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v -# UEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBn -# AGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqG -# SIb3DQEBCwUAA4ICAQAadO9XTyl7xBaFeLhQ0yL8CZ2sgpf4NP8qLJeVEuXkv8+/ -# k8jjNKnbgbjcHgC+0jVvr+V/eZV35QLU8evYzU4eG2GiwlojGvCMqGJRRWcI4z88 -# HpP4MIUXyDlAptcOsyEp5aWhaYwik8x0mOehR0PyU6zADzBpf/7SJSBtb2HT3wfV -# 2XIALGmGdj1R26Y5SMk3YW0H3VMZy6fWYcK/4oOrD+Brm5XWfShRsIlKUaSabMi3 -# H0oaDmmp19zBftFJcKq2rbtyR2MX+qbWoqaG7KgQRJtjtrJpiQbHRoZ6GD/oxR0h -# 1Xv5AiMtxUHLvx1MyBbvsZx//CJLSYpuFeOmf3Zb0VN5kYWd1dLbPXM18zyuVLJS -# R2rAqhOV0o4R2plnXjKM+zeF0dx1hZyHxlpXhcK/3Q2PjJst67TuzyfTtV5p+qQW -# BAGnJGdzz01Ptt4FVpd69+lSTfR3BU+FxtgL8Y7tQgnRDXbjI1Z4IiY2vsqxjG6q -# HeSF2kczYo+kyZEzX3EeQK+YZcki6EIhJYocLWDZN4lBiSoWD9dhPJRoYFLv1keZ -# oIBA7hWBdz6c4FMYGlAdOJWbHmYzEyc5F3iHNs5Ow1+y9T1HU7bg5dsLYT0q15Is -# zjdaPkBCMaQfEAjCVpy/JF1RAp1qedIX09rBlI4HeyVxRKsGaubUxt8jmpZ1xTGC -# FdMwghXPAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u -# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp -# b24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTACEzMA -# AAFP58ZiyUb0qX8AAAAAAU8wDQYJYIZIAWUDBAIBBQCggcIwGQYJKoZIhvcNAQkD -# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ -# KoZIhvcNAQkEMSIEIM6sGgl9EI3BKHGPaKRgrF1O/bVv8y7tQZuqLVzy8rFiMFYG -# CisGAQQBgjcCAQwxSDBGoCyAKgBBAGQAZAAtAEEAcABwAEQAZQB2AFAAYQBjAGsA -# YQBnAGUALgBwAHMAMaEWgBRodHRwOi8vbWljcm9zb2Z0LmNvbTANBgkqhkiG9w0B -# AQEFAASCAQB+h3AYSy8MV5bb3ZfjI9xGXZgMGVKhmRo9yYG3wIelD9RULoRtCN4J -# ScCz++xjjxhUEdJ57ZeRdobQGnjEKyepHccHJsnxiFXUqd8gHWN56LxVKXLK6lgH -# RnSmMm63Z/s6/qA7XdgHKjUGqG0MsZgFiX0DBfVQUQnPPPgkicc2xwWI1G4ZTDVn -# Qoi9zUNb1bvJJhcN1BlPcvKVrVOqBLLfsSDsYGMmLcrh0v9QkMPBefLexqGxoibs -# fvzJiwiCSRTRiC29aUrAP3s6EazYYP866d7F94qZfF5Qy8fy3RnnjErxD1PpgEVx -# EZus2pc23sNrQzNokH1A7q3beEKTKal8oYITSTCCE0UGCisGAQQBgjcDAwExghM1 -# MIITMQYJKoZIhvcNAQcCoIITIjCCEx4CAQMxDzANBglghkgBZQMEAgEFADCCATwG -# CyqGSIb3DQEJEAEEoIIBKwSCAScwggEjAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI -# AWUDBAIBBQAEIJPdm/WIYp5J5+KJJMbxhHziKQ+l8HJ9bF3jCZXkxTgaAgZZVDxZ -# MIMYEjIwMTcwNzIxMDI0NTMxLjA5WjAHAgEBgAIB9KCBuaSBtjCBszELMAkGA1UE -# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc -# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUG -# A1UECxMebkNpcGhlciBEU0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxN -# aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOzTCCBnEwggRZoAMCAQICCmEJ -# gSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI -# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv -# ZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmlj -# YXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1 -# NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT -# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE -# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEB -# AQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18 -# aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdN -# uDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NM -# ksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2K -# Qk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZ -# zTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQ -# BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUw -# GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB -# /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f -# BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv -# ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w -# TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 -# cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCB -# jwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29m -# dC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAd -# AEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAd -# MA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F -# 4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbM -# QEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mB -# ZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7ti -# X5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S -# 4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3ai -# caoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf -# 5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsb -# iSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJ -# zxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB -# 0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/e -# dIhJEjCCBNowggPCoAMCAQICEzMAAACdIJxWd1XUKJoAAAAAAJ0wDQYJKoZIhvcN -# AQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG -# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMTYwOTA3MTc1 -# NjQxWhcNMTgwOTA3MTc1NjQxWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh -# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -# b3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0Ug -# RVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt -# cCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kSYnBFa -# Khouqp9TXW1dvLZZdpHAJlsD5shsX6Mq60wARnQ4FL8qeF2wI0zsbmBI7EnkW3Wm -# cP3z1K5Vbo69BB9nPRn9MXKClKFzsS688BzU2+8huMaptMbCRgcumcw+IQvDLkjf -# DGp1xTWO11mcqztIfp6y4PxUlt4TRzlC0G7WS/2/DKTwC+X66MiIi+6c+3XhxEvo -# yw5kzlfeYKh6Ss5lHLhlliNiO38FT1lm3ekN1fh8vsBM3nsKlhvMVTkEbwYIQTi7 -# 9RnftXoEdwUc4uyMx/Gxml5HbsyyHqPalniB7vAHmIBRvroKFB5+njpZJKFXcwz+ -# QUROlsJUUQ+pxQIDAQABo4IBGzCCARcwHQYDVR0OBBYEFLyGCMpbalrK5L3My4K0 -# FUjqh+WhMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRP -# ME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 -# Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEww -# SgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv -# TWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0l -# BAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEBAH/eJCG9We+01otxylmR -# vi6oRoK7j99kHX3mKgu8KGdL/vl3v7X0TqT96EoPPmcis1aJbZcIWuwjFPV5KhNX -# jJIXnQYh6vOo6hs73NuEmkv3chX2n48nqP+l4tYgiZVNQKkVYF65lwHXMAv/Qmpr -# VtnsWlw2A4DMFi1qwbkzZE/bXmt/2G/AroGlOO06zl1yGoxMFctfk4yy3aoALeP9 -# ZCipqb4QHf4V3CePH46kA+qON9sEJVMf4TJ69zsikMzcKg3BXoYJ1T5W76sloHrL -# MkBY9r0JW7bJ/3tHeXSGpYad2CINV17hqA3GJk4C9v069gGs95e8uZEOYdud0++m -# NmmhggN2MIICXgIBATCB46GBuaSBtjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgT -# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m -# dCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBE -# U0UgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T -# dGFtcCBTZXJ2aWNloiUKAQEwCQYFKw4DAhoFAAMVABgNrLOMaDCz+HQZsnjOgCs1 -# Lwj6oIHCMIG/pIG8MIG5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv -# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 -# aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIE5UUyBFU046NTdG -# Ni1DMUUwLTU1NEMxKzApBgNVBAMTIk1pY3Jvc29mdCBUaW1lIFNvdXJjZSBNYXN0 -# ZXIgQ2xvY2swDQYJKoZIhvcNAQEFBQACBQDdG19/MCIYDzIwMTcwNzIwMTY1NzM1 -# WhgPMjAxNzA3MjExNjU3MzVaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAN0bX38C -# AQAwBwIBAAICAMEwBwIBAAICGvIwCgIFAN0csP8CAQAwNgYKKwYBBAGEWQoEAjEo -# MCYwDAYKKwYBBAGEWQoDAaAKMAgCAQACAxbjYKEKMAgCAQACAwehIDANBgkqhkiG -# 9w0BAQUFAAOCAQEAIWqW45RvFXwjBVSrRXQeFN9MB35hIxT4uUMbWQqFQLbVXgIz -# lvDhnoXmN+Af/yyC4yWrfIPdy5Vk0EjhwQtfUBhrN54bo7dyVYaY3mL+PJQja8kT -# by1YEgYt68kHiARuHi7uFzWOoJbd6FSqlZDGhPnYZo+fVq4Y3bttuMmSeR8L9BWB -# HFBhX45zzmmacUhN3Nm2J9gZ8ed6KA2U5VJFVDkcVzn63KJtlr+POymNVMgtOts1 -# vq05uRjj9Q9k069YY/GuObtIpPrz36w2h8vhO5Qfpx6ZG04l3uou7E6i7Gl+jXcd -# VkWTutSe2NQyhaqkChfdD8SMCwkA9TeThzFv5jGCAvUwggLxAgEBMIGTMHwxCzAJ -# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k -# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv -# c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAnSCcVndV1CiaAAAAAACdMA0G -# CWCGSAFlAwQCAQUAoIIBMjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ -# KoZIhvcNAQkEMSIEIGQXuTrJKWTDGJqlJk7ANUAEMoswJGjPpK2ahEqAgccVMIHi -# BgsqhkiG9w0BCRACDDGB0jCBzzCBzDCBsQQUGA2ss4xoMLP4dBmyeM6AKzUvCPow -# gZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw -# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAJ0gnFZ3 -# VdQomgAAAAAAnTAWBBRNDOnnwrJaeTO4MiBDM6JW8L7EUTANBgkqhkiG9w0BAQsF -# AASCAQA7G6QRJ53LBnJ6uVwFfelQ9mKLYALTsZ7lB7R2PZ66nT4tePiI4UTtKkKv -# v9poY68a6QLoT5IA2HTYcFSjBK2aYpw0uGG8JJPTGdu8BYawTeXEIvSI6rGXAXTW -# 3enCkwBxl08u8oGFje3vP34DQXVMUWYD2HU58Z+aV4gDbF97gAGz5BkwzixG7IcD -# BdzPaVtWZkGS5ww1d0Hh+NyVFPiIaBGkuz9PbrbfNK4uPFwoeXzdXbbCTX5N1mOW -# 5pDO39vyzcqITMBeZ6ogkGjm5NIKjGMA1gl+kHT23iNtXHYJFK+df2r5o/wmytP8 -# GU3tn8zSkac5pn6bu8Gl1M3ndtx5 -# SIG # End signature block diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 deleted file mode 100644 index c30a3d93..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 deleted file mode 100644 index e1f88020..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 deleted file mode 100644 index 89c0d417..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 deleted file mode 100644 index 4f7fae23..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 deleted file mode 100644 index a990b390..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 deleted file mode 100644 index d42629f5..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 deleted file mode 100644 index bda59582..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744b984..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 deleted file mode 100644 index 1ef787c8..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 deleted file mode 100644 index cb5f65d1..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 deleted file mode 100644 index 21b785eb..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 deleted file mode 100644 index 71d22424..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 deleted file mode 100644 index 4b574d68..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 deleted file mode 100644 index 1744c26a..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/KiwixWebApp_0.9.94.0_AnyCPU.appxbundle b/AppPackages/KiwixWebApp_0.9.94.0_Test/KiwixWebApp_0.9.94.0_AnyCPU.appxbundle deleted file mode 100644 index 16bf9d57..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/KiwixWebApp_0.9.94.0_AnyCPU.appxbundle and /dev/null differ diff --git a/AppPackages/KiwixWebApp_0.9.94.0_Test/KiwixWebApp_0.9.94.0_AnyCPU.cer b/AppPackages/KiwixWebApp_0.9.94.0_Test/KiwixWebApp_0.9.94.0_AnyCPU.cer deleted file mode 100644 index 20a5b8a4..00000000 Binary files a/AppPackages/KiwixWebApp_0.9.94.0_Test/KiwixWebApp_0.9.94.0_AnyCPU.cer and /dev/null differ diff --git a/KiwixWebApp.jsproj b/KiwixWebApp.jsproj index 22a95485..44233ac0 100644 --- a/KiwixWebApp.jsproj +++ b/KiwixWebApp.jsproj @@ -66,21 +66,7 @@ 95BFD8354C5B02AB76ED8D0DBCE7D830A871BA54 - - - - - - - - - - - - - - - + diff --git a/www/js/init.js b/www/js/init.js index 83d3f1bf..ace8b868 100644 --- a/www/js/init.js +++ b/www/js/init.js @@ -24,7 +24,7 @@ // Parameters that define overall operation of app var params = {}; -params['version'] = "0.9.9.80 Beta-dev"; //DEV: do not set this dynamically -- it is compared to the cookie "version" in order to show first-time info, and the cookie is updated in app.js +params['version'] = "0.9.9.8 Beta-dev"; //DEV: do not set this dynamically -- it is compared to the cookie "version" in order to show first-time info, and the cookie is updated in app.js params['packagedFile'] = "wikipedia_en_ray_charles_novid_2018-10.zim"; //For packaged Kiwix JS (e.g. with Wikivoyage file), set this to the filename (for split files, give the first chunk *.zimaa) and place file(s) in default storage params['fileVersion'] = "wikipedia_en_ray_charles_novid_2018-10.zim (12-Oct-2018)"; //Use generic name for actual file, and give version here params['cachedStartPage'] = false; //If you have cached the start page for quick start, give its URI here