chore: import upstream snapshot with attribution
.NET Tests / test-codebase (push) Waiting to run
Translation Validation / validate-translations (push) Waiting to run

This commit is contained in:
wehub-resource-sync
2026-07-13 13:01:52 +08:00
commit 643e9f9fcb
1003 changed files with 247032 additions and 0 deletions
+314
View File
@@ -0,0 +1,314 @@
; Modified from https://github.com/DomGries/InnoDependencyInstaller
[Code]
// types and variables
type
TDependency_Entry = record
Filename: String;
Parameters: String;
Title: String;
URL: String;
Checksum: String;
ForceSuccess: Boolean;
RestartAfter: Boolean;
end;
var
Dependency_Memo: String;
Dependency_List: array of TDependency_Entry;
Dependency_NeedRestart, Dependency_ForceX86: Boolean;
Dependency_DownloadPage: TDownloadWizardPage;
procedure Dependency_Add(const Filename, Parameters, Title, URL, Checksum: String; const ForceSuccess, RestartAfter: Boolean);
var
Dependency: TDependency_Entry;
DependencyCount: Integer;
begin
Dependency_Memo := Dependency_Memo + #13#10 + '%1' + Title;
Dependency.Filename := Filename;
Dependency.Parameters := Parameters;
Dependency.Title := Title;
if FileExists(ExpandConstant('{tmp}{\}') + Filename) then begin
Dependency.URL := '';
end else begin
Dependency.URL := URL;
end;
Dependency.Checksum := Checksum;
Dependency.ForceSuccess := ForceSuccess;
Dependency.RestartAfter := RestartAfter;
DependencyCount := GetArrayLength(Dependency_List);
SetArrayLength(Dependency_List, DependencyCount + 1);
Dependency_List[DependencyCount] := Dependency;
end;
<event('InitializeWizard')>
procedure Dependency_Internal1;
begin
Dependency_DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
end;
<event('PrepareToInstall')>
function Dependency_Internal2(var NeedsRestart: Boolean): String;
var
DependencyCount, DependencyIndex, ResultCode: Integer;
Retry: Boolean;
TempValue: String;
begin
DependencyCount := GetArrayLength(Dependency_List);
if DependencyCount > 0 then begin
Dependency_DownloadPage.Show;
for DependencyIndex := 0 to DependencyCount - 1 do begin
if Dependency_List[DependencyIndex].URL <> '' then begin
Dependency_DownloadPage.Clear;
Dependency_DownloadPage.Add(Dependency_List[DependencyIndex].URL, Dependency_List[DependencyIndex].Filename, Dependency_List[DependencyIndex].Checksum);
Retry := True;
while Retry do begin
Retry := False;
try
Dependency_DownloadPage.Download;
except
if Dependency_DownloadPage.AbortedByUser then begin
Result := Dependency_List[DependencyIndex].Title;
DependencyIndex := DependencyCount;
end else begin
case SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbError, MB_ABORTRETRYIGNORE, IDIGNORE) of
IDABORT: begin
Result := Dependency_List[DependencyIndex].Title;
DependencyIndex := DependencyCount;
end;
IDRETRY: begin
Retry := True;
end;
end;
end;
end;
end;
end;
end;
if Result = '' then begin
for DependencyIndex := 0 to DependencyCount - 1 do begin
Dependency_DownloadPage.SetText(Dependency_List[DependencyIndex].Title, '');
Dependency_DownloadPage.SetProgress(DependencyIndex + 1, DependencyCount + 1);
while True do begin
ResultCode := 0;
if ShellExec('', ExpandConstant('{tmp}{\}') + Dependency_List[DependencyIndex].Filename, Dependency_List[DependencyIndex].Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then begin
if Dependency_List[DependencyIndex].RestartAfter then begin
if DependencyIndex = DependencyCount - 1 then begin
Dependency_NeedRestart := True;
end else begin
NeedsRestart := True;
Result := Dependency_List[DependencyIndex].Title;
end;
break;
end else if (ResultCode = 0) or Dependency_List[DependencyIndex].ForceSuccess then begin // ERROR_SUCCESS (0)
break;
end else if ResultCode = 1641 then begin // ERROR_SUCCESS_REBOOT_INITIATED (1641)
NeedsRestart := True;
Result := Dependency_List[DependencyIndex].Title;
break;
end else if ResultCode = 3010 then begin // ERROR_SUCCESS_REBOOT_REQUIRED (3010)
Dependency_NeedRestart := True;
break;
end;
end;
case SuppressibleMsgBox(FmtMessage(SetupMessage(msgErrorFunctionFailed), [Dependency_List[DependencyIndex].Title, IntToStr(ResultCode)]), mbError, MB_ABORTRETRYIGNORE, IDIGNORE) of
IDABORT: begin
Result := Dependency_List[DependencyIndex].Title;
break;
end;
IDIGNORE: begin
break;
end;
end;
end;
if Result <> '' then begin
break;
end;
end;
if NeedsRestart then begin
TempValue := '"' + ExpandConstant('{srcexe}') + '" /restart=1 /LANG="' + ExpandConstant('{language}') + '" /DIR="' + WizardDirValue + '" /GROUP="' + WizardGroupValue + '" /TYPE="' + WizardSetupType(False) + '" /COMPONENTS="' + WizardSelectedComponents(False) + '" /TASKS="' + WizardSelectedTasks(False) + '"';
if WizardNoIcons then begin
TempValue := TempValue + ' /NOICONS';
end;
RegWriteStringValue(HKA, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', '{#SetupSetting("AppName")}', TempValue);
end;
end;
Dependency_DownloadPage.Hide;
end;
end;
<event('UpdateReadyMemo')>
function Dependency_Internal3(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
begin
Result := '';
if MemoUserInfoInfo <> '' then begin
Result := Result + MemoUserInfoInfo + Newline + NewLine;
end;
if MemoDirInfo <> '' then begin
Result := Result + MemoDirInfo + Newline + NewLine;
end;
if MemoTypeInfo <> '' then begin
Result := Result + MemoTypeInfo + Newline + NewLine;
end;
if MemoComponentsInfo <> '' then begin
Result := Result + MemoComponentsInfo + Newline + NewLine;
end;
if MemoGroupInfo <> '' then begin
Result := Result + MemoGroupInfo + Newline + NewLine;
end;
if MemoTasksInfo <> '' then begin
Result := Result + MemoTasksInfo;
end;
if Dependency_Memo <> '' then begin
if MemoTasksInfo = '' then begin
Result := Result + SetupMessage(msgReadyMemoTasks);
end;
Result := Result + FmtMessage(Dependency_Memo, [Space]);
end;
end;
<event('NeedRestart')>
function Dependency_Internal4: Boolean;
begin
Result := Dependency_NeedRestart;
end;
function Dependency_IsX64: Boolean;
begin
Result := not Dependency_ForceX86 and Is64BitInstallMode;
end;
function Dependency_String(const x86, x64: String): String;
begin
if Dependency_IsX64 then begin
Result := x64;
end else begin
Result := x86;
end;
end;
function Dependency_ArchSuffix: String;
begin
Result := Dependency_String('_x64', '_x64');
end;
function Dependency_ArchTitle: String;
begin
Result := Dependency_String(' (x86)', ' (x64)');
end;
function Dependency_IsNetCoreInstalled(const Version: String): Boolean;
var
ResultCode: Integer;
begin
// source code: https://github.com/dotnet/deployment-tools/tree/main/src/clickonce/native/projects/NetCoreCheck
if not FileExists(ExpandConstant('{tmp}{\}') + 'netcorecheck' + Dependency_ArchSuffix + '.exe') then begin
ExtractTemporaryFile('netcorecheck' + Dependency_ArchSuffix + '.exe');
end;
Result := ShellExec('', ExpandConstant('{tmp}{\}') + 'netcorecheck' + Dependency_ArchSuffix + '.exe', Version, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and (ResultCode = 0);
end;
function Dependency_IsVCRuntimeInstalled(const Arch: String; const Major, Minor, Bld: Cardinal): Boolean;
var
InstalledFlag, InstMajor, InstMinor, InstBld: Cardinal;
Key: String;
begin
// Canonical VC++ runtime detection per Microsoft docs:
// https://learn.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files
// The redistributable installer writes these values to both registry views,
// so a plain HKLM read is correct from Inno Setup's 32-bit process.
Key := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\' + Arch;
Result :=
RegQueryDWordValue(HKLM, Key, 'Installed', InstalledFlag) and (InstalledFlag = 1) and
RegQueryDWordValue(HKLM, Key, 'Major', InstMajor) and
RegQueryDWordValue(HKLM, Key, 'Minor', InstMinor) and
RegQueryDWordValue(HKLM, Key, 'Bld', InstBld) and
((InstMajor > Major) or
((InstMajor = Major) and (InstMinor > Minor)) or
((InstMajor = Major) and (InstMinor = Minor) and (InstBld >= Bld)));
end;
procedure Dependency_AddVC2015To2022;
var
Arch, Url: String;
MinMajor, MinMinor, MinBld: Cardinal;
begin
// https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist
MinMajor := 14;
MinMinor := 30;
MinBld := 30704;
if IsARM64 then begin
Arch := 'arm64';
Url := 'https://aka.ms/vc14/vc_redist.arm64.exe';
end else begin
Arch := 'x64';
Url := 'https://aka.ms/vc14/vc_redist.x64.exe';
end;
// Primary: registry-based detection (Microsoft's documented method, stable
// across installer builds). Fallback: MSI UpgradeCode lookup for x64 only
// (the x64 UpgradeCode {36F68A90-...} is verified; keeping a fallback helps
// on unusual install states). See issue #4596 for the regression this
// replaces, where a ProductCode was mistakenly used with IsMsiProductInstalled.
if Dependency_IsVCRuntimeInstalled(Arch, MinMajor, MinMinor, MinBld) then Exit;
if (Arch = 'x64') and IsMsiProductInstalled('{36F68A90-239C-34DF-B58C-64B30153CE35}',
PackVersionComponents(MinMajor, MinMinor, MinBld, 0)) then Exit;
Dependency_Add('vcredist2022_' + Arch + '.exe',
'/passive /norestart',
'Visual C++ 2015-2022 Redistributable (' + Arch + ')',
Url,
'', False, False);
end;
procedure Dependency_AddWebView2;
var
WebView2URL, WebView2Title: String;
begin
// https://developer.microsoft.com/en-us/microsoft-edge/webview2
if not RegValueExists(HKLM, Dependency_String('SOFTWARE', 'SOFTWARE\WOW6432Node') + '\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv') then begin
if IsARM64 then begin
WebView2URL := 'https://go.microsoft.com/fwlink/?linkid=2099616';
WebView2Title := 'WebView2 Runtime (ARM64)';
end else begin
WebView2URL := 'https://go.microsoft.com/fwlink/?linkid=2124701';
WebView2Title := 'WebView2 Runtime (x64)';
end;
Dependency_Add('MicrosoftEdgeWebview2Setup.exe',
'/silent /install',
WebView2Title,
WebView2URL,
'', False, False);
end;
end;
[Files]
#ifdef Dependency_Path_NetCoreCheck
; download netcorecheck_x64.exe: https://www.nuget.org/packages/Microsoft.NET.Tools.NETCoreCheck.x64
Source: "{#Dependency_Path_NetCoreCheck}netcorecheck_x64.exe"; Flags: dontcopy noencryption
#endif
#ifdef Dependency_Path_DirectX
Source: "{#Dependency_Path_DirectX}dxwebsetup.exe"; Flags: dontcopy noencryption
#endif
+218
View File
@@ -0,0 +1,218 @@
[CustomMessages]
; Armenian, Brazilian Portuguese, Catalan, Corsican, Czech, Danish, Dutch, Finnish, French, German, Hebrew, Icelandic, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Russian, Slovenian, Spanish, Turkish, Ukrainian
; English
InstallType=Installation type
ShCuts=Shortcuts
PortInst=Perform a portable installation
RegInst=Perform a regular installation
RegStartMmenuIcon=Create a shortcut on the Start menu
RegDesktopIcon=Create a shortcut on the Desktop
PackageBundleName=UniGetUI package bundle
; Armenian
Armenian.InstallType=Տեղադրման տեսակը
Armenian.ShCuts=Դյուրանցումներ
Armenian.PortInst=Կատարել շարժական տեղադրում
Armenian.RegInst=Կատարել սովորական տեղադրում
Armenian.RegStartMmenuIcon=Ստեղծեք դյուրանցում Start ընտրացանկում
Armenian.RegDesktopIcon=Ստեղծեք դյուրանցում աշխատասեղանի վրա
Armenian.PackageBundleName=UniGetUI փաթեթի փաթեթ
; BrazilianPortuguese
BrazilianPortuguese.InstallType=Tipo de instalação
BrazilianPortuguese.ShCuts=Atalhos
BrazilianPortuguese.PortInst=Realizar uma instalação portátil
BrazilianPortuguese.RegInst=Realizar uma instalação regular
BrazilianPortuguese.RegStartMmenuIcon=Criar um atalho no menu Iniciar
BrazilianPortuguese.RegDesktopIcon=Criar um atalho na área de trabalh
BrazilianPortuguese.PackageBundleName=Coleção de pacotes UniGetUI
; Catalan
Catalan.InstallType=Tipus d'instal·lació
Catalan.ShCuts=Dreceres
Catalan.PortInst=Feu una instal·lació portàtil
Catalan.RegInst=Feu una instal·lació regular
Catalan.RegStartMmenuIcon=Creeu una drecera al menú Inici
Catalan.RegDesktopIcon=Creeu una drecera a l'Escriptori
Catalan.PackageBundleName=Col·lecció de paquets de l'UniGetUI
; Corsican
Corsican.InstallType=Tipu d'installazione
Corsican.ShCuts=Scorciatoie
Corsican.PortInst=Eseguite una installazione portable
Corsican.RegInst=Eseguite una installazione regulare
Corsican.RegStartMmenuIcon=Create una scorciatoia nant'à u menu Start
Corsican.RegDesktopIcon=Create una scorciatoia nant'à u Desktop
Corsican.PackageBundleName=Raccolta di pacchetti UniGetUI
; Czech
Czech.InstallType=Typ instalace
Czech.ShCuts=Zkratky
Czech.PortInst=Proveďte přenosnou instalaci
Czech.RegInst=Proveďte běžnou instalaci
Czech.RegStartMmenuIcon=Vytvořte zástupce v nabídce Start
Czech.RegDesktopIcon=Vytvořte zástupce na ploše
Czech.PackageBundleName=Kolekce balíčků UniGetUI
; Danish
Danish.InstallType=Installationstype
Danish.ShCuts=Genveje
Danish.PortInst=Udfør en bærbar installation
Danish.RegInst=Udfør en almindelig installation
Danish.RegStartMmenuIcon=Opret en genvej på Start-menuen
Danish.RegDesktopIcon=Opret en genvej på skrivebordet
Danish.PackageBundleName=Samling af UniGetUI-pakker
; Dutch
Dutch.InstallType=Installatietype
Dutch.ShCuts=Snelkoppelingen
Dutch.PortInst=Voer een draagbare installatie uit
Dutch.RegInst=Voer een normale installatie uit
Dutch.RegStartMmenuIcon=Maak een snelkoppeling in het Startmenu
Dutch.RegDesktopIcon=Maak een snelkoppeling op het bureaublad
Dutch.PackageBundleName=Verzameling UniGetUI-pakketten
; Finnish
Finnish.InstallType=Asennustyyppi
Finnish.ShCuts=Oikopolut
Finnish.PortInst=Suorita kannettava asennus
Finnish.RegInst=Suorita tavallinen asennus
Finnish.RegStartMmenuIcon=Luo pikakuvake Käynnistä-valikkoon
Finnish.RegDesktopIcon=Luo pikakuvake työpöydälle
Finnish.PackageBundleName=Kokoelma UniGetUI-paketteja
; French
French.InstallType=Type d'installation
French.ShCuts=Raccourcis
French.PortInst=Effectuer une installation portable
French.RegInst=Effectuer une installation normale
French.RegStartMmenuIcon=Créer un raccourci dans le menu Démarrer
French.RegDesktopIcon=Créer un raccourci sur le bureau
French.PackageBundleName=Collection de packages UniGetUI
; German
German.InstallType=Installationstyp
German.ShCuts=Verknüpfungen
German.PortInst=Führe eine portable Installation durch
German.RegInst=Führe eine normale Installation durch
German.RegStartMmenuIcon=Erstelle eine Verknüpfung im Startmenü
German.RegDesktopIcon=Erstelle eine Verknüpfung auf dem Desktop
German.PackageBundleName=Sammlung von UniGetUI-Paketen
; Hebrew
Hebrew.InstallType=סוג התקנה
Hebrew.ShCuts=קיצורי דרך
Hebrew.PortInst=בצע התקנה ניידת
Hebrew.RegInst=בצע התקנה רגילה
Hebrew.RegStartMmenuIcon=צור קיצור דרך בתפריט התחל
Hebrew.RegDesktopIcon=צור קיצור דרך בשולחן העבודה
Hebrew.PackageBundleName=אוסף חבילות UniGetUI
; Icelandic
;Icelandic.InstallType=Uppsetningargerð
;Icelandic.ShCuts=Flýtivísar
;Icelandic.PortInst=Framkvæma færanlega uppsetningu
;Icelandic.RegInst=Framkvæma reglulega uppsetningu
;Icelandic.RegStartMmenuIcon=Búa til flýtileið á Start valmyndinni
;Icelandic.RegDesktopIcon=Búa til flýtileið á skjáborðinu
;Icelandic.PackageBundleName=Safn af UniGetUI pakka
; Italian
Italian.InstallType=Tipo di installazione
Italian.ShCuts=Collegamenti
Italian.PortInst=Esegui installazione portatile
Italian.RegInst=Esegui installazione normale
Italian.RegStartMmenuIcon=Crea una scorciatoia nel menu Start
Italian.RegDesktopIcon=Crea una scorciatoia sul Desktop
Italian.PackageBundleName=Raccolta di pacchetti UniGetUI
; Japanese
Japanese.InstallType=インストールの種類
Japanese.ShCuts=ショートカット
Japanese.PortInst=ポータブル インストールを実行する
Japanese.RegInst=通常のインストールを実行します
Japanese.RegStartMmenuIcon=スタート メニューにショートカットを作成する
Japanese.RegDesktopIcon=デスクトップにショートカットを作成する
Japanese.PackageBundleName=UniGetUI パッケージのコレクション
; Korean
Korean.InstallType=설치 유형
Korean.ShCuts=바로가기
Korean.PortInst=이동식 설치 수행
Korean.RegInst=일반 설치 수행
Korean.RegStartMmenuIcon=시작 메뉴에 바로가기 만들기
Korean.RegDesktopIcon=바탕화면에 바로가기 생성
Korean.PackageBundleName=UniGetUI 패키지 컬렉션
; Norwegian
Norwegian.InstallType=Installasjonstype
Norwegian.ShCuts=Snarveier
Norwegian.PortInst=Utfør en bærbar installasjon
Norwegian.RegInst=Utfør en vanlig installasjon
Norwegian.RegStartMmenuIcon=Lag en snarvei på Start-menyen
Norwegian.RegDesktopIcon=Lag en snarvei på skrivebordet
Norwegian.PackageBundleName=Samling av UniGetUI-pakker
; Polish
Polish.InstallType=Typ instalacji
Polish.ShCuts=Skróty
Polish.PortInst=Przeprowadź instalację przenośną
Polish.RegInst=Przeprowadź zwykłą instalację
Polish.RegStartMmenuIcon=Utwórz skrót w menu Start
Polish.RegDesktopIcon=Utwórz skrót na pulpicie
Polish.PackageBundleName=Kolekcja pakietów UniGetUI
; Portuguese
Portuguese.InstallType=Tipo de instalação
Portuguese.ShCuts=Atalhos
Portuguese.PortInst=Execute uma instalação portátil
Portuguese.RegInst=Execute uma instalação regular
Portuguese.RegStartMmenuIcon=Criar um atalho no menu Iniciar
Portuguese.RegDesktopIcon=Criar um atalho na área de trabalho
Portuguese.PackageBundleName=Coleção de pacotes UniGetUI
; Russian
Russian.InstallType=Тип установки
Russian.ShCuts=Ярлыки
Russian.PortInst=Выполнить переносную установку
Russian.RegInst=Выполнить обычную установку
Russian.RegStartMmenuIcon=Создать ярлык в меню «Пуск»
Russian.RegDesktopIcon=Создать ярлык на рабочем столе
Russian.PackageBundleName=
; Slovenian
Slovenian.InstallType=Vrsta namestitve
Slovenian.ShCuts=Bližnjice
Slovenian.PortInst=Izvedite prenosno namestitev
Slovenian.RegInst=Izvedite običajno namestitev
Slovenian.RegStartMmenuIcon=Ustvarite bližnjico v meniju Start
Slovenian.RegDesktopIcon=Ustvarite bližnjico na namizju
Slovenian.PackageBundleName=Коллекция пакетов UniGetUI
; Spanish
Spanish.InstallType=Tipo de instalación
Spanish.ShCuts=Atajos
Spanish.PortInst=Realizar una instalación portátil
Spanish.RegInst=Realizar una instalación regular
Spanish.RegStartMmenuIcon=Crear un acceso directo en el menú Inicio
Spanish.RegDesktopIcon=Crear un atajo en el escritorio
Spanish.PackageBundleName=Coleción de paquetes del UniGetUI
; Turkish
Turkish.InstallType=Yükleme türü
Turkish.ShCuts=Kısayollar
Turkish.PortInst=Taşınabilir bir kurulum gerçekleştirin
Turkish.RegInst=Normal bir kurulum gerçekleştir
Turkish.RegStartMmenuIcon=Başlat menüsünde bir kısayol oluştur
Turkish.RegDesktopIcon=Masaüstünde bir kısayol oluştur
Turkish.PackageBundleName=UniGetUI paketlerinin toplanması
; Ukrainian
Ukrainian.InstallType=Тип інсталяції
Ukrainian.ShCuts=Ярлики
Ukrainian.PortInst=Виконати переносне встановлення
Ukrainian.RegInst=Виконайте звичайну установку
Ukrainian.RegStartMmenuIcon=Створити ярлик у меню «Пуск».
Ukrainian.RegDesktopIcon=Створити ярлик на робочому столі
Ukrainian.PackageBundleName=Колекція пакетів UniGetUI
@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35303.130
MinimumVisualStudioVersion = 10.0.40219.1
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "MsiInstallerWrapper", "MsiInstallerWrapper.vdproj", "{EE7E4697-83BE-454A-8188-714D27776721}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Default = Debug|Default
Release|Default = Release|Default
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EE7E4697-83BE-454A-8188-714D27776721}.Debug|Default.ActiveCfg = Debug
{EE7E4697-83BE-454A-8188-714D27776721}.Debug|Default.Build.0 = Debug
{EE7E4697-83BE-454A-8188-714D27776721}.Release|Default.ActiveCfg = Release
{EE7E4697-83BE-454A-8188-714D27776721}.Release|Default.Build.0 = Release
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FD6F7794-50E5-477C-90BC-D877BB2CDDED}
EndGlobalSection
EndGlobal
@@ -0,0 +1,712 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:MsiInstallerWrapper"
"LanguageId" = "3:1033"
"CodePage" = "3:1252"
"UILanguageId" = "3:1033"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_A22A7552D1EC4801A0A4D984FCF18331"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Debug"
{
"DisplayName" = "8:Debug"
"IsDebugOnly" = "11:TRUE"
"IsReleaseOnly" = "11:FALSE"
"OutputFilename" = "8:UniGetUISetup.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.EdgeRuntime"
{
"Name" = "8:Edge WebView runtime"
"ProductCode" = "8:Microsoft.EdgeRuntime"
}
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Visual.C++.14.0.x64"
{
"Name" = "8:Visual C++ \"14\" Runtime Libraries (x64)"
"ProductCode" = "8:Microsoft.Visual.C++.14.0.x64"
}
}
}
}
"Release"
{
"DisplayName" = "8:Release"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:UniGetUISetup.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2"
{
"Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)"
"ProductCode" = "8:.NETFramework,Version=v4.7.2"
}
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.EdgeRuntime"
{
"Name" = "8:Edge WebView runtime"
"ProductCode" = "8:Microsoft.EdgeRuntime"
}
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Visual.C++.14.0.x64"
{
"Name" = "8:Visual C++ \"14\" Runtime Libraries (x64)"
"ProductCode" = "8:Microsoft.Visual.C++.14.0.x64"
}
}
}
}
}
"Deployable"
{
"CustomAction"
{
"{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_BF756C7619CC4B4BBFD0B9E127183C43"
{
"Name" = "8:%ProgramFiles%\\UniGetUI\\unins000.exe"
"Condition" = "8:"
"Object" = "8:_A22A7552D1EC4801A0A4D984FCF18331"
"FileType" = "3:2"
"InstallAction" = "3:4"
"Arguments" = "8:"
"EntryPoint" = "8:"
"Sequence" = "3:1"
"Identifier" = "8:_F4F70591_F141_4E92_8171_63B1F09EEAE9"
"InstallerClass" = "11:FALSE"
"CustomActionData" = "8:"
}
"{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_D68AA58489F8420F9DFCC894A884B2A9"
{
"Name" = "8:UniGetUI Installer.exe"
"Condition" = "8: "
"Object" = "8:_A22A7552D1EC4801A0A4D984FCF18331"
"FileType" = "3:2"
"InstallAction" = "3:1"
"Arguments" = "8:/NoAutoStart /ALLUSERS /silent /unattended /NoVCRedist /NoEdgeWebView /NoRestart"
"EntryPoint" = "8:"
"Sequence" = "3:1"
"Identifier" = "8:_AB502465_2086_4B1B_B987_3CD03317278A"
"InstallerClass" = "11:FALSE"
"CustomActionData" = "8:"
"Run64Bit" = "11:FALSE"
}
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
}
}
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A22A7552D1EC4801A0A4D984FCF18331"
{
"SourcePath" = "8:UniGetUI Installer.exe"
"TargetName" = "8:UniGetUI Installer.exe"
"Tag" = "8:"
"Folder" = "8:_B08F8663334547FDBF4D0DC7F957E164"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
}
"Folder"
{
"{1525181F-901A-416C-8A58-119130FE478E}:_545FB00BD1854FA8BAF4F057F086F631"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_A6825CAB25F84B15A64AE00EFD72194C"
{
"DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_AA2E6321A69F4A7F974C661BCDEE307F"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{994432C3-9487-495D-8656-3E829A8DBDDE}:_B08F8663334547FDBF4D0DC7F957E164"
{
"DefaultLocation" = "8:[WindowsFolder]\\Temp"
"Name" = "8:Temp"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:NEWPROPERTY1"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1033"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:UniGetUI"
"ProductCode" = "8:{4896DCDD-E250-45EE-814B-0A6591D1AC00}"
"PackageCode" = "8:{03CA204E-D817-4486-B0C3-C2A31BD2EBA1}"
"UpgradeCode" = "8:{AA73EEF1-B0C1-4CDD-AA20-97C49E1085DA}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:FALSE"
"DetectNewerInstalledVersion" = "11:FALSE"
"InstallAllUsers" = "11:TRUE"
"ProductVersion" = "8:0.0.0"
"Manufacturer" = "8:Martí Climent"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:UniGetUI"
"Subject" = "8:"
"ARPCONTACT" = "8:Martí Climent"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:"
"ARPURLINFOABOUT" = "8:"
"ARPPRODUCTICON" = "8:"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:1"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
}
}
"HKCU"
{
"Keys"
{
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
}
"UserInterface"
{
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_3A17EDF809CC4B78986B2FE6EA70BE3E"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_3D5999E6267F4C0298B4BCDE7D5F60A6"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_4DFD809C69BF4C59A6FD3BA01B0D95DA"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1647D66DC7EA4BC4BE95CB839077FD2B"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4452C40CD596425EAB25E35D2B22C4CF"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_56CAF5E0DFAE4764ACD49E3FD559D429"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5D2ED95DF08B4D95A7EB3239A89BF4C6"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D56A5E75F9834D60948B9D0DD86D2299"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6EF9716EF936459ABC8F22F995A5CF35"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2C4A093A2457487DBD623967D4706C28"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_DAA1A949544C4A96986254FF87C0D0D7"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_597DC589900D4E32B4D7BCB6B9B64387"
{
"Sequence" = "3:100"
"DisplayName" = "8:Progress"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F8B322222EFF4C19B40AB77367AC4879"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6BB46602C9BA410C932C78D7334D7518"
{
"Sequence" = "3:100"
"DisplayName" = "8:Finished"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F90FA3407D9843D38E8B11EAEC8F1DF9"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_23F910A18BC2402DAFED0320959F69C5"
{
"Sequence" = "3:100"
"DisplayName" = "8:Welcome"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_285DD2DB675346BEA1981B59FCF526E7"
{
"Sequence" = "3:300"
"DisplayName" = "8:Confirm Installation"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9E00460782B64434AB9AE5C2FDF5F039"
{
"Sequence" = "3:200"
"DisplayName" = "8:Installation Folder"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:0"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
}
}
}
+20
View File
@@ -0,0 +1,20 @@
# How to create a MSI Installer for UniGetUI
Sometimes, when deploying software through GPO, msi installers are required. However, UniGetUI does not offer such installers by default.
In order to obtain a .msi installer, the following guide must be followed.
> [!Warning]
> When using MSI Installers, required dependencies will not be installed automatically. The deployer will need to ensure that the following requirements are met on target machines:
> - Microsoft Visual C++ Redistriutable 2015-2022 (x64)
> - Microsoft Edge WebView Runtime (x64)
## Creating a MSI wrapper for the installer
1. Install [Visual Studio 2022](https://visualstudio.microsoft.com/es/downloads/) and the [Microsoft Visual Studio Installer Projects 2022 extension](https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2022InstallerProjects).
2. Clone this repository:
```
git clone https://github.com/Devolutions/UniGetUI
```
3. Download from [GitHub](https://github.com/Devolutions/UniGetUI/releases/) the installer version you wish to package as MSI.
4. Move the downloaded exe installer into `InstallerExtras/MsiCreator`. Ensure that the downloaded installer name is **exactly** `UniGetUI Installer.exe`
5. Open the Solution (`MsiInstallerWrapper.sln`) with Visual Studio and build the solution. The files `UniGetUISetup.msi` and `setup.exe` will be created. You may want to delete `setup.exe`, since it will not be used.
6. (Optional) Test that the file `UniGetUISetup.msi` installs UniGetUI properly. You should be now ready to go
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB