From 9d09a8d5b01b247da279e826a8296a80bdc123dc Mon Sep 17 00:00:00 2001 From: lordmulder Date: Sun, 2 Oct 2011 22:14:09 +0200 Subject: [PATCH] Installer updates. --- etc/Deployment/_deploy.bat | 7 +- etc/NSIS/setup.nsi | 149 +++++++++++--------------------- etc/NSIS/wrapper.nsi | 154 ++++++++++++++++++++++++++++++++++ etc/Translation/Blank.ts | 116 ++++++++++++------------- res/tools/wupdate.exe | Bin 376003 -> 376002 bytes src/Config.h | 2 +- src/Thread_Initialization.cpp | 2 +- 7 files changed, 270 insertions(+), 160 deletions(-) create mode 100644 etc/NSIS/wrapper.nsi diff --git a/etc/Deployment/_deploy.bat b/etc/Deployment/_deploy.bat index 6ab6da2c..cab0aaa7 100644 --- a/etc/Deployment/_deploy.bat +++ b/etc/Deployment/_deploy.bat @@ -81,6 +81,7 @@ REM ------------------------------------------ REM :: DELETE OLD OUTPUT FILE :: REM ------------------------------------------ del "%OUT_FILE%.exe" +del "%OUT_FILE%.sfx.exe" del "%OUT_FILE%.zip" REM ------------------------------------------ if exist "%OUT_FILE%.exe" ( @@ -130,7 +131,8 @@ REM ------------------------------------------ REM :: CREATE PACKAGES :: REM ------------------------------------------ "%PATH_SEVENZ%\7z.exe" a -tzip -r "%OUT_FILE%.zip" "%TMP_PATH%\*" -"%PATH_MKNSIS%\makensis.exe" "/DLAMEXP_SOURCE_PATH=%TMP_PATH%" "/DLAMEXP_OUTPUT_FILE=%OUT_FILE%.exe" "/DLAMEXP_UPX_PATH=%PATH_UPXBIN%" "/DLAMEXP_DATE=%ISO_DATE%" "/DLAMEXP_VERSION=%VER_LAMEXP_MAJOR%.%VER_LAMEXP_MINOR_HI%%VER_LAMEXP_MINOR_LO%" "/DLAMEXP_BUILD=%VER_LAMEXP_BUILD%" "/DLAMEXP_INSTTYPE=%VER_LAMEXP_TYPE%" "/DLAMEXP_PATCH=%VER_LAMEXP_PATCH%" "%~dp0\..\NSIS\setup.nsi" +"%PATH_MKNSIS%\makensis.exe" "/DLAMEXP_UPX_PATH=%PATH_UPXBIN%" "/DLAMEXP_DATE=%ISO_DATE%" "/DLAMEXP_VERSION=%VER_LAMEXP_MAJOR%.%VER_LAMEXP_MINOR_HI%%VER_LAMEXP_MINOR_LO%" "/DLAMEXP_BUILD=%VER_LAMEXP_BUILD%" "/DLAMEXP_INSTTYPE=%VER_LAMEXP_TYPE%" "/DLAMEXP_PATCH=%VER_LAMEXP_PATCH%" "/DLAMEXP_SOURCE_PATH=%TMP_PATH%" "/DLAMEXP_OUTPUT_FILE=%OUT_FILE%.exe" "%~dp0\..\NSIS\setup.nsi" +"%PATH_MKNSIS%\makensis.exe" "/DLAMEXP_UPX_PATH=%PATH_UPXBIN%" "/DLAMEXP_DATE=%ISO_DATE%" "/DLAMEXP_VERSION=%VER_LAMEXP_MAJOR%.%VER_LAMEXP_MINOR_HI%%VER_LAMEXP_MINOR_LO%" "/DLAMEXP_BUILD=%VER_LAMEXP_BUILD%" "/DLAMEXP_INSTTYPE=%VER_LAMEXP_TYPE%" "/DLAMEXP_PATCH=%VER_LAMEXP_PATCH%" "/DLAMEXP_SOURCE_FILE=%OUT_FILE%.exe" "/DLAMEXP_OUTPUT_FILE=%OUT_FILE%.sfx.exe" "%~dp0\..\NSIS\wrapper.nsi" rd /S /Q "%TMP_PATH%" REM ------------------------------------------ if not exist "%OUT_FILE%.zip" ( @@ -144,10 +146,11 @@ if not exist "%OUT_FILE%.exe" ( REM ------------------------------------------ attrib +R "%OUT_FILE%.zip" attrib +R "%OUT_FILE%.exe" +attrib +R "%OUT_FILE%.sfx.exe" REM ------------------------------------------ REM :: CREATE SIGNATURE :: REM ------------------------------------------ -"%PATH_GNUPG1%\gpg.exe" --detach-sign "%OUT_FILE%.exe" +"%PATH_GNUPG1%\gpg.exe" --detach-sign "%OUT_FILE%.sfx.exe" attrib +R "%OUT_FILE%.exe.sig" REM ------------------------------------------ echo. diff --git a/etc/NSIS/setup.nsi b/etc/NSIS/setup.nsi index fb17e664..483bed83 100644 --- a/etc/NSIS/setup.nsi +++ b/etc/NSIS/setup.nsi @@ -75,7 +75,7 @@ !include `MUI2.nsh` !include `WinVer.nsh` -!include `UAC.nsh` +!include `StdUtils.nsh` !include `parameters.nsh` @@ -83,7 +83,7 @@ ;Installer Attributes ;-------------------------------- -RequestExecutionLevel user +RequestExecutionLevel admin ShowInstDetails show ShowUninstDetails show Name "LameXP v${LAMEXP_VERSION} ${LAMEXP_INSTTYPE}-${LAMEXP_PATCH} [Build #${LAMEXP_BUILD}]" @@ -107,12 +107,14 @@ SetCompressorDictSize 64 ;Reserved Files ;-------------------------------- -ReserveFile "${NSISDIR}\Plugins\UAC.dll" ReserveFile "${NSISDIR}\Plugins\System.dll" +ReserveFile "${NSISDIR}\Plugins\UserInfo.dll" +ReserveFile "${NSISDIR}\Plugins\Aero.dll" +ReserveFile "${NSISDIR}\Plugins\StdUtils.dll" ReserveFile "${NSISDIR}\Plugins\nsDialogs.dll" ReserveFile "${NSISDIR}\Plugins\StartMenu.dll" ReserveFile "${NSISDIR}\Plugins\LockedList.dll" -ReserveFile "${NSISDIR}\Plugins\Aero.dll" +ReserveFile "checkproc.exe" ;-------------------------------- @@ -170,8 +172,8 @@ VIAddVersionKey "Website" "${MyWebSite}" !define MUI_HEADERIMAGE_BITMAP "header.bmp" !define MUI_HEADERIMAGE_UNBITMAP "header-un.bmp" !define MUI_LANGDLL_ALLLANGUAGES -!define MUI_CUSTOMFUNCTION_GUIINIT MyUacInit -!define MUI_CUSTOMFUNCTION_UNGUIINIT un.MyUacInit +!define MUI_CUSTOMFUNCTION_GUIINIT MyGuiInit +!define MUI_CUSTOMFUNCTION_UNGUIINIT un.MyGuiInit !define MUI_LANGDLL_ALWAYSSHOW @@ -257,19 +259,15 @@ UninstPage Custom un.LockedListShow ;-------------------------------- Function .onInit - ${If} ${UAC_IsInnerInstance} - ${OrIf} ${UAC_IsAdmin} - !insertmacro MUI_LANGDLL_DISPLAY - ${EndIf} - - ${IfNot} ${UAC_IsInnerInstance} - System::Call 'kernel32::CreateMutexA(i 0, i 0, t "{2B3D1EBF-B3B6-4E93-92B9-6853029A7162}") i .r1 ?e' - Pop $0 - StrCmp $0 0 +3 + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "{2B3D1EBF-B3B6-4E93-92B9-6853029A7162}") i .r1 ?e' + Pop $0 + ${If} $0 <> 0 MessageBox MB_ICONSTOP|MB_TOPMOST "Sorry, the installer is already running!" Quit ${EndIf} + !insertmacro MUI_LANGDLL_DISPLAY + ; -------- ${IfNot} ${IsNT} @@ -287,54 +285,41 @@ Function .onInit Quit ${EndIf} - ${If} ${UAC_IsInnerInstance} - ${OrIf} ${UAC_IsAdmin} - ${If} ${IsWin2000} - ${AndIf} ${AtMostServicePack} 3 - MessageBox MB_TOPMOST|MB_ICONEXCLAMATION "Setup has detected that your system is missing important updates:$\nThe Service Pack 4 for Windows 2000 is highly recommended!" - MessageBox MB_TOPMOST|MB_ICONQUESTION|MB_YESNO "Do you want to download Service Pack 4 for Windows 2000 now?" IDNO +2 - ExecShell "open" "http://www.microsoft.com/download/en/details.aspx?id=4127" - ${EndIf} - ${If} ${IsWinXP} - ${AndIf} ${AtMostServicePack} 2 - MessageBox MB_TOPMOST|MB_ICONEXCLAMATION "Setup has detected that your system is missing important updates:$\nThe Service Pack 3 for Windows XP is highly recommended!" - MessageBox MB_TOPMOST|MB_ICONQUESTION|MB_YESNO "Do you want to download Service Pack 3 for Windows XP now?" IDNO +2 - ExecShell "open" "http://technet.microsoft.com/en-us/windows/bb794714" - ${EndIf} - ${If} ${IsWinVista} - ${AndIf} ${AtMostServicePack} 1 - MessageBox MB_TOPMOST|MB_ICONEXCLAMATION "Setup has detected that your system is missing important updates:$\nThe Service Pack 2 for Windows Vista is highly recommended!" - MessageBox MB_TOPMOST|MB_ICONQUESTION|MB_YESNO "Do you want to download Service Pack 2 for Windows Vista now?" IDNO +2 - ExecShell "open" "http://technet.microsoft.com/en-us/windows/dd262148" - ${EndIf} - ${If} ${IsWin7} - ${AndIf} ${AtMostServicePack} 0 - MessageBox MB_TOPMOST|MB_ICONEXCLAMATION "Setup has detected that your system is missing important updates:$\nThe Service Pack 1 for Windows 7 is highly recommended!" - MessageBox MB_TOPMOST|MB_ICONQUESTION|MB_YESNO "Do you want to download Service Pack 1 for Windows 7 now?" IDNO +2 - ExecShell "open" "http://technet.microsoft.com/en-us/windows/gg635126" - ${EndIf} - ${EndIf} + ; -------- + UserInfo::GetAccountType + Pop $0 + ${If} $0 != "Admin" + MessageBox MB_ICONSTOP|MB_TOPMOST "Your system requires administrative permissions in order to install this software." + Quit + ${EndIf} + ; -------- InitPluginsDir File "/oname=$PLUGINSDIR\checkproc.exe" "checkproc.exe" nsExec::Exec /TIMEOUT=5000 '"$PLUGINSDIR\checkproc.exe" Softonic Brothersoft' + Pop $0 FunctionEnd Function un.onInit - ${If} ${UAC_IsInnerInstance} - ${OrIf} ${UAC_IsAdmin} - !insertmacro MUI_LANGDLL_DISPLAY - ${EndIf} - - ${IfNot} ${UAC_IsInnerInstance} - System::Call 'kernel32::CreateMutexA(i 0, i 0, t "{2B3D1EBF-B3B6-4E93-92B9-6853029A7162}") i .r1 ?e' - Pop $0 - StrCmp $0 0 +3 + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "{2B3D1EBF-B3B6-4E93-92B9-6853029A7162}") i .r1 ?e' + Pop $0 + ${If} $0 <> 0 MessageBox MB_ICONSTOP|MB_TOPMOST "Sorry, the un-installer is already running!" Quit - ${EndIf} + ${EndIf} + + !insertmacro MUI_LANGDLL_DISPLAY + + ; -------- + + UserInfo::GetAccountType + Pop $0 + ${If} $0 != "Admin" + MessageBox MB_ICONSTOP|MB_TOPMOST "Your system requires administrative permissions in order to install this software." + Quit + ${EndIf} FunctionEnd @@ -342,53 +327,13 @@ FunctionEnd ;UAC initialization ;-------------------------------- -Function MyUacInit - UAC_TryAgain: - !insertmacro UAC_RunElevated - ${Switch} $0 - ${Case} 0 - ${IfThen} $1 = 1 ${|} Quit ${|} - ${IfThen} $3 <> 0 ${|} ${Break} ${|} - ${If} $1 = 3 - MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_OKCANCEL "This installer requires admin access, please try again!" /SD IDCANCEL IDOK UAC_TryAgain - ${EndIf} - ${Case} 1223 - MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_OKCANCEL "This installer requires admin privileges, please try again!" /SD IDCANCEL IDOK UAC_TryAgain - Quit - ${Case} 1062 - MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Logon service not running, aborting!" - Quit - ${Default} - MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to elevate installer! (Error code: $0)" - Quit - ${EndSwitch} - +Function MyGuiInit StrCpy $0 $HWNDPARENT System::Call "user32::SetWindowPos(i r0, i -1, i 0, i 0, i 0, i 0, i 3)" Aero::Apply FunctionEnd -Function un.MyUacInit - UAC_TryAgain: - !insertmacro UAC_RunElevated - ${Switch} $0 - ${Case} 0 - ${IfThen} $1 = 1 ${|} Quit ${|} - ${IfThen} $3 <> 0 ${|} ${Break} ${|} - ${If} $1 = 3 - MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_OKCANCEL "This un-installer requires admin access, please try again!" /SD IDCANCEL IDOK UAC_TryAgain - ${EndIf} - ${Case} 1223 - MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND|MB_OKCANCEL "This un-installer requires admin privileges, please try again!" /SD IDCANCEL IDOK UAC_TryAgain - Quit - ${Case} 1062 - MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Logon service not running, aborting!" - Quit - ${Default} - MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to elevate installer! (Error code: $0)" - Quit - ${EndSwitch} - +Function un.MyGuiInit StrCpy $0 $HWNDPARENT System::Call "user32::SetWindowPos(i r0, i -1, i 0, i 0, i 0, i 0, i 3)" Aero::Apply @@ -474,6 +419,11 @@ FunctionEnd StrCpy ${OutVar} "LameXP.exe" !macroend +!macro DisableNextButton TmpVar + GetDlgItem ${TmpVar} $HWNDPARENT 1 + EnableWindow ${TmpVar} 0 +!macroend + ;-------------------------------- ;Install Files @@ -675,12 +625,15 @@ FunctionEnd ;-------------------------------- Function RunAppFunction + !insertmacro DisableNextButton $R0 !insertmacro GetExecutableName $R0 - !insertmacro UAC_AsUser_ExecShell "explore" "$INSTDIR" "" "" SW_SHOWNORMAL - !insertmacro UAC_AsUser_ExecShell "open" "$INSTDIR\$R0" "--first-run" "$INSTDIR" SW_SHOWNORMAL + ${StdUtils.ExecShellAsUser} $R1 "$INSTDIR" "explore" "" + ${StdUtils.ExecShellAsUser} $R1 "$INSTDIR\$R0" "open" "--first-run" + ${StdUtils.Unload} FunctionEnd Function ShowReadmeFunction - !insertmacro UAC_AsUser_ExecShell "open" "$INSTDIR\FAQ.html" "" "" SW_SHOWNORMAL + !insertmacro DisableNextButton $R0 + ${StdUtils.ExecShellAsUser} $R1 "$INSTDIR\FAQ.html" "open" "" + ${StdUtils.Unload} FunctionEnd - diff --git a/etc/NSIS/wrapper.nsi b/etc/NSIS/wrapper.nsi new file mode 100644 index 00000000..39f64079 --- /dev/null +++ b/etc/NSIS/wrapper.nsi @@ -0,0 +1,154 @@ +; /////////////////////////////////////////////////////////////////////////////// +; // LameXP - Audio Encoder Front-End +; // Copyright (C) 2004-2011 LoRd_MuldeR +; // +; // This program is free software; you can redistribute it and/or modify +; // it under the terms of the GNU General Public License as published by +; // the Free Software Foundation; either version 2 of the License, or +; // (at your option) any later version. +; // +; // This program is distributed in the hope that it will be useful, +; // but WITHOUT ANY WARRANTY; without even the implied warranty of +; // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; // GNU General Public License for more details. +; // +; // You should have received a copy of the GNU General Public License along +; // with this program; if not, write to the Free Software Foundation, Inc., +; // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +; // +; // http://www.gnu.org/licenses/gpl-2.0.txt +; /////////////////////////////////////////////////////////////////////////////// + +;-------------------------------- +;Basic Defines +;-------------------------------- + +!ifndef LAMEXP_VERSION + !error "LAMEXP_VERSION is not defined !!!" +!endif +!ifndef LAMEXP_BUILD + !error "LAMEXP_BUILD is not defined !!!" +!endif +!ifndef LAMEXP_INSTTYPE + !error "LAMEXP_INSTTYPE is not defined !!!" +!endif +!ifndef LAMEXP_PATCH + !error "LAMEXP_PATCH is not defined !!!" +!endif +!ifndef LAMEXP_DATE + !error "LAMEXP_DATE is not defined !!!" +!endif +!ifndef LAMEXP_OUTPUT_FILE + !error "LAMEXP_OUTPUT_FILE is not defined !!!" +!endif +!ifndef LAMEXP_SOURCE_FILE + !error "LAMEXP_SOURCE_FILE is not defined !!!" +!endif +!ifndef LAMEXP_UPX_PATH + !error "LAMEXP_UPX_PATH is not defined !!!" +!endif + +;UUID +!define MyRegPath "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FBD7A67D-D700-4043-B54F-DD106D00F308}" + +;Web-Site +!define MyWebSite "http://mulder.at.gg/" + + +;-------------------------------- +;Includes +;-------------------------------- + +!include `parameters.nsh` + + +;-------------------------------- +;Installer Attributes +;-------------------------------- + +RequestExecutionLevel user +XPStyle on +Name "LameXP v${LAMEXP_VERSION} ${LAMEXP_INSTTYPE}-${LAMEXP_PATCH} [Build #${LAMEXP_BUILD}]" +OutFile "${LAMEXP_OUTPUT_FILE}" +BrandingText "${LAMEXP_DATE} / Build ${LAMEXP_BUILD}" +InstallDir "$PROGRAMFILES\MuldeR\LameXP v${LAMEXP_VERSION}" +Icon "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico" +ChangeUI all "${NSISDIR}\Contrib\UIs\sdbarker_tiny.exe" +ShowInstDetails show +AutoCloseWindow true + + +;-------------------------------- +;Page Captions +;-------------------------------- + +SubCaption 0 " " +SubCaption 1 " " +SubCaption 2 " " +SubCaption 3 " " +SubCaption 4 " " + + +;-------------------------------- +;Compressor +;-------------------------------- + +!packhdr "$%TEMP%\exehead.tmp" '"${LAMEXP_UPX_PATH}\upx.exe" --brute "$%TEMP%\exehead.tmp"' + + +;-------------------------------- +;Version Info +;-------------------------------- + +!searchreplace PRODUCT_VERSION_DATE "${LAMEXP_DATE}" "-" "." +VIProductVersion "${PRODUCT_VERSION_DATE}.${LAMEXP_BUILD}" + +VIAddVersionKey "Author" "LoRd_MuldeR " +VIAddVersionKey "Comments" "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version." +VIAddVersionKey "CompanyName" "Free Software Foundation" +VIAddVersionKey "FileDescription" "LameXP v${LAMEXP_VERSION} ${LAMEXP_INSTTYPE}-${LAMEXP_PATCH} [Build #${LAMEXP_BUILD}]" +VIAddVersionKey "FileVersion" "${PRODUCT_VERSION_DATE}.${LAMEXP_BUILD} (${LAMEXP_VERSION})" +VIAddVersionKey "LegalCopyright" "Copyright 2004-2011 LoRd_MuldeR" +VIAddVersionKey "LegalTrademarks" "GNU" +VIAddVersionKey "OriginalFilename" "LameXP.${LAMEXP_DATE}.exe" +VIAddVersionKey "ProductName" "LameXP - Audio Encoder Frontend" +VIAddVersionKey "ProductVersion" "${LAMEXP_VERSION}, Build #${LAMEXP_BUILD} (${LAMEXP_DATE})" +VIAddVersionKey "Website" "${MyWebSite}" + + +;-------------------------------- +;Installer initialization +;-------------------------------- + +Section "-LaunchTheInstaller" + SetDetailsPrint textonly + DetailPrint "Launching installer, please stay tuned..." + SetDetailsPrint listonly + + InitPluginsDir + SetOutPath "$PLUGINSDIR" + File "/oname=$PLUGINSDIR\Install.exe" "${LAMEXP_SOURCE_FILE}" + !insertmacro GetCommandlineParameter "Update" "?" $R9 + + RunTryAgain: + + ClearErrors + StrCmp "$R9" "?" +3 0 + ExecShell "open" "$PLUGINSDIR\Install.exe" '/Update=$R9' SW_SHOWNORMAL + Goto +2 + ExecShell "open" "$PLUGINSDIR\Install.exe" '/Update' SW_SHOWNORMAL + IfErrors 0 RunSuccess + + ClearErrors + StrCmp "$R9" "?" +3 0 + ExecShell "" "$PLUGINSDIR\Install.exe" '/Update=$R9' SW_SHOWNORMAL + Goto +2 + ExecShell "" "$PLUGINSDIR\Install.exe" '/Update' SW_SHOWNORMAL + IfErrors 0 RunSuccess + + MessageBox MB_RETRYCANCEL|MB_ICONSTOP|MB_TOPMOST "Failed to launch installer. Please try again!" IDRETRY RunTryAgain + Abort "Failed to launch installer :-(" + + RunSuccess: + Delete /REBOOTOK "$PLUGINSDIR\Install.exe" +SectionEnd diff --git a/etc/Translation/Blank.ts b/etc/Translation/Blank.ts index 6e7f23b1..81ef45e5 100644 --- a/etc/Translation/Blank.ts +++ b/etc/Translation/Blank.ts @@ -1477,7 +1477,7 @@ - + Access Denied @@ -1632,8 +1632,8 @@ - - + + Discard @@ -1837,8 +1837,8 @@ - - + + Yes @@ -1847,8 +1847,8 @@ - - + + No @@ -1945,201 +1945,201 @@ - - - + + + Beta Updates - + Do you really want LameXP to check for Beta (pre-release) updates? - + LameXP will check for Beta (pre-release) updates from now on. - + Check Now - + LameXP will <i>not</i> check for Beta (pre-release) updates from now on. - - - + + + Shell Integration - + Do you really want to disable the LameXP shell integration? - + The LameXP shell integration has been disabled. - + The LameXP shell integration has been re-enabled. - - + + Add file(s) - - + + Add Folder - - + + New Folder - + Enter the name of the new folder: - + Failed to create folder - + The new folder could not be created: - + Drive is read-only or insufficient access rights! - - - - + + + + Quality Level %1 - - - + + + Compression %1 - - - + + + Uncompressed - + Best Quality (Very Slow) - + High Quality (Recommended) - + Average Quality (Default) - + Low Quality (Fast) - + Poor Quality (Very Fast) - + File name without extension - + Track number with leading zero - + Track title - + Artist name - + Album name - + Year with (at least) four digits - + Comment - + Characters forbidden in file names: - + Rename Macros - + %1 Instance(s) - + Cannot write to the selected directory. Please choose another directory! - + Already Running - + LameXP is already running, please use the running instance! diff --git a/res/tools/wupdate.exe b/res/tools/wupdate.exe index 3add977cec52a30f142e2a5cdd398a7dc4b5a320..ed9af6236253b1f3a33ce362c00575c582fb6941 100644 GIT binary patch delta 432 zcmV;h0Z;zJ`4+laa|+v@i1h zLYZm??13vlD~XE-F&@;!fv3-k^a{6YE1BDj?Ee~E^jaG6vW2%mwsVOU6Q%g-vwh6D zs>2hc0NAK#qcK63j%c8{v3+5bekBLUn_hJpf!sB3kX$4oBX7SmTH%yJEa&OQb*Uy= zc!ZjPf7(n^kPf$<{|bkX9=Z1kX~87dA4ezZEqE7NN3x9=Rw>MVxdpBDze1ve|7-%&NC+t^ye${OxF_W9ya0jJxAr7F7P9X zxjgj5Y`prd4mi#5%Ez(P*Ru+2yZqZsOy&Av z3D(CnM0jC$45hEdn#{tua7xnw%}^&M!8ipuoh{dja<2|u}ou~T>t+{T;)$Gx$Xbd=H z_=EFgDX@rXFXX62*Wo$Dngg@Q+V7h6h3pOKoFHArnJ_3Es2NNi#z^PYc|%_9EU&Em z4d=1|f6vxhO7k!6w+9ONSSqkIfk<{RVw%RiS~TfeGURXg&-x^i(Y?P-?>iaTYD%33!>yJDM?8l4RL-51RXYS4QH%Wp?? z`0F*{K&Y+6FEp74QD*JnEo!dR?mi6EIKM9by6LpBgNl^agqD@yq_8i$lA0*90-1Ba9;1h