From 61b69e5c994d528addf86dff90a6e77dd6a83a90 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 6 Aug 2012 23:21:05 +0000 Subject: [PATCH] Backport VSIX packaging support and related changes. FossilOrigin-Name: 0620285da63ed2273776a5f4feeee54d2f802dc9 --- Makefile.msc | 165 +++++++++++++--- manifest | 23 ++- manifest.uuid | 2 +- tool/build-all-msvc.bat | 394 +++++++++++++++++++++++++++++++++++++ tool/mkvsix.tcl | 419 ++++++++++++++++++++++++++++++++++++++++ tool/win/sqlite.vsix | Bin 0 -> 32802 bytes 6 files changed, 962 insertions(+), 41 deletions(-) create mode 100755 tool/build-all-msvc.bat create mode 100644 tool/mkvsix.tcl create mode 100644 tool/win/sqlite.vsix diff --git a/Makefile.msc b/Makefile.msc index d8f01d650f..c25e31248e 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -15,12 +15,26 @@ USE_AMALGAMATION = 1 # USE_ICU = 0 +# Set this non-0 to dynamically link to the MSVC runtime library. +# +USE_CRT_DLL = 0 + +# Set this non-0 to use the native libraries paths for cross-compiling +# the command line tools needed during the compilation process. +# +USE_NATIVE_LIBPATHS = 0 + # Set this non-0 to compile binaries suitable for the WinRT environment. # This setting does not apply to any binaries that require Tcl to operate # properly (i.e. the text fixture, etc). # FOR_WINRT = 0 +# Set this non-0 to skip attempting to look for and/or link with the Tcl +# runtime library. +# +NO_TCL = 0 + # Set this to non-0 to create and use PDBs. # SYMBOLS = 1 @@ -38,26 +52,108 @@ SYMBOLS = 1 # DEBUG = 0 -# C Compiler and options for use in building executables that +# Check for the predefined command macro CC. This should point to the compiler +# binary for the target platform. If it is not defined, simply define it to +# the legacy default value 'cl.exe'. +# +!IFNDEF CC +CC = cl.exe +!ENDIF + +# Check for the command macro LD. This should point to the linker binary for +# the target platform. If it is not defined, simply define it to the legacy +# default value 'link.exe'. +# +!IFNDEF LD +LD = link.exe +!ENDIF + +# Check for the command macro NCC. This should point to the compiler binary +# for the platform the compilation process is taking place on. If it is not +# defined, simply define it to have the same value as the CC macro. When +# cross-compiling, it is suggested that this macro be modified via the command +# line (since nmake itself does not provide a built-in method to guess it). +# For example, to use the x86 compiler when cross-compiling for x64, a command +# line similar to the following could be used (all on one line): +# +# nmake /f Makefile.msc +# "NCC=""%VCINSTALLDIR%\bin\cl.exe""" +# USE_NATIVE_LIBPATHS=1 +# +!IFDEF NCC +NCC = $(NCC:\\=\) +!ELSE +NCC = $(CC) +!ENDIF + +# Check for the MSVC runtime library path macro. Othertise, this +# value will default to the 'lib' directory underneath the MSVC +# installation directory. +# +!IFNDEF NCRTLIBPATH +NCRTLIBPATH = $(VCINSTALLDIR)\lib +!ENDIF + +NCRTLIBPATH = $(NCRTLIBPATH:\\=\) + +# Check for the Platform SDK library path macro. Othertise, this +# value will default to the 'lib' directory underneath the Windows +# SDK installation directory (the environment variable used appears +# to be available when using Visual C++ 2008 or later via the +# command line). +# +!IFNDEF NSDKLIBPATH +NSDKLIBPATH = $(WINDOWSSDKDIR)\lib +!ENDIF + +NSDKLIBPATH = $(NSDKLIBPATH:\\=\) + +# C compiler and options for use in building executables that # will run on the platform that is doing the build. # -BCC = cl.exe -W3 +BCC = $(NCC) -W3 -# C Compile and options for use in building executables that +# Check if the native library paths should be used when compiling +# the command line tools used during the compilation process. If +# so, set the necessary macro now. +# +!IF $(USE_NATIVE_LIBPATHS)!=0 +NLTLIBPATHS = "/LIBPATH:$(NCRTLIBPATH)" "/LIBPATH:$(NSDKLIBPATH)" +!ENDIF + +# C compiler and options for use in building executables that # will run on the target platform. (BCC and TCC are usually the # same unless your are cross-compiling.) # -TCC = cl.exe -W3 -DSQLITE_OS_WIN=1 -I. -I$(TOP)\src -fp:precise +TCC = $(CC) -W3 -DSQLITE_OS_WIN=1 -I. -I$(TOP)\src -fp:precise # When compiling the library for use in the WinRT environment, # the following compile-time options must be used as well to # disable use of Win32 APIs that are not available and to enable # use of Win32 APIs that are specific to Windows 8 and/or WinRT. -# Also, we need to dynamically link to the MSVC runtime when -# compiling for WinRT. # !IF $(FOR_WINRT)!=0 -TCC = $(TCC) -DSQLITE_OS_WINRT=1 -MD +TCC = $(TCC) -DSQLITE_OS_WINRT=1 +TCC = $(TCC) -DWINAPI_FAMILY=WINAPI_PARTITION_APP +!ENDIF + +# Also, we need to dynamically link to the correct MSVC runtime +# when compiling for WinRT (e.g. debug or release) OR if the +# USE_CRT_DLL option is set to force dynamically linking to the +# MSVC runtime library. +# +!IF $(FOR_WINRT)!=0 || $(USE_CRT_DLL)!=0 +!IF $(DEBUG)>0 +TCC = $(TCC) -MDd +!ELSE +TCC = $(TCC) -MD +!ENDIF +!ELSE +!IF $(DEBUG)>0 +TCC = $(TCC) -MTd +!ELSE +TCC = $(TCC) -MT +!ENDIF !ENDIF # The mksqlite3c.tcl and mksqlite3h.tcl scripts will pull in @@ -91,11 +187,18 @@ TCC = $(TCC) -DSQLITE_ENABLE_IOTRACE !ENDIF # -# Prevent warnings about "insecure" runtime library functions being used. +# Prevent warnings about "insecure" MSVC runtime library functions +# being used. # TCC = $(TCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS BCC = $(BCC) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS +# +# Prevent warnings about "deprecated" POSIX functions being used. +# +TCC = $(TCC) -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS +BCC = $(BCC) -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS + # # Use native Win32 heap instead of malloc/free? # @@ -114,43 +217,43 @@ TCC = $(TCC) -DSQLITE_WIN32_MALLOC_VALIDATE=1 # prior to running nmake in order to match the actual installed location and # version on this machine. # -!if "$(TCLINCDIR)" == "" +!IFNDEF TCLINCDIR TCLINCDIR = c:\tcl\include -!endif +!ENDIF -!if "$(TCLLIBDIR)" == "" +!IFNDEF TCLLIBDIR TCLLIBDIR = c:\tcl\lib -!endif +!ENDIF -!if "$(LIBTCL)" == "" +!IFNDEF LIBTCL LIBTCL = tcl85.lib -!endif +!ENDIF # The locations of the ICU header and library files. These variables # (ICUINCDIR, ICULIBDIR, and LIBICU) may be overridden via the environment # prior to running nmake in order to match the actual installed location on # this machine. # -!if "$(ICUINCDIR)" == "" +!IFNDEF ICUINCDIR ICUINCDIR = c:\icu\include -!endif +!ENDIF -!if "$(ICULIBDIR)" == "" +!IFNDEF ICULIBDIR ICULIBDIR = c:\icu\lib -!endif +!ENDIF -!if "$(LIBICU)" == "" +!IFNDEF LIBICU LIBICU = icuuc.lib icuin.lib -!endif +!ENDIF # This is the command to use for tclsh - normally just "tclsh", but we may # know the specific version we want to use. This variable (TCLSH_CMD) may be # overridden via the environment prior to running nmake in order to select a # specific Tcl shell to use. # -!if "$(TCLSH_CMD)" == "" +!IFNDEF TCLSH_CMD TCLSH_CMD = tclsh85 -!endif +!ENDIF # Compiler options needed for programs that use the readline() library. # @@ -170,9 +273,9 @@ TCC = $(TCC) -DSQLITE_THREAD_OVERRIDE_LOCK=-1 # Any target libraries which libsqlite must be linked against # -!if "$(TLIBS)" == "" +!IFNDEF TLIBS TLIBS = -!endif +!ENDIF # Flags controlling use of the in memory btree implementation # @@ -234,7 +337,7 @@ LTLINK = $(TCC) -Fe$@ # Note that the vcvars*.bat family of batch files typically # set this for you. Otherwise, the linker will attempt # to deduce the binary type based on the object files. -!IF "$(PLATFORM)"!="" +!IFDEF PLATFORM LTLINKOPTS = /MACHINE:$(PLATFORM) LTLIBOPTS = /MACHINE:$(PLATFORM) !ENDIF @@ -249,13 +352,14 @@ LTLINKOPTS = $(LTLINKOPTS) /APPCONTAINER # If either debugging or symbols are enabled, enable PDBs. !IF $(DEBUG)>0 || $(SYMBOLS)!=0 -LTLINKOPTS = $(LTLINKOPTS) /DEBUG -BCC = $(BCC) /DEBUG +LDFLAGS = /DEBUG !ENDIF # Start with the Tcl related linker options. +!IF $(NO_TCL)==0 LTLIBPATHS = /LIBPATH:$(TCLLIBDIR) LTLIBS = $(LIBTCL) +!ENDIF # If ICU support is enabled, add the linker options for it. !IF $(USE_ICU)!=0 @@ -637,7 +741,7 @@ lempar.c: $(TOP)\src\lempar.c copy $(TOP)\src\lempar.c . lemon.exe: $(TOP)\tool\lemon.c lempar.c - $(BCC) -Fe$@ $(TOP)\tool\lemon.c + $(BCC) -Daccess=_access -Fe$@ $(TOP)\tool\lemon.c /link $(NLTLIBPATHS) # Rules to build individual *.lo files from generated *.c files. This # applies to: @@ -899,7 +1003,7 @@ sqlite3.h: $(TOP)\src\sqlite.h.in $(TOP)\manifest.uuid $(TOP)\VERSION $(TCLSH_CMD) $(TOP)\tool\mksqlite3h.tcl $(TOP) > sqlite3.h mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c - $(BCC) -Femkkeywordhash.exe $(OPT_FEATURE_FLAGS) $(OPTS) $(TOP)\tool\mkkeywordhash.c + $(BCC) -Fe$@ $(OPT_FEATURE_FLAGS) $(OPTS) $(TOP)\tool\mkkeywordhash.c /link $(NLTLIBPATHS) keywordhash.h: $(TOP)\tool\mkkeywordhash.c mkkeywordhash.exe .\mkkeywordhash.exe > keywordhash.h @@ -1031,6 +1135,7 @@ clean: del /Q sqlite3.dll sqlite3.lib sqlite3.exp sqlite3.def del /Q sqlite3.c del /Q sqlite3_analyzer.exe sqlite3_analyzer.exp sqlite3_analyzer.c + del /Q sqlite-output.vsix # # Windows section @@ -1044,4 +1149,4 @@ sqlite3.def: libsqlite3.lib | sort >> sqlite3.def sqlite3.dll: $(LIBOBJ) sqlite3.def - link $(LTLINKOPTS) $(LTLIBPATHS) /DLL /DEF:sqlite3.def /OUT:$@ $(LIBOBJ) $(LTLIBS) $(TLIBS) + $(LD) $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) /DLL /DEF:sqlite3.def /OUT:$@ $(LIBOBJ) $(LTLIBS) $(TLIBS) diff --git a/manifest b/manifest index 8e0fdc7786..85827a120b 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Version\s3.7.13 -D 2012-06-11T02:05:22.539 +C Backport\sVSIX\spackaging\ssupport\sand\srelated\schanges. +D 2012-08-06T23:21:05.223 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in d17fddaa4e81f93a7c9c7c0808aacb3fc95f79f4 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc fd86027849a59a2f621b791b79eabf3f8ffbd684 +F Makefile.msc d95ad0a339193647036a7d0db441b323a2e4bc98 F Makefile.vxworks 3b7fe7a0571fdadc61363ebc1b23732d2d6363ca F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6 F VERSION 3e857b9b826e818eec9411eafe2c3fa22c1dbb8a @@ -966,6 +966,7 @@ F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31 F test/win32lock.test b2a539e85ae6b2d78475e016a9636b4451dc7fb9 F test/zeroblob.test caaecfb4f908f7bc086ed238668049f96774d688 F test/zerodamage.test 0de750389990b1078bab203c712dc3fefd1d8b82 +F tool/build-all-msvc.bat 1a18aa39983ae7354d834bc55a850a54fc007576 x F tool/build-shell.sh b64a481901fc9ffe5ca8812a2a9255b6cfb77381 F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 @@ -982,6 +983,7 @@ F tool/mksqlite3c-noext.tcl 105023aa86f696a74b1d6a4929d1e1c3baf9471c F tool/mksqlite3c.tcl f289ba51f74f45c71a80c13e6c74a6dd92763253 F tool/mksqlite3h.tcl 78013ad79a5e492e5f764f3c7a8ef834255061f8 F tool/mksqlite3internalh.tcl 7b43894e21bcb1bb39e11547ce7e38a063357e87 +F tool/mkvsix.tcl 19b2ab9ea16445953a76568a5bbe4cb864f92dfe F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 F tool/omittest.tcl 72a49b8a9a8b0bf213a438180307a0df836d4380 F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c @@ -1005,10 +1007,11 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 0ae0ce630a2e11f81dca50a9cfb04c4a41c03b2d -R 45dae5fdb66a9a88c8595b45bd7db627 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.7.13 * -U drh -Z c0babe9c1caac24f66a10b2544a508b6 +F tool/win/sqlite.vsix 67d8a99aceb56384a81b3f30d6c71743146d2cc9 +P f5b5a13f7394dc143aa136f1d4faba6839eaa6dc +R 52d11d3e50315aa019808706f6c354a0 +T *branch * vsix-3.7.13 +T *sym-vsix-3.7.13 * +T -sym-trunk * +U mistachkin +Z 5965af1d21ac0216d85a0ca8ada1cdef diff --git a/manifest.uuid b/manifest.uuid index 168458e2bb..bd990f6e74 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5b5a13f7394dc143aa136f1d4faba6839eaa6dc \ No newline at end of file +0620285da63ed2273776a5f4feeee54d2f802dc9 \ No newline at end of file diff --git a/tool/build-all-msvc.bat b/tool/build-all-msvc.bat new file mode 100755 index 0000000000..a2d7dae3a3 --- /dev/null +++ b/tool/build-all-msvc.bat @@ -0,0 +1,394 @@ +@ECHO OFF + +:: +:: build-all-msvc.bat -- +:: +:: Multi-Platform Build Tool for MSVC +:: + +SETLOCAL + +REM SET __ECHO=ECHO +REM SET __ECHO2=ECHO +IF NOT DEFINED _AECHO (SET _AECHO=REM) +IF NOT DEFINED _CECHO (SET _CECHO=REM) +IF NOT DEFINED _VECHO (SET _VECHO=REM) + +%_AECHO% Running %0 %* + +REM SET DFLAGS=/L + +%_VECHO% DFlags = '%DFLAGS%' + +SET FFLAGS=/V /F /G /H /I /R /Y /Z + +%_VECHO% FFlags = '%FFLAGS%' + +SET ROOT=%~dp0\.. +SET ROOT=%ROOT:\\=\% + +%_VECHO% Root = '%ROOT%' + +REM +REM NOTE: The first and only argument to this batch file should be the output +REM directory where the platform-specific binary directories should be +REM created. +REM +SET BINARYDIRECTORY=%1 + +IF NOT DEFINED BINARYDIRECTORY ( + GOTO usage +) + +%_VECHO% BinaryDirectory = '%BINARYDIRECTORY%' + +SET DUMMY=%2 + +IF DEFINED DUMMY ( + GOTO usage +) + +REM +REM NOTE: From this point, we need a clean error level. Reset it now. +REM +CALL :fn_ResetErrorLevel + +REM +REM NOTE: Change the current directory to the root of the source tree, saving +REM the current directory on the directory stack. +REM +%__ECHO2% PUSHD "%ROOT%" + +IF ERRORLEVEL 1 ( + ECHO Could not change directory to "%ROOT%". + GOTO errors +) + +REM +REM NOTE: This batch file requires the ComSpec environment variable to be set, +REM typically to something like "C:\Windows\System32\cmd.exe". +REM +IF NOT DEFINED ComSpec ( + ECHO The ComSpec environment variable must be defined. + GOTO errors +) + +REM +REM NOTE: This batch file requires the VcInstallDir environment variable to be +REM set. Tyipcally, this means this batch file needs to be run from an +REM MSVC command prompt. +REM +IF NOT DEFINED VCINSTALLDIR ( + ECHO The VCINSTALLDIR environment variable must be defined. + GOTO errors +) + +REM +REM NOTE: If the list of platforms is not already set, use the default list. +REM +IF NOT DEFINED PLATFORMS ( + SET PLATFORMS=x86 x86_amd64 x86_arm +) + +%_VECHO% Platforms = '%PLATFORMS%' + +REM +REM NOTE: Setup environment variables to translate between the MSVC platform +REM names and the names to be used for the platform-specific binary +REM directories. +REM +SET x86_NAME=x86 +SET x86_amd64_NAME=x64 +SET x86_arm_NAME=ARM + +%_VECHO% x86_Name = '%x86_NAME%' +%_VECHO% x86_amd64_Name = '%x86_amd64_NAME%' +%_VECHO% x86_arm_Name = '%x86_arm_NAME%' + +REM +REM NOTE: Check for the external tools needed during the build process ^(i.e. +REM those that do not get compiled as part of the build process itself^) +REM along the PATH. +REM +FOR %%T IN (gawk.exe tclsh85.exe) DO ( + SET %%T_PATH=%%~dp$PATH:T +) + +REM +REM NOTE: Set the TOOLPATH variable to contain all the directories where the +REM external tools were found in the search above. +REM +SET TOOLPATH=%gawk.exe_PATH%;%tclsh85.exe_PATH% + +%_VECHO% ToolPath = '%TOOLPATH%' + +REM +REM NOTE: Check for MSVC 2012 because the Windows SDK directory handling is +REM slightly different for that version. +REM +IF "%VisualStudioVersion%" == "11.0" ( + SET SET_NSDKLIBPATH=1 +) ELSE ( + CALL :fn_UnsetVariable SET_NSDKLIBPATH +) + +REM +REM NOTE: This is the outer loop. There should be exactly one iteration per +REM platform. +REM +FOR %%P IN (%PLATFORMS%) DO ( + REM + REM NOTE: Using the MSVC platform name, lookup the simpler platform name to + REM be used for the name of the platform-specific binary directory via + REM the environment variables setup earlier. + REM + CALL :fn_SetVariable %%P_NAME PLATFORMNAME + + REM + REM NOTE: This is the inner loop. There should be exactly one iteration. + REM This loop is necessary because the PlatformName environment + REM variable was set above and that value is needed by some of the + REM commands contained in the inner loop. If these commands were + REM directly contained in the outer loop, the PlatformName environment + REM variable would be stuck with its initial empty value instead. + REM + FOR /F "tokens=2* delims==" %%D IN ('SET PLATFORMNAME') DO ( + REM + REM NOTE: Attempt to clean the environment of all variables used by MSVC + REM and/or Visual Studio. This block may need to be updated in the + REM future to account for additional environment variables. + REM + CALL :fn_UnsetVariable DevEnvDir + CALL :fn_UnsetVariable ExtensionSdkDir + CALL :fn_UnsetVariable Framework35Version + CALL :fn_UnsetVariable FrameworkDir + CALL :fn_UnsetVariable FrameworkDir32 + CALL :fn_UnsetVariable FrameworkVersion + CALL :fn_UnsetVariable FrameworkVersion32 + CALL :fn_UnsetVariable FSHARPINSTALLDIR + CALL :fn_UnsetVariable INCLUDE + CALL :fn_UnsetVariable LIB + CALL :fn_UnsetVariable LIBPATH + CALL :fn_UnsetVariable Platform + REM CALL :fn_UnsetVariable VCINSTALLDIR + CALL :fn_UnsetVariable VSINSTALLDIR + CALL :fn_UnsetVariable WindowsSdkDir + CALL :fn_UnsetVariable WindowsSdkDir_35 + CALL :fn_UnsetVariable WindowsSdkDir_old + + REM + REM NOTE: Reset the PATH here to the absolute bare minimum required. + REM + SET PATH=%TOOLPATH%;%SystemRoot%\System32;%SystemRoot% + + REM + REM NOTE: Launch a nested command shell to perform the following steps: + REM + REM 1. Setup the MSVC environment for this platform using the + REM official batch file. + REM + REM 2. Make sure that no stale build output files are present. + REM + REM 3. Build the "sqlite3.dll" and "sqlite3.lib" binaries for this + REM platform. + REM + REM 4. Copy the "sqlite3.dll" and "sqlite3.lib" binaries for this + REM platform to the platform-specific directory beneath the + REM binary directory. + REM + "%ComSpec%" /C ( + REM + REM NOTE: Attempt to setup the MSVC environment for this platform. + REM + %__ECHO% CALL "%VCINSTALLDIR%\vcvarsall.bat" %%P + + IF ERRORLEVEL 1 ( + ECHO Failed to call "%VCINSTALLDIR%\vcvarsall.bat" for platform %%P. + GOTO errors + ) + + REM + REM NOTE: If this batch file is not running in "what-if" mode, check to + REM be sure we were actually able to setup the MSVC environment as + REM current versions of their official batch file do not set the + REM exit code upon failure. + REM + IF NOT DEFINED __ECHO ( + IF NOT DEFINED WindowsSdkDir ( + ECHO Cannot build, Windows SDK not found for platform %%P. + GOTO errors + ) + ) + + REM + REM NOTE: When using MSVC 2012, the native SDK path cannot simply use + REM the "lib" sub-directory beneath the location specified in the + REM WindowsSdkDir environment variable because that location does + REM not actually contain the necessary library files for x86. + REM This must be done for each iteration because it relies upon + REM the WindowsSdkDir environment variable being set by the batch + REM file used to setup the MSVC environment. + REM + IF DEFINED SET_NSDKLIBPATH ( + CALL :fn_SetVariable WindowsSdkDir NSDKLIBPATH + CALL :fn_AppendVariable NSDKLIBPATH \lib\win8\um\x86 + ) + + REM + REM NOTE: Unless prevented from doing so, invoke NMAKE with the MSVC + REM makefile to clean any stale build output from previous + REM iterations of this loop and/or previous runs of this batch + REM file, etc. + REM + IF NOT DEFINED NOCLEAN ( + %__ECHO% nmake -f Makefile.msc clean + + IF ERRORLEVEL 1 ( + ECHO Failed to clean for platform %%P. + GOTO errors + ) + ) ELSE ( + REM + REM NOTE: Even when the cleaning step has been disabled, we still need + REM to remove the build output for the files we are specifically + REM wanting to build for each platform. + REM + %__ECHO% DEL /Q sqlite3.dll sqlite3.lib sqlite3.pdb + ) + + REM + REM NOTE: Invoke NMAKE with the MSVC makefile to build the "sqlite3.dll" + REM binary. The x86 compiler will be used to compile the native + REM command line tools needed during the build process itself. + REM Also, disable looking for and/or linking to the native Tcl + REM runtime library. + REM + %__ECHO% nmake -f Makefile.msc sqlite3.dll "NCC=""%VCINSTALLDIR%\bin\cl.exe""" USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS% + + IF ERRORLEVEL 1 ( + ECHO Failed to build "sqlite3.dll" for platform %%P. + GOTO errors + ) + + REM + REM NOTE: Copy the "sqlite3.dll" file to the platform-specific directory + REM beneath the binary directory. + REM + %__ECHO% XCOPY sqlite3.dll "%BINARYDIRECTORY%\%%D\" %FFLAGS% %DFLAGS% + + IF ERRORLEVEL 1 ( + ECHO Failed to copy "sqlite3.dll" to "%BINARYDIRECTORY%\%%D\". + GOTO errors + ) + + REM + REM NOTE: Copy the "sqlite3.lib" file to the platform-specific directory + REM beneath the binary directory. + REM + %__ECHO% XCOPY sqlite3.lib "%BINARYDIRECTORY%\%%D\" %FFLAGS% %DFLAGS% + + IF ERRORLEVEL 1 ( + ECHO Failed to copy "sqlite3.lib" to "%BINARYDIRECTORY%\%%D\". + GOTO errors + ) + + REM + REM NOTE: Copy the "sqlite3.pdb" file to the platform-specific directory + REM beneath the binary directory unless we are prevented from doing + REM so. + REM + IF NOT DEFINED NOSYMBOLS ( + %__ECHO% XCOPY sqlite3.pdb "%BINARYDIRECTORY%\%%D\" %FFLAGS% %DFLAGS% + + IF ERRORLEVEL 1 ( + ECHO Failed to copy "sqlite3.pdb" to "%BINARYDIRECTORY%\%%D\". + GOTO errors + ) + ) + ) + ) + + REM + REM NOTE: Handle any errors generated during the nested command shell. + REM + IF ERRORLEVEL 1 ( + GOTO errors + ) +) + +REM +REM NOTE: Restore the saved current directory from the directory stack. +REM +%__ECHO2% POPD + +IF ERRORLEVEL 1 ( + ECHO Could not restore directory. + GOTO errors +) + +REM +REM NOTE: If we get to this point, we have succeeded. +REM +GOTO no_errors + +:fn_ResetErrorLevel + VERIFY > NUL + GOTO :EOF + +:fn_SetErrorLevel + VERIFY MAYBE 2> NUL + GOTO :EOF + +:fn_SetVariable + SETLOCAL + IF NOT DEFINED %1 GOTO :EOF + IF "%2" == "" GOTO :EOF + SET __ECHO_CMD=ECHO %%%1%% + FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO ( + SET VALUE=%%V + ) + ENDLOCAL && SET %2=%VALUE% + GOTO :EOF + +:fn_UnsetVariable + IF NOT "%1" == "" ( + SET %1= + CALL :fn_ResetErrorLevel + ) + GOTO :EOF + +:fn_AppendVariable + SET __ECHO_CMD=ECHO %%%1%% + IF DEFINED %1 ( + FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO ( + SET %1=%%V%~2 + ) + ) ELSE ( + SET %1=%~2 + ) + SET __ECHO_CMD= + CALL :fn_ResetErrorLevel + GOTO :EOF + +:usage + ECHO. + ECHO Usage: %~nx0 ^ + ECHO. + GOTO errors + +:errors + CALL :fn_SetErrorLevel + ENDLOCAL + ECHO. + ECHO Failure, errors were encountered. + GOTO end_of_file + +:no_errors + CALL :fn_ResetErrorLevel + ENDLOCAL + ECHO. + ECHO Success, no errors were encountered. + GOTO end_of_file + +:end_of_file +%__ECHO% EXIT /B %ERRORLEVEL% diff --git a/tool/mkvsix.tcl b/tool/mkvsix.tcl new file mode 100644 index 0000000000..a7517786c5 --- /dev/null +++ b/tool/mkvsix.tcl @@ -0,0 +1,419 @@ +#!/usr/bin/tclsh +# +# This script is used to generate a VSIX (Visual Studio Extension) file for +# SQLite usable by Visual Studio. + +proc fail { {error ""} {usage false} } { + if {[string length $error] > 0} then { + puts stdout $error + if {!$usage} then {exit 1} + } + + puts stdout "usage:\ +[file tail [info nameofexecutable]]\ +[file tail [info script]] \[sourceDirectory\]" + + exit 1 +} + +proc getEnvironmentVariable { name } { + # + # NOTE: Returns the value of the specified environment variable or an empty + # string for environment variables that do not exist in the current + # process environment. + # + return [expr {[info exists ::env($name)] ? $::env($name) : ""}] +} + +proc getTemporaryPath {} { + # + # NOTE: Returns the normalized path to the first temporary directory found + # in the typical set of environment variables used for that purpose + # or an empty string to signal a failure to locate such a directory. + # + set names [list] + + foreach name [list TEMP TMP] { + lappend names [string toupper $name] [string tolower $name] \ + [string totitle $name] + } + + foreach name $names { + set value [getEnvironmentVariable $name] + + if {[string length $value] > 0} then { + return [file normalize $value] + } + } + + return "" +} + +proc appendArgs { args } { + # + # NOTE: Returns all passed arguments joined together as a single string with + # no intervening spaces between arguments. + # + eval append result $args +} + +proc readFile { fileName } { + # + # NOTE: Reads and returns the entire contents of the specified file, which + # may contain binary data. + # + set file_id [open $fileName RDONLY] + fconfigure $file_id -encoding binary -translation binary + set result [read $file_id] + close $file_id + return $result +} + +proc writeFile { fileName data } { + # + # NOTE: Writes the entire contents of the specified file, which may contain + # binary data. + # + set file_id [open $fileName {WRONLY CREAT TRUNC}] + fconfigure $file_id -encoding binary -translation binary + puts -nonewline $file_id $data + close $file_id + return "" +} + +proc substFile { fileName } { + # + # NOTE: Performs all Tcl command, variable, and backslash substitutions in + # the specified file and then re-writes the contents of that same file + # with the substituted data. + # + return [writeFile $fileName [uplevel 1 [list subst [readFile $fileName]]]] +} + +proc replacePlatform { fileName platformName } { + # + # NOTE: Returns the specified file name containing the platform name instead + # of platform placeholder tokens. + # + return [string map [list $platformName] $fileName] +} + +set script [file normalize [info script]] + +if {[string length $script] == 0} then { + fail "script file currently being evaluated is unknown" true +} + +set path [file dirname $script] +set rootName [file rootname [file tail $script]] + +############################################################################### + +# +# NOTE: Process and verify all the command line arguments. +# +set argc [llength $argv] +if {$argc != 1 && $argc != 2} then {fail} + +set binaryDirectory [lindex $argv 0] + +if {[string length $binaryDirectory] == 0} then { + fail "invalid binary directory" +} + +if {![file exists $binaryDirectory] || \ + ![file isdirectory $binaryDirectory]} then { + fail "binary directory does not exist" +} + +if {$argc == 2} then { + set sourceDirectory [lindex $argv 1] +} else { + # + # NOTE: Assume that the source directory is the parent directory of the one + # that contains this script file. + # + set sourceDirectory [file dirname $path] +} + +if {[string length $sourceDirectory] == 0} then { + fail "invalid source directory" +} + +if {![file exists $sourceDirectory] || \ + ![file isdirectory $sourceDirectory]} then { + fail "source directory does not exist" +} + +############################################################################### + +# +# NOTE: Evaluate the user-specific customizations file, if it exists. +# +set userFile [file join $path [appendArgs \ + $rootName . $tcl_platform(user) .tcl]] + +if {[file exists $userFile] && \ + [file isfile $userFile]} then { + source $userFile +} + +############################################################################### + +set templateFile [file join $path win sqlite.vsix] + +if {![file exists $templateFile] || \ + ![file isfile $templateFile]} then { + fail [appendArgs "template file \"" $templateFile "\" does not exist"] +} + +set currentDirectory [pwd] +set outputFile [file join $currentDirectory sqlite-output.vsix] + +if {[file exists $outputFile]} then { + fail [appendArgs "output file \"" $outputFile "\" already exists"] +} + +############################################################################### + +# +# NOTE: Make sure that a valid temporary directory exists. +# +set temporaryDirectory [getTemporaryPath] + +if {[string length $temporaryDirectory] == 0 || \ + ![file exists $temporaryDirectory] || \ + ![file isdirectory $temporaryDirectory]} then { + fail "cannot locate a usable temporary directory" +} + +# +# NOTE: Setup the staging directory to have a unique name inside of the +# configured temporary directory. +# +set stagingDirectory [file normalize [file join $temporaryDirectory \ + [appendArgs $rootName . [pid]]]] + +############################################################################### + +# +# NOTE: Configure the external zipping tool. First, see if it has already +# been pre-configured. If not, try to query it from the environment. +# Finally, fallback on the default of simply "zip", which will then +# be assumed to exist somewhere along the PATH. +# +if {![info exists zip]} then { + if {[info exists env(ZipTool)]} then { + set zip $env(ZipTool) + } + if {![info exists zip] || ![file exists $zip]} then { + set zip zip + } +} + +# +# NOTE: Configure the external unzipping tool. First, see if it has already +# been pre-configured. If not, try to query it from the environment. +# Finally, fallback on the default of simply "unzip", which will then +# be assumed to exist somewhere along the PATH. +# +if {![info exists unzip]} then { + if {[info exists env(UnZipTool)]} then { + set unzip $env(UnZipTool) + } + if {![info exists unzip] || ![file exists $unzip]} then { + set unzip unzip + } +} + +############################################################################### + +# +# NOTE: Attempt to extract the SQLite version from the "sqlite3.h" header file +# in the source directory. This script assumes that the header file has +# already been generated by the build process. +# +set pattern {^#define\s+SQLITE_VERSION\s+"(.*)"$} +set data [readFile [file join $sourceDirectory sqlite3.h]] + +if {![regexp -line -- $pattern $data dummy version]} then { + fail [appendArgs "cannot locate SQLITE_VERSION value in \"" \ + [file join $sourceDirectory sqlite3.h] \"] +} + +############################################################################### + +# +# NOTE: Setup the master file list data, including the necessary flags. +# +if {![info exists fileNames(source)]} then { + set fileNames(source) [list "" "" "" \ + [file join $sourceDirectory sqlite3.h] \ + [file join $binaryDirectory sqlite3.lib] \ + [file join $binaryDirectory sqlite3.dll]] + + if {![info exists no(symbols)]} then { + lappend fileNames(source) \ + [file join $binaryDirectory sqlite3.pdb] + } +} + +if {![info exists fileNames(destination)]} then { + set fileNames(destination) [list \ + [file join $stagingDirectory extension.vsixmanifest] \ + [file join $stagingDirectory SDKManifest.xml] \ + [file join $stagingDirectory DesignTime CommonConfiguration \ + SQLite.WinRT.props] \ + [file join $stagingDirectory DesignTime CommonConfiguration \ + sqlite3.h] \ + [file join $stagingDirectory DesignTime CommonConfiguration \ + sqlite3.lib] \ + [file join $stagingDirectory Redist CommonConfiguration \ + sqlite3.dll]] + + if {![info exists no(symbols)]} then { + lappend fileNames(destination) \ + [file join $stagingDirectory Redist Debug \ + sqlite3.pdb] + } +} + +if {![info exists fileNames(neutral)]} then { + set fileNames(neutral) [list 1 1 1 1 0 0] + + if {![info exists no(symbols)]} then { + lappend fileNames(neutral) 0 + } +} + +if {![info exists fileNames(subst)]} then { + set fileNames(subst) [list 1 1 1 0 0 0] + + if {![info exists no(symbols)]} then { + lappend fileNames(subst) 0 + } +} + +############################################################################### + +# +# NOTE: Setup the list of platforms supported by this script. +# +if {![info exists platformNames]} then { + set platformNames [list x86 x64 ARM] +} + +############################################################################### + +# +# NOTE: Make sure the staging directory exists, creating it if necessary. +# +file mkdir $stagingDirectory + +# +# NOTE: Build the Tcl command used to extract the template package to the +# staging directory. +# +set extractCommand [list exec -- $unzip $templateFile -d $stagingDirectory] + +# +# NOTE: Extract the template package to the staging directory. +# +eval $extractCommand + +############################################################################### + +# +# NOTE: Process each file in the master file list. There are actually four +# parallel lists that contain the source file names, destination file +# names, the platform-neutral flags, and the use-subst flags. When the +# platform-neutral flag is non-zero, the file is not platform-specific. +# When the use-subst flag is non-zero, the file is considered to be a +# text file that may contain Tcl variable and/or command replacements, +# to be dynamically replaced during processing. If the source file name +# is an empty string, then the destination file name will be assumed to +# already exist in the staging directory and will not be copied; however, +# dynamic replacements may still be performed on the destination file +# prior to the package being re-zipped. +# +foreach sourceFileName $fileNames(source) \ + destinationFileName $fileNames(destination) \ + isNeutral $fileNames(neutral) useSubst $fileNames(subst) { + # + # NOTE: If the current file is platform-neutral, then only one platform will + # be processed for it, namely "neutral"; otherwise, each supported + # platform will be processed for it individually. + # + foreach platformName [expr {$isNeutral ? [list neutral] : $platformNames}] { + # + # NOTE: Use the actual platform name in the destination file name. + # + set newDestinationFileName [replacePlatform $destinationFileName \ + $platformName] + + # + # NOTE: Does the source file need to be copied to the destination file? + # + if {[string length $sourceFileName] > 0} then { + # + # NOTE: First, make sure the destination directory exists. + # + file mkdir [file dirname $newDestinationFileName] + + # + # NOTE: Then, copy the source file to the destination file verbatim. + # + file copy [replacePlatform $sourceFileName $platformName] \ + $newDestinationFileName + } + + # + # NOTE: Does the destination file contain dynamic replacements that must + # be processed now? + # + if {$useSubst} then { + # + # NOTE: Perform any dynamic replacements contained in the destination + # file and then re-write it in-place. + # + substFile $newDestinationFileName + } + } +} + +############################################################################### + +# +# NOTE: Change the current directory to the staging directory so that the +# external archive building tool can pickup the necessary files using +# relative paths. +# +cd $stagingDirectory + +# +# NOTE: Build the Tcl command used to archive the final package in the +# output directory. +# +set archiveCommand [list exec -- $zip -r $outputFile *] + +# +# NOTE: Build the final package archive in the output directory. +# +eval $archiveCommand + +# +# NOTE: Change back to the previously saved current directory. +# +cd $currentDirectory + +# +# NOTE: Cleanup the temporary staging directory. +# +file delete -force $stagingDirectory + +############################################################################### + +# +# NOTE: Success, emit the fully qualified path of the generated VSIX file. +# +puts stdout $outputFile diff --git a/tool/win/sqlite.vsix b/tool/win/sqlite.vsix new file mode 100644 index 0000000000000000000000000000000000000000..4bdfda5c7df1cbd70227f33bb4b2200a7b77c25e GIT binary patch literal 32802 zc-oA3b8sg>)8;R>ZES4YwzaWs+jcg|#UQ8*v{6} z!pz0dz}dpi_J1=*lKVf6$^YNRwk9sljt18M(+TQ7bw~hn>bpR>%V&T&5CCuu3;=Nc z|2t7ul(BF&p;Nc8RZ^j|ceJy2>iQ!q-!Fg|dPDXdRy+rae3h>qjvAh486Hd+@18a> zFK1xFe}0WlH2ibj{5MIY(=%f&E$byM&b}69b0eQkW-QwerO_L~q!O7-otMAm%w>e& zab~8!OwA5cYoA+3YCM3wJE_1WK+<=VdSduC%Ndp@{wA)T21b1{f5mw;81ofbWWK5^xa+ zuK&$siXNm+W(MOQHB+8K?+*#5H3o(P$)F-c!KuPzQlYJU!2}>n)sppCp~MGb5q3Pp zgB-CgE8G5I&Qnfzv{Wt{3Oq+!HwDtFQ>jf>A6RD2u0gUHlo>wr-S__(p-|V2LH^Uz z{Yew^xvj}jPeCk`W(;P9RT@UhUZmssBB@lYfNv1W|?#RnI>cGBaQ|ChQlPyhh^->!+fvx%+Kzf94&I$5~e z7}#2vnm9STsPx%xFu-;ptnwoc$CfQUv%t#v1LH;N%Oo`iq^A@^ zRONE5V^3PrR-r0r#Z*mHvuxmm&Uk+RxlfGM z#|Gt&ZRoT)jdiNUTn+r`o|;ycBTcY#r4eExS=o=LoN5NBXRrd_LEUJE&Fh|$TY~%6 z6^VP-605!DlhtMRCX+#rI)?+kqEM5LE2D@zm@NV*O?Uk!vE9VmXNHdPt0QpIS&m#C z-$??&GGO$|+TxVS?TP)q`FcX|e>8h;KzXUNJCJ^~+&iv*Eak5zcucTbs)Yz+TV}Nw zcGw=do+$4fQ%CFlY?M57VkzN)n4k7l|8(*H7X*R-LC{#|Rlrd>pdJGO06<3g4=4cu z3!{JNv$r(^LPof{jZlyihl9rc&!q(?DIuctZzlYYK!X1pojg4s0RU)u3t?de1#>%R zJ128HdqPQJVL}B*J5vj569B+{Jxke4MfnV!_htK0NIKj z3Q;PYC~pl-u@6a96clGPHyk83);}6ekp?yrdKKc3C_gr+AUtyXW6!I=YPs{}cjmn8@kt7ZBjpmxqU% zxEG=u0OY;^0}1Gr&FE#o4f{bj7fRCx@(%{;bxz=rhV(}T2zbT{6$1psfc&#k$&>-P zpaA^|Bf|rL0xdwF-0ye+;GgxH<^=@MN+Lo7%1r0L-}ol{0FQq5usB0II3< zASYmz7Qi5>ZYlw&Z2|O7Bf``JAYlOvis2!Y08lT0{^+k??ttJl0IJx%I?o+-HR1`? zzeuIk^R$t0iUw#w(mFt>tJC3AOiN-=qp}$Q8>9=+^?RgYF$J(7>^@8a0J#Zh|4#ex z7Lu_bx@O?B>VgK)K*>m=t`=+69!1m_`_qX}ZC%pzW*M-S- zd5JQuM-XTNR;AxzC52VPrKdw zBmqo10pg&qyZw`oGDWyEf1rX5H;?1QKU-jaKJgZa2PF;LG^kJy6piDOLdGuo~6kVHJp3*UjTsn4!gcZ3P=!t^Ps&M zx1SsSFY#PbfWN8a9|r(HSA>L4WxRoZ3U z1xF!K42aglfea%xe#Js!q=mc^^+|vtN0AVYg`+AGODC{OFe*i=5UNVx-SavEbB1Y) zwI^_o0+<3nLp#M8lLG1$c^6@ugxgBlv4h3(VP=h;8Pns?b2DZg8?kw#+44?iE6fqr zWC|0D~7Ra)hafAt)14MhF*g)Nc z2o3NBB{XC-~zLi_P0A{W_y5%V3ef{*^ekZfsQ#!I?xuNIe>Im~}XC z$b5)%NOZ3SonfDaBm5eW!GOIp6aVCD6atiY31`8L87BmuW zMuC-q34v*b<%U_4DpQQL5QR0O!obdWk$RGbkY=ZEy3DikZkFS^*O zuS&9tyF@#Fe+0k_j!2PflZ%_hO@n2fD6c7Rl|YxE%kpwPRnwJQ72)J{h`9CGmRzT1 zckB9R%h;7{dvu+=;)&Z&G8g0iN%N^L|Y7NACMf_4BHGBkb#pCkx9#*%U-7|$+i_!7IVvR%ZyA- zPUTN6r?F=6GOjS4WSnHIWbCx)Yr1RFG?zBFnn>0kY8L;#Ztk=V(d7JHq@k**(;!xr zRYkhoQPoj`RMIAwC|8laY&KAP*F4r-)`C@gvLg*?J*6!hXMgjDI|T<^U!Bq(EjM5dne$TEHK#p58<~ zvHV;cCeQV2SAx;GZGvcmae-BVM}1X9=A)PKRYWf*snZG57VseozNgEx5C+EvQ3JlP zY@Cx_Td`XbBrmhZgZQ$PCFv+B7a4;Gt3y}IcsR8SgH8R=`4BH+1pv#`G@ID ze@`xHWNAoROXG6VQB||qT6gb!UOj~EXYIorcwwZ{kLuWao+5&pJST~UlrD-!k4?3ppy0cbD7Y|>OnHZTtsu! z7EE3i-zftpvz5V>jh^mGXv4(I)x{X}Cn4TJsGLYPvDxh0?AX+GqS7R!{(Hzas)Zgu z8Dh+;A-)pqH!XCtQ1PjXCdCRBM7^1bx@pf;#5m{QifrnstI3A(jd=FVo1C93OM|wMQ8zGB(EL^@HrY@U(WC zl#ESJar3JbsywQ^tFT?qZ#5aLyxPuP<9KyGvs^B1Xm!4P@r`wFr~;|VE}1Twd`NyY zyzo~?l%Ku+{jkxglCyER8UdLH`GWWb-@MYcxP&*)tD+RQOno5^KSI#`ops|z3&#eh z8k0G^|I1#)=QYigCT`WU6{X@%8t6hGQZ*KW~ z+w)U=g8(6uh3B`2)Pu^H#rj#`LZaFIOmtRqmX9yp+ot|TezVt!(e#cbg56C!qVwLo z=ugxMcPIC>_I<1Kef`D}ih8ShdJUJJ&AIbA&v)X2{76S;M|yRewpH7;XIGP#>B|{T zHv9C}W0%Jr`p@!GHYe{^*Mq0s%h1cy4*Hg_Bl*|#M8}#N`E^yNe5c-{z?I;d@K)Fo zzt;EW>dmH~Wv^TA!`!C$3wTJ-%y+_59D*=dTw2^jC|u}8HU}Rk=RUvV*V$)@@Qm>c zSvJOZ{`W*R20Fd(>(a%_^jzv(Udnw+Vvmh?(bswJ1y;?*aQ`rV_n12~qwb^H$5o%( zrW@W(!487_p*Nu)#gF-0-IMZc$wwkqV&V@dNb199W~VPB008PMDI%!izFw3v5rwOY zI_y_c{?2$cD85f6LP7`%ieZQzmq?U_yeN z;s&T(&Xr3u;B>4Pm|AZ*Iy{g&JwP@D7Kks+;BYYRlji{gb)qU|f)E5U4hSNk2GIFT zz~kX^QyoSLWJzO4V@S&pg$?6iw-r@a+N6KLh!c|%NQ^HuU2ss2< zb$wMRAd)UC+%-qSlCG<}@)y16=8cAij?vp0@&pwaK?MWp4eH3IH)@mOU!BUr5^H)2 zX#?#4Y=YzO*fw}-N3N0G0|bK57#f$`2@Fdz=)=m;p9r||#}p$m&qH5M&2EPj%sVQd z30Mh`B9rxtaiqpFqy)GWREEM|ud4pWpMm0_8H7W`gjI_3DXmWL9BO z0<4yig5fLHm$uf>-R+HBp=D4aL2^Aoo%u(DZ1zOY`Ge1=V&BHX${kpEqLi=tz0DkN z2Wva+K?XrIz~lnGH|P|Qz*3MnaY4?&1yUQ}=`U&M9A2HvXHiJB2SA6Gsl@$tdaqZP zoG5yT@39nSp7iH67uv6tW@raQTYa(0rbYM6wj6c|^IcTrg5-$3b0)p<&I*j^^-(JW zUGAF15ok;Eo2WRd0=GpDNl{^VKrY2yh^dCsvc-XxP0-7E&$|Vj;Et;WJP^;_X7=CW zK)4OJY3%{2SCspUdRc+b9S8}K5;j=aR)pJFyKPTN6Jfn&aLn!yV9TWKu5E6LUoTR% zKJ39S0*6$!2pT|q0KO|TEDLBZCjI^2PS;Dl%~`u|)V*vfH^B5D81GdE7SJr@TNZK7 zh455y0(sszIKcPIrqN~;;hamYjuy-A@Ej!yr2-DMk?niBd(Dgh3!>2tQ`aa+usb4( znF6i>bj|qJlnM6jDq_+ZsOres6TW&c)X&*AnXOlQV*KzO3FQ^>8KgaeUL3-kK=?mg zsS?BPhGp3pgx@@Ld~h~tfu(p+UN>9j6#`%;sXd@SI{X3(kOGrm3bk#=82S##Wb%RK zf}KF?LZ>A=2!K2NDrj}FzEHw%eJ3QMD>QP?12FE zf2v}Dq^O)owUB<`fAcp`3GV`kY~r?AzyLr#*ncsF))q!4woWE=&hE}xDuT9~46vOL zqXe)1F-|vC6wr?fsIvvMjb73pwXftWR$a2~nm%G*?bDdSR}1nJt&f zZ$w&rH#K+CtSOrj6BQ%MKEfV#@Hg}`aQ)5vH#AV|c|0#vC;TA?G}dk29BZZ~t0~M7 zBg;s2{65HWozCe9GB!ROd5}Ankn;5J88NqwR%u&4WB%(vJ2)AKV5k}{lnx#zNa`l1 zON9yrsh}Kl!4GrB+N>cq=Mm9|(C%{8yPCgh>~Rd5UE5TrtqbYOiae@JUOc(pr?Uk@ zOCmhqopasz{_tGA${IgqNUZG$C%C+5l zJ~#m1q2c$^bu}IT@Ob_0`};517p#EA;`Gb4dt?St+}`ss#(z^l20E_-1#P72<%R%2 zwc&rE*xu2^)xyN>KP-@qw{SfDB+8+k^+vPJOlO_VL5$76)xZ7_V{`Swe`(S3tNmd< zWjeC@GP=4H5{%P??l7;v4zIettvesbzv(;?qKzxO>h?;A1u|c_+1KhxG16!uCylt zhGQNHB4KEl%W?3wM_5<)J!c--Ser0=fjA-(QYR?7mynnPp)0CZu~k#T%uj3eX|@!{ zDeHvz6<=G1OcQDSU5nQLD)Av`G*AFB@)!s-TlfqR86`s@F0n%&q$K1gC7O~!xl%! z!~&q50U*#l3#9&j(^{bzhyvVckZ=_IKmy^0*mTgfyFe;4WulQlESNy0rt<^Z{w`dA zg2MJR(A;jgS^g-<1xWv3Fb1m7Fa;oiE&%ue3CXqpE-c_Y2f}6BD_wJt`TQq!-2Cv0 z@CX@ZHnh;mUqQWOq$D$WFjvro9h7YnwUFR(wAT<`Uv$+k6C7}lGW*Sab*$ z1s>(!QSod1Az(KIyTil5As-pJP#Wl84^2Gh<3A31|2p4UzUl7NtC{)e3M&MfYzNxU zwfhKKkY^%ob&62v6Wb_p*w?dR=+SeR9vt{1hKIdaDjqosUzeXY7dJ^dh}0jU^2<1? zhb+viF^BNe%i7;l+Ly2fwB1q1C?3NCS_JOodq5qqn>S&rpN5P)xI=uZKYjJ0wyVXH z1G{TSmUapNoJRbauaIGbiWUS0AnEg{pJd(#i=ou0P>l9Bc z9?qcbJP0DqhFU>GO#l76QI(jpq-xYKxtB~beU+uoGI&?2n6wZJfpeM@pUaeUn3K$N zHguX1*_pyunXgbKy)mhuOOVHa7l>Wf3|)zKTxFe-UO~_>Y5}>L(p{^6*2_#AiUm2C9-WP@kHfk4r`|e$JUP2Yt3qRLoxPJ(C5;TE zj1vv}WV>^kQe_cEB_o;`eDTC%18guXw<_GZnx$Q1u;eLf8R|VMt|fSKSc3&N_cN&A2$4!bF*Bc`_$-$~edPF&fX2LGtmDD;4liclr*}Zn`j&@ICQR z#^`g$%j=PSccQP87HZhG7&AF^p+?Xja zqWBrS-P*LHf?1M@MO=46M`?>nm=ZF_&6$nME14Dza*%>V69EWz&iYXA!TV zPI?Z|t&outDi`Yhu|tDCr`b5pIJe2H$!Wd!=1kLLvKlD|m`=W}PqPX8SzDLqcN>$d zNe4c!89^%_><-lq8-dBpel7N{Y;EDLR&7IS=Pzq`*G_j>BdwQ6;&$OcV$x8`Pz#7Y zC_I=>QEETKZ$gnDyd_Rz-g>MiELvg+a&qF7zg_WNV=8~HD2k|#67~|XGSadsGk;I% zPwX3M8u3kVO=wQ6TQSc%uH@U$+S#xtTk|YaEp=L4HN(yA&(q8)EX~`zD<>)oH?ONM zsD`R66Qz)-CwEx#src=1&1uess`}N#cdKq#E}R>g+XfqKvng>qCoU!)E}Wq}OhEu) zGy~~{l!TmIEMA6>R}FV%aAx@Y+GV~^@|@PMW(?zKnRZ-^WD;flWEbbOlH9}{=p3Lt zW#pj};^NSJkc0`TN8Zgb-Lpuub{NLZTGIY4*fd5kzIA&X0gIottN|F z_?&GW?cN^?1jy(@7cA*E)pUk?`+H1aK?N}i2YOCv`e;RH9aZeng8#tu7;Pi{AkmM| zJyaKevxxg`xNjtV#_Lr3j%J4wjMa?QoZJBCPUgUl;*t;xPzd0>K1?lSl+vsDdrdqR zIUHzGaPyDEO|f1jm9*CIYC z1ZaHN!(Dnn+8dW7~g*1T2`Ota^lKIA46 zId^lgMhO9Ju_GlY|Dl)kMtLLJuy~4GV;|H ziz6+I=34tvMqLQUlxOd8N#9A$~XqX`_@4{1Y`Cs-pPS zl0la1RBdnGk4iJiY7sH!xcJ=EhZ!kRyG*r>g?VK`Hc{&icdf;vXJs^K6e6OEG;jXg z*&Vxtcj>QoOeZ|P)~vX>K1-hE?o#JfLe(N0^}XuKxkXbq?_qYm8jvSQVgLxOfLaPe z`7AjRU&@BnO8Y%FY`Pb1C_x@4$EP_`LQ|<0riHohMbgGKIfsF3q7T-_*c6)T03Ml> zX_V;HdlWZqsFhta3_FMJ7Ja2UwbuGp&CVxEmsYtzc|El$b#cz09N8M+CZyyO zyRsa%c2-9=_!T3N(vd2t;YnYWHJz*uVX02x)%xNzD9BF^$|uC2tsN^sc-;gDsGV z^}jt>c?mMtkIf1v#@5ae-p26xe{{`&_sTTW!*VH zOrG;Ja`Us;X62T)RG2M0Tx@7_=-qyk(2m8qn7ElNyPj&eY`Q-;x~Fwz9~?SPUh_P; zZx;MiS06gwT|M%6u6M ze*Av!IO3Tc~|__>}2Pmo=Nc`Gax1X3Jfgd_cd|*U;+XJ10)rR&|ao4@N1s2*;PN|R%4fB zE41bh_>qyN0{<4af|V&t7^>1vh>zD@JJRB^P^Exb`u*HjVOTKu(@K=(Z`aU!;6pB* zd_V{Z?f(JlBZl4p9~p2a@mb&09eQC|)A5`_x-_}z+Q;o0zIF)D_1faO_uPVbndN@t zbM=|Saof4S#QwwOt1(M>T&3ZE%1~2@eTd`;qcD+n9X;f{yDtV_hZ?V9){F1xAFK{{jK?`_Obi{*>MS0kqA={>_5a^gth~o2g0FMV%OM$3t(G+;rG#LIn*e1{rvr3$(DKVY+ zRHp+YsI3B^v%y}mH0z0EK%8Oh?2pKZ{`k5b>4^Md{tYDciL^rtJ5^Q6HWKm0*_{L_ zXN>gBIN4K*4@H(fP8vfU_z%xLN6}=%=%g4Vqy8?71VV;Z*C@Xs8JM)HNl`Mex9qvU(nVKE(*?Wa!EIZ2p2+(h!!F9a9z4Fgfc5~G0A{2kZbRaqd&7s^{q?!fB|UK zKIg!Ioo?kGEzu1b-Uk+|98s3oDsHlr+hz>L!vK0%X)|{Y#0Mq$anc(Z=M1R`a$dDq zJ9Y0tcLg|yWkk-j|<=uVT#Q!}b9)=Z?) z3`Vm%x6cLWtGi<+p)T@<(5n2o_BK`P(?SU;%B0_$z%(GPwSvA3?Y5`2KK2M2Y{;Ll zUj1iDgJY?tH*j&K{(Qj@J@If&nT^IIt}CGM(RcaiLoKp`D7Ma9M=cNqDX@d9DH| zO3*9cwb}+WsT-bLE^2@EVbzx7=IgM>9`EVr>ZTfD_pU@)O%654f|HG2H)%4!%$DE? z5cvL3J#4Uy>Jqq(A+s9xGi7|*=w^VCGHU*L)0`TqBqXWfc@nYwrXD`5H%fKKng=pW zfC87hbKL}Vualf{1prBG*=>Hu)OKT7>{L<-fys1BjObiQE1S7*2ofCULD&ymq`xjs zgMUV?@&n%n-RuZdXGP8gYv(`cIGsNG?+8TZiddNa41cjJ3eYtTA7{T`mw4H!BWYEe zCdB`>zf!%7MS&Ir+IgLwI1L9MCb`aai`#NJ4SkVZ^rqhG5dz>wc?lwc!+<_xEL<(E zS%%J%&706*)Kk`EaCCHMup9aGsBZ~OU1OILZ}OwpS;}NICH2RbX zVFYdaD}Fh&vI9n9M}AU(;EUfSHg)E6Hg?nnGsW?op||_Yhnb`0klM-pN;zS1ga^9+ z7&>sR3c_8Wa8 zPShcZ>0~VPqL!*GFH61FMX{&fxe1Sl@b!_}M1w&2#Q60MtXlL^6t&a32+PL(j!L2v zv@4XQ1!6owj)Puwf_%Z#jJ)<^NL?d5&E3MC;FRJsX{3>2*5Y$FJ>-7Qk2o@W$E}tmq-ucXeKRf3e#yk4+2uZW>;8s;}exf?kILmVA#5%9?X0ZWCx-*B&?if{IO@7L{0m0 z`YJW*(jLR9@D)U`Fob?|*jm{9bh-f~}7YO3| zV)=t%KE)IWF3|9$)Pf?6<+QI%#u7qp?9v9^QJYU(C(=U!!*Q@skmfa2{Nw_=FZMC$ zZMEbIhyX8^(N(f{N3Dta%Jac>VCN9d_h&T9nz5e^E*1Ur{ro+|njgxCznQQplaCCm zP0&%8^3C))AJZ*@{e)7bXW6~lrydJM?$g3~mAK3d>@O=1cfC@EynA(p02v&g z>$z-x7O7y7vCw3fq~E4f#65n;a~w896P~mh9J}@E$A9ycbN2Sr5X80FL;C!p^(hyFF(tBI4;FWrHU zab8{7p)n}ji<0bG{B1F3rVX2D?conkxksa66u_jzUu>dy0=FJ1*M)-Kd$9FJDp~l| zbcT)6_QtlW(DU?D|BAQ70YbZl}$y2{J@~| zGPwZVl{3S#WbCL}XZqK>OQ5^+b-b`mvG8#Bk`bcD{OWZ+vw~71!u>aX1LTJMxxSAv zUPcTUl3$fXFb|lV3|LQX$_Ot83<`We9g4aSErue$PR;=71{HwRGROIfRlBA-Pk-Ru zdFw4Zy}Jt8-T`X415Z3vmB_c4SPWoUjvy&lQT)RgaDN9nZMrqd!JVZ-KE+J8s`*f( zrtN-bigLV&@&&HVUV-cT}#QtGA#%DLf}-;zauAHGyz&$UOtZ;%rI&R879-8jLdJv~w9CSA~!s6tLEbNU{ObG|}oD z;zC?QvS&)OrH~;gJaX-){;aN$3xvLW*rS`@N@4$g=_YMc->te zFb>LbR09q!+MTlM&##%CwLTcH)N^&}!COTSLS@s!U_S^hfnUN5*KB=I=6gh;v^&rS zdE9Y}DPc&;(#}UJ%a9L_bi49xZ7HF~2xGBvAi z3_GjI2q&~|NXw^q&cKOz6liR)INzy+n#2oXkkKztx08{{yAk{e%a=URB99sK5HA!f zWdO}}vcbCxPoM~`unf87`of01q!7-qRUS$%+@EbUW7tcg&g}t-){iVSZ(>MeA9^7j za1HvZD7x&Y=nd~@{+-dyoqPmc5SwVfo@B$K_WNQI6Q&~-1T?&TW?KP=Ks+J646mQ8q-bJTLax%Q zTNGLgeDvX@#_Fs(eqayYz`omRb#@KvKkTg=6k;ll6F4sy3hWv^WRJq-{9gRcv4|$4 zEYiLNZZD#xV@V>VLV^B?b_@C+VwG5x=vwN?9@Xf1<`p7u6fnD`F)>_^p-1v^ke$GM z{3Wi6PcK`i)KlG3a8NyO&OMCU1@{Ar8784Io?E%VNjnt&`Jq4A39olBZp3cW#?&X| z3M2Nvo?Zergx@v-bQNzy;2LmbH5g=Eo70Ue1WKVG1JrT?xcSVFR7|__8Ps-6=>6^GR96zR0f9a0q{?|$+AMwn}(6N z*Nb=O`$D=doNcf-orJ+(fNnN6xP)i_mm05?UYkI~Lp&a$fRa4;<8i)rm_{^Nyb-&z z$2K&J9tN^eSY;63DzxEW%BYWl92oBL80RieT}S{6t^=lvBECpg6}J8sSvWxFegI-s zdxP_E@l3Rk4Dm#^GFzmiLE#&+XYBK?G>@=SB?n6t-i0_=^lMNC@|oA7Houw@SL@QZ zJ}sIC#MYGn#!PUk2-2(MKqZXLDSU_j@0hlMEG70nCRKy)3GN7HZ#d_QD^VcXikD zM#Y5(|E?SA+$~zrB6kf@+#Wz^g4AJThfFaY95Ns3frNuRtZ4c>N+w9#%T{~}WSI0@v6QktK~FlWHy zckkb=eJOt`WXtm-$UoL=A{)C)7Z!LJgLfvT@vfyPN$NIk1LnaH6e`Y&tw%bF_KodMBHJZ7nICZ`G z!6AOe93$eW&cZe7R|viM%z;23oxAA+>RIWzVL%=$dWAlD14i$Az~gRRn};Kt>gv?6bIEAcGgSj;>$Pn(RB+J_qu)3Es)W}7K5{Vc0=l4$1AE2G=to*u#jnC4 z&Rjh@#KG^k;4ONe-G~Pkc+?9gMN1%K$KJ2{S(ha&=Svltx7N;%LXMP#NbhID#5 zHjfcUtvd~sbDYmkf51`ql-cb@-H4QfeJK+7n*lwdE^g4{cwsDV+b{fs1?j}lh9Uuh%p za*SjmbwDe&g>r+fPHn$&45KKzFmPvp5o1Vb;ws_k{*aFmywcraUTtyU@bR}XD;sQN zDK%!jXf!8b9PDWY5C7(97beGHnB6R3)55tJuBDx8x8O`g6l%v$O$L6`a+z098~@LX;t;r8+9hD<+HSZjNB5 zT#RC=l<~Zh*d%)~d&BTrAnftw@fW-T1uznRecw28YZO{j#LM?kC$GgZUq=Vu3p=fz+ z-xVgCf2K;&Tn7T`4A=EE zOZ9@yPco;y?n30D%K#C}*M9Lwt!zuup#rt=PbtB4)0CCvH%<#zJ@2L%%mB>+s)U@g zazqkt*OIrBN|w@X)EUy2=&aOGHKSwYGzSGBg8TEvCxJRZH>O2$BH?G^JH*Rj#I-t=hK*lmqso6e$AgJJF}n)DIL2|#RrxKzr~TsYoo3l zr0dKg{XjS?%4{U0!gBiX^ZIR2YDY1T^c(C^n%gf-b1^ZVHZe*9Nu>OKG8$_C;x#x& z;|{nj@aeit?FuHXJc@`eim%OQ`uSlBpi{=zBz@FA1RHGS#MVc-ywD|Fsp{ zrhX@ix9c=gI#>JyJ&@EZya4hbe81Rq+txRKE3%{cRjaE8RWuEZaG>xSP$n;!EQ^;_ zNu(|-b1me1TupW%8{%~X#Di3lcVd5fd3 z<@qUhyTRF~@r!%i8$yik@_kbw{~Uhc$t$%&Z3vOg-P zHU<4Cfnre;A5%KMY!(KcypPv|)$xt6Kqu~&B<#@sYR<96&7>pJBFZ=3CweCJdFjPw zk63}UC@#tG+)ebZhGk#kxWAfkO2uB&l}KI5fc2fd*@KM(BR{qT0S5)|R(ny1YB!KhNtn+rCDKXhzZFZRMR^jC z>a*{qJ#J4RR}gDL^Ywyhp=pqMi<`_5Pu&W75~r701m&W8CsQwO zFTy)g2qpBlOg+%inPJI=!*;YaKgi}EkL#yX z$b@>^l=|3*L1>~HtFt>EYw&Ei$a9X>-$QJN=P=LS!q!?VXH5*x)>4Jo0kI^iUJWfr z`C5S9I4#Xn=z=F1+3AH#ouH1F6-2Pquli7>ApU zTSl9U4u~5z*pwH}uI!N>Vs4-YhOdO{%dj0g46-{9s7EwPx&&K?{Qzei z&szJgu_bK5-#%Ta=(j6H6}}0&nT9)%c(slJRo!hAysQydJmH~jhCw7Cb|1KL*BhZt zJvGbotx1o3ny?4j7}hBZxm4Ey_Ic8s+Mx+6d&VFs%@-j5QoQg3gy5zE&6k7CrquXq ziO+U9rIi4&Im_}fwHEYi;g-vSPj$B!>cijPFuM@DxDQp4*p|6XdEPcxJIvXRT43<% zMfG%IgZuA2PdVZUf)vWgub^1R;zGxV93u3m(nae!{}`(Y%XO6BjQFn-8#nxyk`Wa; zNUUt&ui8AtK>fP`9-DI4)T@p4;iJ>9KMmUuyiWRVQW~pR=wqdb&t;(X`#30138B-+XCqrImr)oa#aCLMiymLv0?G7>BCKR{=y ziv5ea>7<-QWH}5~owc>+29tr(btMxX;&rYaNrSPMh9vl9DB88Y@H^&TT?R(nB#bje zPR(OPcI7wD{#+V+c@6$Gx+e^m=(PJUzo8;bR^}yQDtNvATKL8UrZOtN3XMw9ty21# zf}!b=4Lc}fqOc=$-f%bSRNaca@OP`o?e>unV1o@9n*YhaPB-9#Cw)DXEj6tR=(pOS z*>Gu6SFQsuwcPNs{tW>{=+KM1{fhnW8ch7_t(e5Lrm^Pr&ZjVV;#>!QD4SE++?k25h#px(7Woo0j;cPtV)a2oMJxpck;mtwh?2Ab;ip9Y&{$kH)J~#WzMxlo|qdv z0JGlzAjkPi({Dp)>uD{#D@m=yYmkFg5A5x+X@E^3^PVW%A)~W07q`CO_iW(=aC7lz ztHrdWQb6%$kutm+^4AGvEhdANx;`3}HYMQ_g{X|yIowTYJk6Ubjx^Q~)>17q8E2AZ zJ;5qpJD+P^8hRf2mm|HkCpT?y zH$80z?0&Auey5-A)e}t!rYl;%xGP>n)Pg*6x*Fqxuw?%}q?}IrVKWP%THayE8dwxO zIxt@`mt23-(vH5n{31MOPQdXzBN zR}ZMG(_;CM>k$0cN=iTjv56Gbg8k*rw;CCApJDWICtk53`3{rMWav~1pQ!n;$;~r< zN^(z1y+uz%mx}%Zue7Ysc9IYW%~0$(WNeD!Tdhe(6xq8GC}2M23q>5+VqvgrHS=UT zwgC$xR$)4bU4DV4-B2gZBh|=dvIA%Js?8Jn4$CdED)DE5=G1!y4m0jsK(g91)??JQ zEn1Rz_r8&0ES3t@J-r++M-}(s2Zfzy5fe+QDyG=1rWn72;@EC*zazOohB)gzX&$yBOd#e0F_(pIdk8-4e}v2MOqx_#uz09 z(j|I@PCZDyT`_y?aCvdpX|o?zNH#?i#G|ioJmgE8oXXo8?|KB~z@@fM0yQroln$*{ zOuBpWFVQzm5FxHrIuglV|^f}_>n+;wD;GuWzgb~b@(s&^*D z-V?#---bM)UM(d2hnhUu&@?@W0t08nJ`?3j;}ixbOH>h}KB*uvXub1+h{`n6>yd_0()ljSl)y+{_sNE`=+u6q*>a3{E*y{NXx67JD<~n%13ok|RJ!pq3-OP0ykR!$ zr^+8Xr{7r!e2Wh|{4EG&&YPhJErHi3MO|~DAVwKtQfdXS>sG08+;ys8{^(vXr-OzJ zi#g~AOE7H?1Ice`P)pGU#w)d3wYvO|E+uG_KebmAgfuVqqk@X&h8Ct4spo33mowdp z8*CC{=L8y5ZSqN1#W(_3?v%|3<)>ATX|WhDDp-p=&VMv4SR5DD!xT}KlxEB6&rgQkhpCF10@mwPfEdOW>0 zp9EqI;rvqaWQk?-2y$f$J(QiRVKReoqSTHiACvrCTF)5xLmJ0AQwA|^aeV5)(})|d z?p@c$I|y53(K9NgsD+c1EVV{N9_F&|P1KFA5>&Gm=_5V#>1|hEW1&6ftop-_L(p)K zO-bBjq{9 z{5?i!teMtduzsGXCD&AhFlLiQ*gdtK2U0X+X~R{9HRDdsS3wxon{8-CBs=03(=Kp% z<3-yo;NCzk=VBB5IkVGvqwN|V%Ds;B2Q%(uaY|yU;l;V1 z%q5{>C)MEvK;I}wW{;N}BRoIO1m%q>WIC0~ZBv3j^at1X$!XGlhxKs>R=q%+t{jTh z@!d4Aj z9e%8267$Dg{c{f6RbKL1ExZO`j|DzZZByB}@|~pY9E=t~VRKjgixNk7j7iy1&O7x| zzoF(u#@zUBeKRFG?W}S+#y>dKqlcL{t|;lVbtjz9pf>8XYrQDZsq_z#PVJ*Yxl+Bj zn&^2`fPYBxe(gpqOVLY@pA;o>9(7->g3?5i7jO_oWmxVqu)m6&vVsTG5he!CQT8&f z0`<5%33;!0bX0muROsfr66ys?<4r>dc2U|~NDI%9haksoTM&;@5drbo$BeJ~fxA$* zTgR!|U04=;zud7`YyP6(=Ua^CR}|D<37*^ZwXB!suz${}x4U6$g7{8Sgjlmj^vFv; zfa5fEH+%s-h6JB0zaZVKN4QZzu_>AMh_$fZ(LTU4orUbY$;g(br{wYp#*d6}Br!V> zX_*MP_D(-^4KNMmHNYX%=TR^04HhsAv`&0Np2bE(_!$F^QNLe?3KQf}aX3N!x+mOk zOt|pLxK06{)o7N1Q7ujs$?gnN|IR;2Bm8tKa{Z&~Kr8nrETJ7vyl=nyhUQq$b?{En zB0J`yC+&LfP-92WiW7Jp+Lq@m=Q|PPnHE?O<{zl)lMN5)YckT;o3#U^fIr-%OPkx}?^(D03=nw3r-MM}RpEF3)F57KC=)ipbxqRMSh0E0 zynS!Z)e790iM;UqzI@}pFQInm*u!d3By(s+kV2-~8^sBEQ$MbM;PPAZfS)DBt6>2a zCb$*-sb{OVv=04RcDns;A04pVEYRp}zoiBSuy(a3fSWAri@7VW_n|5ltBY@6`y6wPZ13QsB_l%%!f>P(F#oCXc zhCt>y>)%@}WMfY*@0@_^g?FG&`19nstZ-`a0rSi*rS`*G!#zjw^Fp_i$o#D4t=bp# zHhN~V50@aP_t?icoG^7`5g)tAqJLaMZrG`A4%95%LN?ZAm}>&|l4h6gIIp=eh>aH{ z0_CLZ7bqF@Waj7}Og;3E&TQPWaPm*?A+2yIbINQ1dBnOb_%e2&j;|#?V-~io7iyp5 zQ$1SzRh;lrKGdnTD0UhV%-HYA7kl>Q-G^_6>)^o7zE+O{*3LvlA;^;V`xf3RGCj~< zg97%i#@K3E>q&5SPw zTUM3p5cDgQyFiph01tcKBbLxj9jROMLgoddcx~nUM{hpc;s-TnF#9kVWTHJX6z-8n zmmZV^|Ku2ydTf4= zFxIxE*uR9=V@CktS52E?gM@9f$+;Q$wWB6do1*3N7@`d^Z*E*~;isP+9w?Z!if{Rv zY-Wy|Q_g^CL5Se?^3~!YDZ0`&V${N88B^`Z!u11ARqh@VqYNAI@>x};l$b4^M?%vvH%h;IAuJYQ+H-(SY{k#kBf))yx`;ogE?3OS}#N--z{i1rr~X%AV48=3f-xuG~B5TVvKtEDNEc*t=kHq zn`CH7D7+<8z%C(PVS)X^MlvncCTc70_CL@pu>Wx-N7T;O*n1 z^L?+CD$`s!x)t`N$M{|Jla&vUT*Pf=8Pdp~^hrSaPN2ldt?>2BokY@SIW~YO@p`7&D@J@1Cv=;QCo}2HT?h6SV1TXZ-rLAiy8XVxOnH@d@$QEBO zl#?e}N*ZKQJ5@`~A@?suee@kvYHO~+O7^g>#D*~&_jIo+^q|hdwRPu)lF#dEG>@Fd z_iQgAh{+G>n7q!7#XYE^Le4SDSt%o0ti1c1-hGr;!0OoF=b`GH6SV8ahnUR$=BF2S z=2?I}cY!f`tJ}&J*Yepw4HECx8 zsyXW5Ez)c!NC?in^&TC5KPs?%vyh>d#y-%=p-sd#h)7R(C1A~g&oMxhx~}8S0DOk_ zZPDhglT0mb@7sfq1?Odc@p}>Cz&?9utTK@2HfiL3|I!kuH|Lsbx0-uZDaNr|Nfh0f zwT*L)XMV>!bytS|pb7=1)}AFq`Ucj-2z_;IuJ1ACx2l6F$tZ$x_+q~Q9=%yTpG$8) z?&RXb3ZikBsR=!gvQs62b3Ye0UF`4KW9YuuT~8>VEY|$b=`KeS6^gOXEL0W2S*TlD zsAEsZJpd1W=&vkT-ah=rDF(Aa_}d7CvrwA_4UAcvM49i=es6Q%pZ(^zweD+2Q8J)C zK6K%528nq!)U)ydDUV8pXPP`~@|XM1TfyO6j@EqBwGjb!StZE2r^kpsi@HStfalnj zYk`aTKn6sLQT;zYrGWVRl98!>)DLs=`oa2daAJNFYN83NO_e`>t2=DFQ*e9XZ+ zJHkWt;re&KUTl$6iiEf#@8shyzc7y7mGnreob3>1L&IVKsGz2&}L-bNY4RNsZ9M8gAJ) z{n|EM$?8(Ta`Z_pgHRnzPnaLGHd+V7nTK0c^w6}zzGvFcj$8dK3mvRXN3}Fn-qPe` zg3Wa5BCJ3C`8yV4GCu8rI0x6aE}XUxO+Dzj&%pBmm!*N!mKfe*?Ksi%91v1moen1fA1&Ajj zR9>SbnV>VKHVmpRR?aSeAxDB6phR}j+xKUB_`uDduV}T1FZE0~V7%pXZK{`@IzQXeuVAi0ETt4fk{-XTRo$}x_>sKjqX*3f{wWOmg(sG-DiNylnPu+aJOCW zXf;Wm!l}tIq+#K(QTG@|Ld)puj%l4FFx((U5T+70{P!_qe&G#U$rHgIAF2@?#qnI zqq>6>nKx^Rdh-iSs#iFk(hN?Y$mWDR5a)&(pFPIFNUd#eiIhmdxOr>MUW*^i5Wa04 zbl)T)O`n`hK-*NG!a;-#feA!A$UM5!dI@Vu?0YvBW?~oAe#cbj#YAr*vq3Z}y(k3H zDa80`gT&|u%KyXR!0-OkmbKL$%&j{*%Eqs03<}k@h=q&@F zCE^?5YRTkr`?{i)$&+Z5!dxcgcRB3Ns<4%$&G|=#rIo2q9L?5p@qHDZ!O>N>Y=;k4 zWYkjrv@!4EszT`eRPP(l>&@DML5MqESS1{@aWtB8%k)^Jh%{e3ljnj*d!x}?&uhN> zUf$R~nSgBqY+-9eVN*Q$4!c2eU>AZ2XKMm(Co zGOvKFBCnxjD*Mp$&g$aqM5f9mtvINbJCbgd2ZhNvd};1f7yPGLlNh-7o{*@`_O#zW z!!kjr7}vE3;fLP%xkAZ_VoGGanS8&__2Q$?%MA`<`>grf{ps7a)EU)TQH$Io&@s~QtEbM&lso?QtWL#B?);nDif9XNgZK$QgfKVk@9eq}U@`LbhquY*xS zDr>Fr3LZEn>Xpe`o_h$V>n!G}Ne+am)1nVR1c(+%s|=(LHK@t+ErX+(m@)=ZKuhO=r+gi>h%a#VNd%?=s#i;1@?$e_8N_3mOMv z6#6oX9h8TUi^X;nh0R%j9F>}?W z*S&V9{NY({fwetNe)j60 zXM7~y>ls-(kE(j&%LP_^!#O#;djF}J zHkpiewvHOUbtEk^t+!8}lpXntWi(7Gfdb{OI-29$rLOvX1U5n(xW7DrPQzN_L3H9= zW-qGR|HCTS#4|(y(8K$&o&DCf8tCBL$DKISfz$4H7s5Hw%2?=~{Ps-d*rf$K|4seC z^|*(>`wLe4&#HFOC-yl;#_%)?7D-1Zx&b?cU<GB4t5niK8#8})J?#a=h1pU{@jf@BN%ts=N)Rp_PX8>$#p5XmNj z5mqK6UQyh{DnArw2dsM2V~Sysp}Uf3Npdw9sYzN0auCBPk(4+GtD=wKEY+w)dsQq9 zTiT>}JLYyrBJ}(k*um%LN}D>Mu-Bq@HB9DR=&2+Dx`MG&y3{?E>_UWdVvJ@4@am+K zJuDhSM|dP6!s!rnC+s!A|0lAPqezX0{L8rK6_E@SnLcWLXg0L$e&M0xmdsYK#NILZ zvkhP5In%qRrD}lRvvsyMEikdNMVI`F=KOe*dTl~$EAl%hmCz$Fx#1UPh9OPOHLzp5P>Ig-@R=>cj-GHxj-<=Ie)lnJCmG|G0R}%a+BX zNcQ|e+3gH6fm|pT7Cu!-@D-XYEcNGc*6NSEA%s4!I4aD#9g#C$Dw$^?qQL;rqS+Dm z<}l~%xHe~x-v{%nBq`!ATcYt>aIBlKtz%Sc$gbJMDI)o_ku-k8CxoiZ+|MBa)e>%{ zsp=u$Z}PnDZ1atYGM)$xgwXtu*9j!S4C((qNU`g^UYTB(eSRq|aaAw_C5VIN-rao6JJ=uzCZ4^oEYv1!=;m5Twq? zBUXiJfbl*?G4X{|f@KxJRsX09&x5fJ^<+%_vS*Pk6aJl9vuuQHi$!J3`bF6_bdf}X z4%I&4g=|+ucXt4yXI05OZy>>yx3GEC-!w=Kf@nd)Vcarj)?)IpPB)KuKlLoK4xnXB zgK^B+0i6+qvzWuK@0EA|Rb9F8F+eiL~(_c+w|g)Sw|!AB~?m5xP7{~1j^Fk6%pxT+PsLpEB zDN`w3k*_)|YI}3d{u_7EPQ#uh><;KRC46Y|Pdd5bmqTa+m9XPJFgjAr0+M^m|U)Z6<8}?Xn0Mp0yWKJfT`>_rrMx zu7V(k!T`LYoHUSj3(DUU@{I?=k4U5s(v>1i;B1nO#xTquBN9{xwS@Z*Tq->bZk}S; zfm^-jV|C^%D~F|0DXL$vN4q-y(xxmZs4J9ylsum;u~0eg(Z-K)DVff_^|BeuIiI*j zL4-+8H~{iiSij=<@m%~BRvcEU_@I68`MbOn=hhph_=wYc1@W@VWP6|6WBMoKJ~NU} z2w2Cq?9u3ThijX5)%B@jCrrqc6q{M4jMGb^-w!8GG3t5PveWyITV3=)pofo)69STx zo(=4QgSu!%J3F-Tez{*2`C6-67yDpKbGuSsx8PMv(GjSK*qv(5fWDKNp@F2~lQ0HB zBOoBum%tVv7SqSgFb=ISa|FDMQoGvXJ1UqOYUDj#E2(rPUl>$jQvNJk)s^*FKD3V+ zcZVl;2WhykZWzN|tsp{HFEX?s`Z;}kAm@jYd0(iwZYCER@|N3V@1C zvb+*3LjPE(>X^uSE)#tNo_yno5X>(G%=#GD!TU@W<|1Z%9miXwPIPazL!+JhICp4r zl{SZncYhvC~(|Rui9Q zG6&-4lcVgfCj=@qSVJ{QRIaYjKwL+9&(a8kz+N;s-+K}B+6$lnX>u2~;uamfE9u}& zmlUB;mR0Y^r;4rwdHkzO$1#U#rx|46B;Ft2E5m;4(mba?qc2dRBEjB?3Ws5@G{yzJ zFlue5C|U3^e z_my09@4_|t#N+cNZn#9Nc$swVJtl|;j0q0}T1{L&aT`8gyJ}8WPr0ncpcf*iJCQ&7 zGLEG$Uo?turVT2^%3bfh@EXf}+yG<77fu;8fA(YqZfEgEA!(3ijII=6XO|F-(!m2s zu&u1T7O1yX2bY!6zVW=L=+;0i$~{6po5!v`T?YhOEM5uMzY4OvWAODd`NCjjgj`?| zf1)lfm06iuu<)S9Lka$nG!Mh9g{gLe9r7w~Sx}-}A-|rYe&!!Ncjtg8)6x1?RHFjb z09m4e31cAvsMD9V`ZNX}pzF2pwZ#)aH)u6}85x`A^;MzHVWe+4!@J7InqZjmeo~sH@;8OjCFSsn1_3b}zAVY$QpuXz;V!N0m>D)E zg7EZK*^;t(*pa3~Nf(S_uD(p-8$+msR^mVT#gqFWwlBmpr{rkA1ZD^^N9w5(QAlK+6+2cxok8Q%E{;EDLDGiF z*Z~+~K7U>%%kp2_p|%cyVOxj<544w^rJp|ILM7=^spmp(b5q5-qZjIh_J37Q@JCxU zmgD2(QPub)jz8S9?|^3{3q#(X>$UDW8ul?daU?*<2YcI^q*Xh_8u{73^u@MU1Y6Vy z$BqLIGVXq{n z=)$MuMt>3_e>PDajI(-!GMk*we0<4T3R7A_)CE%NFXI}oZ=kLVr@488Nyf$9!aL6K zlYyAg5Q)-xVO*vVqm0p@I3QnNs~dN8MMC%20$)UK!8~&UKAy>P}{GobWrZaxT)_rY#s75;5 zR0cU$AsOJo&3wbYOHs1@34apyT0LRquhMas9t1+sA4ZWET8UMr!hV;5t4*wXuRW5@ z>&wtui|h=uB-3M`(>lvTgDhx~Fxw9q^*RV+f390k?L~Hy(IBm&;Z)sZW)qtTUEbIoRTyf0 zwa53R`cr7%=UdU_Nb4njWT4Ez<{N5>OsH%w)(u1cG+3ZVF-N0dCbfPoljyafose2> zk!B?(QwC+F+S&z25JIMpTZ5hU{JeBctKtRG=BJa00qsQ&u|-uxVQ36N*mkyppLbOz zN#rOL2%oLdkm|1CJ{bsc!n*t?^n=aM%il%?!`k~e$X=yrXV;120X1)vkh>1_JPGqhfb||ghNy|SPp@MsHZp2t! zay?-PpQN=MVx;Z3S(uEo1he0h{L+xx@PLC9V|OBbnOK4^(A%C>YH6)%6q>e2%03j4Ae-1$=Ate)aRPUMgzPJg5)p+)$*&%!v(z*h%BvSFpF-pd0$LB5#J zPW|j_K{Z>-X`GEj&RNOB#{xc_5`~5wBp!Lx3;9Z2NFYuv-5y;dX3l3Jc71x@ivCM_ zVN@k;k8cN1kwOVq|8>a+hGQ($wPbgnmNljBsES#0`KS^th`*v=qcb9dl8t&gY%REs}D!G)!(J#wO*HjbgPQpKhj69W_uInc^5|%EzeV zB7>JN3{+2!A1q<5?T4ucpRV5XQb}MXUDDkrQAKVGc#yS|ZTu>`qo*#yIb3(Ub00sA zn8GH~1(&HMol@26F9z|5?s!#0d1V1m;cdVkmVC_z=&tSNN9YT+kBdQpOVwoCbId|W zGf@6Hk}b!QD}88~<3TpDq2PbYy0jX){G^D$DYDherz!>?(8?$Op|?R?ykaSJwkf+& zSUxXcU9O}3q*;uQM&($WpA@#|1Cbg&%3bv5Js(k68^t+ZeFe}#rp@#C|0!HONd*(jWdXNl-%NZn;(_rM#jB|Ko1{LjckCnFTHu&SoG;DaF;z$aezsXn5|(4Zdy7 z;b+5(XI5%Q;(y<9WRd#1V_sNS%JHS#>_YHYw&Hu)&k724O?n!6I6sHYTAZJ92lFCjhlP{OM34ux9Dmsf#;99iIw@O$>iI7+$8XiT;%h0X1H;mKG6Kl7P>nw(ptngceFxr`lHo7_N zP+XJvyo)Fz&v5EWAiq3frLJYkDzg3DBt+VahtLb=MjU8(f0&!qCc& zorfW-0nM>OREtTdYeK!la2CEdkAFxi;9E2rTp;LhTtRnhA>1?LxeHj!UG656bCbe4L|e-=RukEjvW_1>q17>)Gsf%PEcJ9W+uL7j#jJd;F0bUI2OHAz zN1}x2JX&i|?U#6tn!K0c`IDVkki)}Q9r>Kc)^(MITC}CXcqGd00#!veNEiibsD|-U zm1J?%)TSSo2I}CVXf6Abau3onPXp)G*cnH74KC`TxB}vp7on&20Lo~_ z1^P6_=Kd0?gW8dbt%!+FCPbxQlV~Up*gcs7c(hnTj$T0i^F1B`&iN)j<6zg& zfoaa_SBlxQuYyJ1X5Q>x#>@q!yldE^k)5_}VHtcu-u>E=df!nvvBe(aO5T^WZxf_! zv;yupVMD7jGHKMBV=|HD=N`XlKWoiJFJ_SnKaqg=E7@hN@H0WXzfqJJ+6v}X&vu1I zq_@g|D~kb2JX-2+U&;V?j|>BW9CP^Z(M?C)*fv_Y5+g89FVkBr>i znQ`TG+5yG~6soPjDUxbNtbxu_&TCnC3+3yCsW>g@&TT>)L_J*h2%1 z@{J-=qn9TH_DPG>s~}BVXbZ|dKl=F6CIq{l*;0nq%5$$WdigV^AbPt3kXbuVfV%^` z#!Hj8!8~WnRGk)rPM7dfHGKbY`kP&5HeUN`C$nH%v^p7k5up;h%$u3n9&rpU`8pts z$^q^byu{3_sRizWe*8k#PH&&;3`L#2ZtH-1^SlqT6Lh}hWdPkNIr>RG#X|>HF_h*7 zWpr?$7mzG(n;OnQRw<}%!R&L&z?FrG{vb5LM4}-zdm4LOmN#bC4M^Ujby`CxR?%RU zru-0VYthK%z*)IAOwpqS_Y~cvh!fdRh#F@_#v z>ru6_W78b4k^-TWW(O)vKHH2;FRK#aLySvBHA@8vtTSQ~SZewTZ*MOlG!<`G50GB~ z?n4+*z&D8AD$NRfN)Ub&c6f8zbcFFGo%%f6IC=P_qa?mZ5A-)Sg&vLQ}P zH&{amlR2adz8MKSTjRMcrBPFLlp{uDA)!8|V_poN*_0_8!ugSyHQi}VxA2gekK*Is zG>vN1G5s353$p1EQpag^|9!~4IjP%WQpeJ-@pUe9aEK9*$?)q@CymlqqFG6qDi6u3 zf5Tjmbc+VZ`2otxIwxYdbx!{XeNhlb;hu5R@`Ap zl(JOn4pJFIGzCmb*&0M}TNciwe@8H*^)C}}neAi|E+rwkcGbo{m-UxSP_QqYxNpwA zK>s$Vf}IV2Kj?doocan#apFvQjBUnFYdOqpHE@c2Yhv}Z>BX-?tFbUD1&P44Nm7~} zRiQn5?Q8E+3grh9&$9kCSjDZ)(;htMz z{cOJjP$DqbwEB`-QLUnplsay62<*+9ECcB^%*`!i64-b|r_9C+j^ycy6G zqLDTYyoiod450xA*@Xr)y76vhe{>+5!x(7!kPK|C=PqFy-~UU4Wj`>@5= zsKMZ@L-=v1s#!ir&{bEk;iD!|4*vF0ZAEVZuohrx#9%=41^Mu*L|b=Hj4p&2j2 zycahD0olk32Vb=Zw-q9~1#bC$xJ{q4EceK}yKNzusIYWwI~6gkB4P9tM(-iFLhv); zmKHkAES0r+!MuSR9jSr2)KAU2dOe6mlZ0Xb;qtb@Bt+jV$0^%{CKF_7jEw}QJ+2k| z8&~XI66V`6Y}JX)IPtB&Vpb6`<&HqeA%8<(mhT!YV}Ra_1`m+Nzx#3K6H(>I-Zqs^ zGMsx@@h-GYRe6*#gA$C@t851G(F@j?POolZ75!683-UO9G&L>ej^|Ps7!I3$gI=cp z#&Yj-r#A7xj`Ys@QQ+=XQ(4d>FdbH6!>A($>{Lj&i70(&CjKx2YHKXWN5k5TS1Nnp z)ow)+Er8YLEW%hC)oleEU#YTk%B`c-rp-K%-Kh<{73>Vo-k2uKPoBUFNmH=!$&ntI zLFIDd+#84p@j(XdHfKnul0s;G%}P5to~Gs{744MM(&?ui$$$^c#X}>%v*x~HMDXVd6_W7w!QqfsC~hIX8->U=_; zT?F&>^VNuK&^>;6yN9Hz(ruqw*I$c7*8H3+gy5p^$au{e1(HHh@Ho>;;Onklh;;B0 zv93RkRt)a_C?-SeMM}K#@}p>Iw-8G6s3y5K{s89Id+>9C3(4MDHj{5GWghdk;G01> zV;@$;JYs;q2KkndhI^42<<_Ay?tz-QGc3Dx0Em@P%w-Zk^1?43c*ZPauYiMR{b`vIvS!k3jt|08tgUECG zD85wpk+{&M^18*y~uVP*qAOMM|8W%w7G+dqYM77arTU_!Q5P0G0GQYA4ZWrdFLaV)$kG+ zh}BvViLIl$06O8oK=d}9B-%^xc%)hXF^b7zp>^|f|RPw@9SVu0LUM5rT zUaaw{ZjxRdV_y;>?TmBfqlRCP_5^7vm{b9pwywYLwX4W`fo4`3IT+$IfSMS2rv+k*Ix(XUw2i-Waa;h zrpw@EZ>OF#tuQDA7xp{t4FP~IDYX|-SX8Y;L)`Mgrp^TvnZ#8)Z_(q058^mWkqVX2 z`m4dxg5|R&{tf6!ieuh#zDmOgmS+A2Wn0SKrEdAbhA*3Lz7M7+PEv+`j`v64_6a)~ zkH1z?P<7NY=|+l9Jx4rxjj-nxzv?<#R@~=)x0mVC-SKMro`8_ z8`>SiSMZ#LH3t{G#{1(Gcj#W5u%8zphihX>3HVJiIM>gzUf4!<47q%o=*CwV!_T`U zf38f98RS?)PKh~euI`8EUltT!lS15wCWLwz3rt`K=kasZB}xfl0v8N*nzI>2;^QNFE0tH>i8#o12iaxEi)G6iQbqb&hjTod@`Tq;*xBJ?MVR_ z@0Ru;unlf5?1eTm@W0s(*Q0sTaJDlPXM%mYW(`*3gP3`2m27H4ky99CNgfIxdM7se zoSvG3Q7R~480k~dOdR&4k_}^&kn!<#b}sZA=?T_nQoq42UhS40?<8#J+TLsG36*4l zLC}EyC-OJhf1M%ym;Mc|4fAgfE)Wnf5Ec*;BQpN9^)&E*G^hqZ)%}Vi|qu+h5)4)W07ytJE zkN&S&|4$g@zvoCybAOkK{l4_xAr>TV((B`+xb|`}`l5*xy6;Mx1B* i|1$mA_`l5mqe`;i|Ds#}^&P