diff --git a/CMakeLists.txt b/CMakeLists.txt index 3eca47d8..e2ea26c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,8 @@ # SOFTWARE. # -cmake_minimum_required(VERSION 2.8.12) +# 3.9 added captures in if(MATCHES) +cmake_minimum_required(VERSION 3.9) if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15.0") cmake_policy(SET CMP0091 NEW) @@ -58,29 +59,33 @@ else() option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" OFF) endif() -option(BARNACLE_FIX_VISIBILITY "Enable barnacle tongue length fix" OFF) -option(CLIENT_WEAPONS "Enable client local weapons prediction" ON) -option(CROWBAR_IDLE_ANIM "Enable crowbar idle animation" OFF) -option(CROWBAR_DELAY_FIX "Enable crowbar attack delay fix" OFF) -option(CROWBAR_FIX_RAPID_CROWBAR "Enable rapid crowbar fix" OFF) -option(GAUSS_OVERCHARGE_FIX "Enable gauss overcharge fix" OFF) -option(TRIPMINE_BEAM_DUPLICATION_FIX "Enable fix of tripmine beam duplication on level transition" OFF) -option(HANDGRENADE_DEPLOY_FIX "Enable handgrenade deploy animation fix after finishing a throw" OFF) -option(WEAPONS_ANIMATION_TIMES_FIX "Enable animation times fix for some weapons" OFF) -option(OEM_BUILD "Enable OEM Build" OFF) -option(HLDEMO_BUILD "Enable Demo Build" OFF) -option(MOBILE_HACKS "Enable dirty hacks for simple mods" ON) - -set(GAMEDIR "valve" CACHE STRING "Gamedir path") -set(SERVER_INSTALL_DIR "dlls" CACHE STRING "Where put server dll") -set(CLIENT_INSTALL_DIR "cl_dlls" CACHE STRING "Where put client dll") -set(SERVER_LIBRARY_NAME "hl" CACHE STRING "Library name for PC platforms") -message(STATUS "Half-Life") - #----------------- # MAIN BUILD CODE \ ###################\ +file(STRINGS "mod_options.txt" MOD_OPTIONS_STRINGS REGEX "^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$") +foreach(LINE IN LISTS MOD_OPTIONS_STRINGS) + # file() itself doesn't populate CMAKE_MATCH_, so + # reparse the string + + if(${LINE} MATCHES "^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$") + # detect boolean options + if(${CMAKE_MATCH_2} STREQUAL "ON" OR ${CMAKE_MATCH_2} STREQUAL "OFF") + option(${CMAKE_MATCH_1} "${CMAKE_MATCH_3}" ${CMAKE_MATCH_2}) + + # let's check it here as well + if(${CMAKE_MATCH_1}) + message(STATUS ${CMAKE_MATCH_3} " is enabled") + add_definitions(-D${CMAKE_MATCH_1}) + else() + message(STATUS ${CMAKE_MATCH_3} " is disabled") + endif() + else() + set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE STRING "${CMAKE_MATCH_3}") + endif() + endif() +endforeach() + if(HLDEMO_BUILD AND OEM_BUILD) message(FATAL_ERROR "Don't mix Demo and OEM builds!") endif() @@ -110,81 +115,11 @@ else() message(STATUS "Building for 32 Bit") endif() -if(MOBILE_HACKS) - message(STATUS "Mobile hacks enabled") - add_definitions(-DMOBILE_HACKS) -endif() - -if(CLIENT_WEAPONS) - message(STATUS "Client weapons enabled.") - add_definitions(-DCLIENT_WEAPONS) -endif() - -if(BARNACLE_FIX_VISIBILITY) - message(STATUS "Barnacle tongue fix enabled") - add_definitions(-DBARNACLE_FIX_VISIBILITY) -endif() - -if(CROWBAR_IDLE_ANIM) - message(STATUS "Crowbar idle animation enabled") - add_definitions(-DCROWBAR_IDLE_ANIM) -endif() - -if(CROWBAR_DELAY_FIX) - message(STATUS "Crowbar attack delay fix enabled") - add_definitions(-DCROWBAR_DELAY_FIX) -endif() - -if(CROWBAR_FIX_RAPID_CROWBAR) - message(STATUS "Rapid crowbar fix enabled") - add_definitions(-DCROWBAR_FIX_RAPID_CROWBAR) -endif() - -if(GAUSS_OVERCHARGE_FIX) - message(STATUS "Gauss overcharge fix enabled") - add_definitions(-DGAUSS_OVERCHARGE_FIX) -endif() - -if(TRIPMINE_BEAM_DUPLICATION_FIX) - message(STATUS "Tripmine beam duplication fix enabled") - add_definitions(-DTRIPMINE_BEAM_DUPLICATION_FIX) -endif() - -if(HANDGRENADE_DEPLOY_FIX) - message(STATUS "Handgrenade deploy animation fix enabled") - add_definitions(-DHANDGRENADE_DEPLOY_FIX) -endif() - -if(WEAPONS_ANIMATION_TIMES_FIX) - message(STATUS "Weapons animation times fix enabled") - add_definitions(-DWEAPONS_ANIMATION_TIMES_FIX) -endif() - -if(OEM_BUILD) - message(STATUS "OEM build enabled") - add_definitions(-DOEM_BUILD) -endif() - -if(HLDEMO_BUILD) - message(STATUS "Demo build enabled") - add_definitions(-DHLDEMO_BUILD) -endif() - if (MINGW) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--add-stdcall-alias") endif() -# add_compile_options for older cmake versions -if(${CMAKE_VERSION} VERSION_LESS "3.0.2") - macro(add_compile_options) - set(list_var "${ARGV}") - foreach(arg IN LISTS list_var) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${arg}") - endforeach() - endmacro() -endif() - if(NOT MSVC) #add_compile_options(-Wempty-body) # GCC/Clang flag add_compile_options(-Wreturn-type) # GCC/Clang flag diff --git a/cl_dll/cdll_int.cpp b/cl_dll/cdll_int.cpp index 17fc06f3..57f879d7 100644 --- a/cl_dll/cdll_int.cpp +++ b/cl_dll/cdll_int.cpp @@ -50,20 +50,10 @@ TeamFortressViewport *gViewPort = NULL; #endif mobile_engfuncs_t *gMobileEngfuncs = NULL; -extern "C" int g_bhopcap; void InitInput( void ); void EV_HookEvents( void ); void IN_Commands( void ); -int __MsgFunc_Bhopcap( const char *pszName, int iSize, void *pbuf ) -{ - BEGIN_READ( pbuf, iSize ); - - g_bhopcap = READ_BYTE(); - - return 1; -} - /* ========================== Initialize @@ -299,8 +289,6 @@ void DLLEXPORT HUD_Init( void ) #if USE_VGUI Scheme_Init(); #endif - - gEngfuncs.pfnHookUserMsg( "Bhopcap", __MsgFunc_Bhopcap ); } /* diff --git a/cl_dll/hud.cpp b/cl_dll/hud.cpp index e01795e2..0d913ae3 100644 --- a/cl_dll/hud.cpp +++ b/cl_dll/hud.cpp @@ -99,8 +99,11 @@ float g_hud_text_color[3]; extern client_sprite_t *GetSpriteList( client_sprite_t *pList, const char *psz, int iRes, int iCount ); extern cvar_t *sensitivity; +qboolean bIsXash; cvar_t *cl_lw = NULL; cvar_t *cl_viewbob = NULL; +cvar_t *cl_rollspeed; +cvar_t *cl_rollangle; void ShutdownInput( void ); @@ -384,8 +387,18 @@ void CHud::Init( void ) m_pCvarStealMouse = CVAR_CREATE( "hud_capturemouse", "1", FCVAR_ARCHIVE ); m_pCvarDraw = CVAR_CREATE( "hud_draw", "1", FCVAR_ARCHIVE ); cl_lw = gEngfuncs.pfnGetCvarPointer( "cl_lw" ); - cl_viewbob = CVAR_CREATE( "cl_viewbob", "0", FCVAR_ARCHIVE ); - + cl_viewbob = CVAR_CREATE( "cl_bobtilt", "0", FCVAR_ARCHIVE ); +#if GOLDSOURCE_SUPPORT + if( gEngfuncs.pfnGetCvarPointer( "build" )) + { + bIsXash = true; + } + else + { + cl_rollangle = gEngfuncs.pfnRegisterVariable( "cl_rollangle", "0", FCVAR_CLIENTDLL | FCVAR_ARCHIVE ); + cl_rollspeed = gEngfuncs.pfnRegisterVariable( "cl_rollspeed", "200", FCVAR_CLIENTDLL | FCVAR_ARCHIVE ); + } +#endif m_pSpriteList = NULL; #ifdef MOBILE_HACKS diff --git a/cl_dll/vgui_TeamFortressViewport.cpp b/cl_dll/vgui_TeamFortressViewport.cpp index 21a8a928..debac7ef 100644 --- a/cl_dll/vgui_TeamFortressViewport.cpp +++ b/cl_dll/vgui_TeamFortressViewport.cpp @@ -841,7 +841,7 @@ int TeamFortressViewport::CreateCommandMenu( const char *menuFile, int direction { gEngfuncs.Con_Printf( "Too many menus in %s past '%s'\n", menuFile, szLastButtonText ); } - else + else if( pButton ) { // Create the menu m_pCommandMenus[m_iNumMenus] = CreateSubMenu( pButton, m_pCurrentCommandMenu, iButtonY ); diff --git a/cl_dll/view.cpp b/cl_dll/view.cpp index 4c93fb87..5c6316a5 100644 --- a/cl_dll/view.cpp +++ b/cl_dll/view.cpp @@ -313,6 +313,10 @@ void V_AddIdle( struct ref_params_s *pparams ) pparams->viewangles[YAW] += v_idlescale * sin( pparams->time * v_iyaw_cycle.value ) * v_iyaw_level.value; } +extern qboolean bIsXash; +extern cvar_t *cl_rollspeed; +extern cvar_t *cl_rollangle; + /* ============== V_CalcViewRoll @@ -328,9 +332,14 @@ void V_CalcViewRoll( struct ref_params_s *pparams ) viewentity = gEngfuncs.GetEntityByIndex( pparams->viewentity ); if( !viewentity ) return; - +#if GOLDSOURCE_SUPPORT + if( bIsXash ) + side = V_CalcRoll( viewentity->angles, pparams->simvel, pparams->movevars->rollangle, pparams->movevars->rollspeed ); + else + side = V_CalcRoll( viewentity->angles, pparams->simvel, cl_rollangle->value, cl_rollspeed->value ); +#else side = V_CalcRoll( viewentity->angles, pparams->simvel, pparams->movevars->rollangle, pparams->movevars->rollspeed ); - +#endif pparams->viewangles[ROLL] += side; if( pparams->health <= 0 && ( pparams->viewheight[2] != 0 ) ) diff --git a/cl_dll/wscript b/cl_dll/wscript index b368ebd8..e776a54d 100644 --- a/cl_dll/wscript +++ b/cl_dll/wscript @@ -6,27 +6,70 @@ from waflib import Utils import os def options(opt): - # stub - return + grp = opt.add_option_group('Client options') -def configure(conf): - if conf.env.DEST_OS == 'win32': - conf.check_cxx(lib='user32') + grp.add_option('--enable-vgui', action = 'store_true', dest = 'USE_VGUI', default = False, + help = 'Enable VGUI1') + grp.add_option('--enable-vgui2', action = 'store_true', dest = 'USE_VGUI2', default = False, + help = 'Enable VGUI2. UNDONE') + grp.add_option('--enable-novgui-motd', action = 'store_true', dest = 'USE_NOVGUI_MOTD', default = False, + help = 'Prefer non-VGUI MOTD when USE_VGUI is enabled') + grp.add_option('--enable-novgui-scoreboard', action = 'store_true', dest = 'USE_NOVGUI_SCOREBOARD', default = False, + help = 'Prefer non-VGUI Scoreboard when USE_VGUI is enabled') + grp.add_option('--disable-goldsrc-support', action = 'store_false', dest = 'GOLDSOURCE_SUPPORT', + default=True, help = 'disable GoldSource compatibility') - if conf.env.GOLDSRC: - if conf.env.DEST_OS == 'win32': - conf.check_cxx(lib='winmm') - else: - conf.check_cc(lib='dl') + opt.load('vgui') + +def configure(conf): + conf.env.USE_VGUI = conf.options.USE_VGUI + conf.env.USE_NOVGUI_MOTD = conf.options.USE_NOVGUI_MOTD + conf.env.USE_NOVGUI_SCOREBOARD = conf.options.USE_NOVGUI_SCOREBOARD + conf.env.USE_VOICEMGR = conf.options.USE_VOICEMGR + conf.env.GOLDSOURCE_SUPPORT = conf.options.GOLDSOURCE_SUPPORT + if conf.env.USE_VGUI: + conf.load('vgui') + if not conf.check_vgui(): + conf.fatal('VGUI was enabled but VGUI cannot be used') def build(bld): - source = bld.path.parent.ant_glob([ - 'pm_shared/*.c' - ]) - source += bld.path.ant_glob([ - 'hl/*.cpp' - ]) + libs = [] + defines = ['CLIENT_DLL'] + includes = ['.', + '../dlls', + '../common', + '../engine', + '../pm_shared', + '../game_shared', + '../public'] + excluded_files = ['GameStudioModelRenderer_Sample.cpp', + 'game_shared/voice_vgui_tweakdlg.cpp', + 'game_shared/voice_gamemgr.cpp', + 'game_shared/voice_status.cpp'] + + if bld.env.USE_VGUI: + defines += ['USE_VGUI'] + libs += ['VGUI'] + if bld.env.USE_NOVGUI_MOTD: + defines += ['USE_NOVGUI_MOTD'] + else: + excluded_files += ['MOTD.cpp'] + + if bld.env.USE_NOVGUI_SCOREBOARD: + defines += ['USE_NOVGUI_SCOREBOARD'] + else: + excluded_files += ['scoreboard.cpp'] + else: + includes += ['../utils/fake_vgui/include'] + excluded_files += ['voice_status.cpp', + 'vgui_*.cpp', + 'game_shared/vgui_*.cpp', + 'game_shared/voice_banmgr.cpp'] + + source = bld.path.ant_glob('**/*.cpp', excl=excluded_files) + source += bld.path.parent.ant_glob('game_shared/*.cpp', excl=excluded_files) source += bld.path.parent.ant_glob([ + 'pm_shared/*.c', 'dlls/crossbow.cpp', 'dlls/crowbar.cpp', 'dlls/egon.cpp', @@ -42,78 +85,21 @@ def build(bld): 'dlls/squeakgrenade.cpp', 'dlls/tripmine.cpp' ]) - source += [ - 'GameStudioModelRenderer.cpp', - 'MOTD.cpp', - 'StudioModelRenderer.cpp', - 'ammo.cpp', - 'ammo_secondary.cpp', - 'ammohistory.cpp', - 'battery.cpp', - 'cdll_int.cpp', - 'com_weapons.cpp', - 'death.cpp', - 'demo.cpp', - 'entity.cpp', - 'ev_hldm.cpp', - 'ev_common.cpp', - 'events.cpp', - 'flashlight.cpp', - 'geiger.cpp', - 'health.cpp', - 'hud.cpp', - 'hud_msg.cpp', - 'hud_redraw.cpp', - 'hud_spectator.cpp', - 'hud_update.cpp', - 'in_camera.cpp', - 'input.cpp', - 'input_goldsource.cpp', - 'input_mouse.cpp', - 'input_xash3d.cpp', - 'menu.cpp', - 'message.cpp', - 'parsemsg.cpp', - 'saytext.cpp', - 'scoreboard.cpp', - 'status_icons.cpp', - 'statusbar.cpp', - 'studio_util.cpp', - 'text_message.cpp', - 'train.cpp', - 'tri.cpp', - 'util.cpp', - 'view.cpp' - ] - includes = [ - '.', - 'hl/', - '../dlls', - '../common', - '../engine', - '../pm_shared', - '../game_shared', - '../public', - '../utils/fake_vgui/include' - ] - defines = ['CLIENT_DLL'] - if bld.env.GOLDSRC: - defines += ['GOLDSOURCE_SUPPORT'] - - libs = [] if bld.env.DEST_OS == 'win32': - libs += ["USER32"] + libs += ['USER32'] + + if bld.env.GOLDSOURCE_SUPPORT: + defines += ['GOLDSOURCE_SUPPORT'] - if bld.env.GOLDSRC: if bld.env.DEST_OS == 'win32': libs += ["WINMM"] else: libs += ['DL'] if bld.env.DEST_OS not in ['android', 'dos']: - install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_DIR) + install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_INSTALL_DIR) else: install_path = bld.env.PREFIX @@ -127,6 +113,6 @@ def build(bld): use = libs, install_path = install_path, subsystem = bld.env.MSVC_SUBSYSTEM, - idx = bld.get_taskgen_count() + idx = bld.get_taskgen_count() ) diff --git a/cmake/LibraryNaming.cmake b/cmake/LibraryNaming.cmake index 3c2b8968..e233a7de 100644 --- a/cmake/LibraryNaming.cmake +++ b/cmake/LibraryNaming.cmake @@ -1,54 +1,88 @@ include(CheckSymbolExists) -# generated(see comments in public/build.h) -# cat build.h | grep '^#undef XASH' | awk '{ print "check_symbol_exists(" $2 " \"build.h\" " $2 ")" }' +macro(check_build_target symbol) + check_symbol_exists(${symbol} "build.h" ${symbol}) +endmacro() + +macro(check_group_build_target symbol group) + if(NOT ${group}) + check_build_target(${symbol}) + if(${symbol}) + set(${group} TRUE) + endif() + else() + set(${symbol} FALSE) + endif() +endmacro() + +# So there is a problem: +# 1. Number of these symbols only grows, as we support more and more ports +# 2. CMake was written by morons and can't check these symbols in parallel +# 3. MSVC is very slow at everything (startup, parsing, generating error) + +# Solution: group these symbols and set variable if one of them was found +# this way we can reorder to reorder them by most common configurations +# but we can't generate this list anymore! ... OR IS IT ??? + +# Well, after reordering positions in engine's buildenums.h, we can partially autogenerate this list! +# echo "check_build_target(XASH_64BIT)" +# grep "#define PLATFORM" buildenums.h | cut -d' ' -f 2 | cut -d_ -f 2- | awk '{ print "check_group_build_target(XASH_" $1 " XASH_PLATFORM)" }' +# grep "#define ARCHITECTURE" buildenums.h | cut -d' ' -f 2 | cut -d_ -f 2- | awk '{ print "check_group_build_target(XASH_" $1 " XASH_ARCHITECTURE)" +# grep "#define ENDIAN" buildenums.h | cut -d' ' -f 2 | cut -d_ -f 2- | awk '{ print "check_group_build_target(XASH_" $1 "_ENDIAN XASH_ENDIANNESS)"}' +# echo "if(XASH_ARM)" +# grep '^#undef XASH' build.h | grep "XASH_ARM[v_]" | awk '{ print "check_build_target(" $2 ")"}' +# echo "endif()" +# echo "if(XASH_RISCV)" +# grep '^#undef XASH' build.h | grep "XASH_RISCV_" | awk '{ print "check_build_target(" $2 ")"}' +# echo "endif()" + set(CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/public/") -check_symbol_exists(XASH_64BIT "build.h" XASH_64BIT) -check_symbol_exists(XASH_AMD64 "build.h" XASH_AMD64) -check_symbol_exists(XASH_ANDROID "build.h" XASH_ANDROID) -check_symbol_exists(XASH_APPLE "build.h" XASH_APPLE) -check_symbol_exists(XASH_ARM "build.h" XASH_ARM) -check_symbol_exists(XASH_ARM_HARDFP "build.h" XASH_ARM_HARDFP) -check_symbol_exists(XASH_ARM_SOFTFP "build.h" XASH_ARM_SOFTFP) -check_symbol_exists(XASH_ARMv4 "build.h" XASH_ARMv4) -check_symbol_exists(XASH_ARMv5 "build.h" XASH_ARMv5) -check_symbol_exists(XASH_ARMv6 "build.h" XASH_ARMv6) -check_symbol_exists(XASH_ARMv7 "build.h" XASH_ARMv7) -check_symbol_exists(XASH_ARMv8 "build.h" XASH_ARMv8) -check_symbol_exists(XASH_BIG_ENDIAN "build.h" XASH_BIG_ENDIAN) -check_symbol_exists(XASH_BSD "build.h" XASH_BSD) -check_symbol_exists(XASH_DOS4GW "build.h" XASH_DOS4GW) -check_symbol_exists(XASH_E2K "build.h" XASH_E2K) -check_symbol_exists(XASH_EMSCRIPTEN "build.h" XASH_EMSCRIPTEN) -check_symbol_exists(XASH_FREEBSD "build.h" XASH_FREEBSD) -check_symbol_exists(XASH_HAIKU "build.h" XASH_HAIKU) -check_symbol_exists(XASH_IOS "build.h" XASH_IOS) -check_symbol_exists(XASH_JS "build.h" XASH_JS) -check_symbol_exists(XASH_LINUX "build.h" XASH_LINUX) -check_symbol_exists(XASH_LITTLE_ENDIAN "build.h" XASH_LITTLE_ENDIAN) -check_symbol_exists(XASH_MINGW "build.h" XASH_MINGW) -check_symbol_exists(XASH_MIPS "build.h" XASH_MIPS) -check_symbol_exists(XASH_PPC "build.h" XASH_PPC) -check_symbol_exists(XASH_MOBILE_PLATFORM "build.h" XASH_MOBILE_PLATFORM) -check_symbol_exists(XASH_MSVC "build.h" XASH_MSVC) -check_symbol_exists(XASH_NETBSD "build.h" XASH_NETBSD) -check_symbol_exists(XASH_OPENBSD "build.h" XASH_OPENBSD) -check_symbol_exists(XASH_POSIX "build.h" XASH_POSIX) -check_symbol_exists(XASH_RISCV "build.h" XASH_RISCV) -check_symbol_exists(XASH_RISCV_DOUBLEFP "build.h" XASH_RISCV_DOUBLEFP) -check_symbol_exists(XASH_RISCV_SINGLEFP "build.h" XASH_RISCV_SINGLEFP) -check_symbol_exists(XASH_RISCV_SOFTFP "build.h" XASH_RISCV_SOFTFP) -check_symbol_exists(XASH_SERENITY "build.h" XASH_SERENITY) -check_symbol_exists(XASH_WIN32 "build.h" XASH_WIN32) -check_symbol_exists(XASH_WIN64 "build.h" XASH_WIN64) -check_symbol_exists(XASH_X86 "build.h" XASH_X86) -check_symbol_exists(XASH_NSWITCH "build.h" XASH_NSWITCH) -check_symbol_exists(XASH_PSVITA "build.h" XASH_PSVITA) +check_build_target(XASH_64BIT) +check_group_build_target(XASH_WIN32 XASH_PLATFORM) +check_group_build_target(XASH_LINUX XASH_PLATFORM) +check_group_build_target(XASH_FREEBSD XASH_PLATFORM) +check_group_build_target(XASH_ANDROID XASH_PLATFORM) +check_group_build_target(XASH_APPLE XASH_PLATFORM) +check_group_build_target(XASH_NETBSD XASH_PLATFORM) +check_group_build_target(XASH_OPENBSD XASH_PLATFORM) +check_group_build_target(XASH_EMSCRIPTEN XASH_PLATFORM) +check_group_build_target(XASH_DOS4GW XASH_PLATFORM) +check_group_build_target(XASH_HAIKU XASH_PLATFORM) +check_group_build_target(XASH_SERENITY XASH_PLATFORM) +check_group_build_target(XASH_IRIX XASH_PLATFORM) +check_group_build_target(XASH_NSWITCH XASH_PLATFORM) +check_group_build_target(XASH_PSVITA XASH_PLATFORM) +check_group_build_target(XASH_LINUX_UNKNOWN XASH_PLATFORM) +check_group_build_target(XASH_X86 XASH_ARCHITECTURE) +check_group_build_target(XASH_AMD64 XASH_ARCHITECTURE) +check_group_build_target(XASH_ARM XASH_ARCHITECTURE) +check_group_build_target(XASH_MIPS XASH_ARCHITECTURE) +check_group_build_target(XASH_JS XASH_ARCHITECTURE) +check_group_build_target(XASH_E2K XASH_ARCHITECTURE) +check_group_build_target(XASH_RISCV XASH_ARCHITECTURE) +check_group_build_target(XASH_LITTLE_ENDIAN XASH_ENDIANNESS) +check_group_build_target(XASH_BIG_ENDIAN XASH_ENDIANNESS) +if(XASH_ARM) +check_build_target(XASH_ARM_HARDFP) +check_build_target(XASH_ARM_SOFTFP) +check_build_target(XASH_ARMv4) +check_build_target(XASH_ARMv5) +check_build_target(XASH_ARMv6) +check_build_target(XASH_ARMv7) +check_build_target(XASH_ARMv8) +endif() +if(XASH_RISCV) +check_build_target(XASH_RISCV_DOUBLEFP) +check_build_target(XASH_RISCV_SINGLEFP) +check_build_target(XASH_RISCV_SOFTFP) +endif() unset(CMAKE_REQUIRED_INCLUDES) # engine/common/build.c if(XASH_ANDROID) set(BUILDOS "android") +elseif(XASH_LINUX_UNKNOWN) + set(BUILDOS "linuxunkabi") elseif(XASH_WIN32 OR XASH_LINUX OR XASH_APPLE) set(BUILDOS "") # no prefix for default OS elseif(XASH_FREEBSD) @@ -69,6 +103,8 @@ elseif(XASH_NSWITCH) set(BUILDOS "nswitch") elseif(XASH_PSVITA) set(BUILDOS "psvita") +elseif(XASH_IRIX) + set(BUILDOS "irix") else() message(SEND_ERROR "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug") endif() @@ -113,15 +149,6 @@ elseif(XASH_MIPS) if(XASH_LITTLE_ENDIAN) set(BUILDARCH "${BUILDARCH}el") endif() -elseif(XASH_PPC) - set(BUILDARCH "powerpc") - if(XASH_64BIT) - set(BUILDARCH "${BUILDARCH}64") - endif() - - if(XASH_LITTLE_ENDIAN) - set(BUILDARCH "${BUILDARCH}le") - endif() elseif(XASH_RISCV) set(BUILDARCH "riscv") if(XASH_64BIT) diff --git a/dlls/client.cpp b/dlls/client.cpp index 53786de7..c27b22d1 100644 --- a/dlls/client.cpp +++ b/dlls/client.cpp @@ -48,16 +48,12 @@ extern DLL_GLOBAL ULONG g_ulFrameCount; extern void CopyToBodyQue( entvars_t* pev ); extern int giPrecacheGrunt; extern int gmsgSayText; -extern int gmsgBhopcap; extern cvar_t allow_spectators; extern cvar_t multibyte_only; extern int g_teamplay; -extern cvar_t bhopcap; -extern "C" int g_bhopcap; - void LinkUserMessages( void ); /* @@ -130,6 +126,7 @@ void ClientDisconnect( edict_t *pEntity ) pEntity->v.takedamage = DAMAGE_NO;// don't attract autoaim pEntity->v.solid = SOLID_NOT;// nonsolid pEntity->v.effects = 0;// clear any effects + pEntity->v.flags = 0;// clear any flags UTIL_SetOrigin( &pEntity->v, pEntity->v.origin ); g_pGameRules->ClientDisconnected( pEntity ); @@ -822,15 +819,6 @@ void StartFrame( void ) gpGlobals->teamplay = teamplay.value; g_ulFrameCount++; - - int oldBhopcap = g_bhopcap; - g_bhopcap = ( g_pGameRules && g_pGameRules->IsMultiplayer() && bhopcap.value != 0.0f ) ? 1 : 0; - if( g_bhopcap != oldBhopcap ) - { - MESSAGE_BEGIN( MSG_ALL, gmsgBhopcap, NULL ); - WRITE_BYTE( g_bhopcap ); - MESSAGE_END(); - } } void ClientPrecache( void ) diff --git a/dlls/game.h b/dlls/game.h index fee1a71b..5f7bee1c 100644 --- a/dlls/game.h +++ b/dlls/game.h @@ -42,6 +42,7 @@ extern cvar_t teamlist; extern cvar_t teamoverride; extern cvar_t defaultteam; extern cvar_t allowmonsters; +extern cvar_t bhopcap; // Engine Cvars extern cvar_t *g_psv_gravity; diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp index da199271..e8e6a3b5 100644 --- a/dlls/multiplay_gamerules.cpp +++ b/dlls/multiplay_gamerules.cpp @@ -458,12 +458,13 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl ) // sending just one score makes the hud scoreboard active; otherwise // it is just disabled for single play - MESSAGE_BEGIN( MSG_ONE, gmsgScoreInfo, NULL, pl->edict() ); + //fix a bug in the information about the player's score when he left the server, so that his score would not be transferred to another player(seems to work) + MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo ); WRITE_BYTE( ENTINDEX(pl->edict()) ); + WRITE_SHORT( (int)pl->pev->frags ); + WRITE_SHORT( pl->m_iDeaths ); WRITE_SHORT( 0 ); - WRITE_SHORT( 0 ); - WRITE_SHORT( 0 ); - WRITE_SHORT( 0 ); + WRITE_SHORT( GetTeamIndex( pl->m_szTeamName ) + 1 ); MESSAGE_END(); SendMOTDToClient( pl->edict() ); diff --git a/dlls/player.cpp b/dlls/player.cpp index 6091017c..72d0470b 100644 --- a/dlls/player.cpp +++ b/dlls/player.cpp @@ -45,8 +45,6 @@ extern DLL_GLOBAL BOOL g_fDrawLines; int gEvilImpulse101; extern DLL_GLOBAL int g_iSkillLevel, gDisplayTitle; -extern "C" int g_bhopcap; - BOOL gInitHUD = TRUE; extern void CopyToBodyQue( entvars_t *pev); @@ -183,7 +181,6 @@ int gmsgSetFOV = 0; int gmsgShowMenu = 0; int gmsgGeigerRange = 0; int gmsgTeamNames = 0; -int gmsgBhopcap = 0; int gmsgStatusText = 0; int gmsgStatusValue = 0; @@ -230,7 +227,6 @@ void LinkUserMessages( void ) gmsgFade = REG_USER_MSG( "ScreenFade", sizeof(ScreenFade) ); gmsgAmmoX = REG_USER_MSG( "AmmoX", 2 ); gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 ); - gmsgBhopcap = REG_USER_MSG( "Bhopcap", 1 ); gmsgStatusText = REG_USER_MSG( "StatusText", -1 ); gmsgStatusValue = REG_USER_MSG( "StatusValue", 3 ); @@ -2815,6 +2811,8 @@ void CBasePlayer::Spawn( void ) g_engfuncs.pfnSetPhysicsKeyValue( edict(), "slj", "0" ); g_engfuncs.pfnSetPhysicsKeyValue( edict(), "hl", "1" ); + g_engfuncs.pfnSetPhysicsKeyValue( edict(), "fr", "1" ); + g_engfuncs.pfnSetPhysicsKeyValue( edict(), "bj", bhopcap.value ? "0" : "1" ); pev->fov = m_iFOV = 0;// init field of view. m_iClientFOV = -1; // make sure fov reset is sent @@ -3351,7 +3349,6 @@ void CBasePlayer::ForceClientDllUpdate( void ) m_fWeapon = FALSE; // Force weapon send m_fKnownItem = FALSE; // Force weaponinit messages. m_fInitHUD = TRUE; // Force HUD gmsgResetHUD message - m_bSentBhopcap = true; // a1ba: Update bhopcap state memset( m_rgAmmoLast, 0, sizeof( m_rgAmmoLast )); // a1ba: Force update AmmoX @@ -4135,15 +4132,6 @@ void CBasePlayer::UpdateClientData( void ) UpdateStatusBar(); m_flNextSBarUpdateTime = gpGlobals->time + 0.2f; } - - // Send the current bhopcap state. - if( !m_bSentBhopcap ) - { - m_bSentBhopcap = true; - MESSAGE_BEGIN( MSG_ONE, gmsgBhopcap, NULL, pev ); - WRITE_BYTE( g_bhopcap ); - MESSAGE_END(); - } } //========================================================= diff --git a/dlls/player.h b/dlls/player.h index d2f5d945..b2484b15 100644 --- a/dlls/player.h +++ b/dlls/player.h @@ -328,8 +328,6 @@ public: int m_iAutoWepSwitch; Vector m_vecLastViewAngles; - - bool m_bSentBhopcap; // If false, the player just joined and needs a bhopcap message. }; #define AUTOAIM_2DEGREES 0.0348994967025 diff --git a/dlls/prop.cpp b/dlls/prop.cpp deleted file mode 100644 index 7f7dba48..00000000 --- a/dlls/prop.cpp +++ /dev/null @@ -1,1185 +0,0 @@ -/*** -* -* Copyright (c) 1996-2001, Valve LLC. All rights reserved. -* -* This product contains software technology licensed from Id -* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. -* All Rights Reserved. -* -* Use, distribution, and modification of this source code and/or resulting -* object code is restricted to non-commercial enhancements to products from -* Valve LLC. All other use, distribution, or modification is prohibited -* without written permission from Valve LLC. -* -****/ -/* - -===== generic grenade.cpp ======================================================== - -*/ - -#include "extdll.h" -#include "util.h" -#include "cbase.h" -#include "monsters.h" -#include "weapons.h" -#include "nodes.h" -#include "soundent.h" -#include "decals.h" -#include "player.h" -#include "explode.h" -#include "gamerules.h" - -#define SF_PROP_RESPAWN 8 // enable autorespawn -#define SF_PROP_BREAKABLE 16 // enable break/explode -#define SF_PROP_FIXED 32 // don't move untill touch -typedef enum -{ - expRandom, - expDirected -}Explosions; - -typedef enum -{ - matGlass = 0, - matWood, - matMetal, - matFlesh, - matCinderBlock, - matCeilingTile, - matComputer, - matUnbreakableGlass, - matRocks, - matNone, - matLastMaterial -}Materials; - -//extern "C" void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); -Vector UTIL_AngleVectorsF( const Vector &angles ) -{ - float rgflVecOut[3]; - float rgflVecIn[3]; - angles.CopyToArray( rgflVecIn ); - g_engfuncs.pfnAngleVectors( rgflVecIn, rgflVecOut, NULL, NULL ); - return Vector( rgflVecOut ); -} -Vector UTIL_AngleVectorsR( const Vector &angles ) -{ - float rgflVecOut[3]; - float rgflVecIn[3]; - angles.CopyToArray( rgflVecIn ); - g_engfuncs.pfnAngleVectors( rgflVecIn, NULL, rgflVecOut, NULL ); - return Vector( rgflVecOut ); -} -Vector UTIL_AngleVectorsU( const Vector &angles ) -{ - float rgflVecOut[3]; - float rgflVecIn[3]; - angles.CopyToArray( rgflVecIn ); - g_engfuncs.pfnAngleVectors( rgflVecIn, NULL, rgflVecOut, NULL ); - return Vector( rgflVecOut ); -} -//===================grenade - -enum PropShape -{ - SHAPE_CYL_H = 0, - SHAPE_CYL_V, - SHAPE_BOX, - SHAPE_GENERIC, - SHAPE_SPHERE, - SHAPE_NOROTATE -}; - -class CProp : public CBaseEntity -{ -public: - void Spawn( void ); - void Precache(); - - void EXPORT BounceTouch( CBaseEntity *pOther ); - //void EXPORT SlideTouch( CBaseEntity *pOther ); - virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); - virtual void Force( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); - int TakeDamage( entvars_t *pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ); - virtual int ObjectCaps( void ) { return ( CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION ) | FCAP_IMPULSE_USE | FCAP_CONTINUOUS_USE; } - virtual void BounceSound( void ); - virtual int BloodColor( void ) { return DONT_BLEED; } - virtual void Killed( entvars_t *pevAttacker, int iGib ); - void CheckRotate(); - void EXPORT RespawnThink(); - void EXPORT AngleThink(); - void EXPORT DeployThink(); - void EXPORT DieThink(); - void DamageSound( void ); - void PropRespawn(); - void KeyValue( KeyValueData *pkvd ); - - static const char *pSoundsWood[]; - static const char *pSoundsFlesh[]; - static const char *pSoundsGlass[]; - static const char *pSoundsMetal[]; - static const char *pSoundsConcrete[]; - static const char *pSpawnObjects[]; - - inline BOOL Explodable( void ) { return ExplosionMagnitude() > 0; } - inline int ExplosionMagnitude( void ) { return pev->impulse; } - inline void ExplosionSetMagnitude( int magnitude ) { pev->impulse = magnitude; } - - static void MaterialSoundPrecache( Materials precacheMaterial ); - static void MaterialSoundRandom( edict_t *pEdict, Materials soundMaterial, float volume ); - static const char **MaterialSoundList( Materials precacheMaterial, int &soundCount ); - void EXPORT Die( void ); - - BOOL m_bBarrel; - float m_flFloorFriction; - float m_flCollideFriction; - - // hull sizes - Vector minsH, maxsH; - Vector minsV, maxsV; - - // spawn backup; - Vector spawnOrigin; - Vector spawnAngles; - - edict_t *m_owner2; - edict_t *m_attacker; - float m_flNextAttack; - float m_flRespawnTime; - PropShape m_shape; - PropShape m_oldshape; - CBasePlayer *m_pHolstered; - float m_flSpawnHealth; - int m_idShard; - float m_angle; - int m_iszGibModel; - Materials m_Material; - Explosions m_Explosion; - int m_iaCustomAnglesX[10]; - int m_iaCustomAnglesZ[10]; -}; - -LINK_ENTITY_TO_CLASS( prop, CProp ) - -const char *CProp::pSoundsWood[] = -{ - "debris/wood1.wav", - "debris/wood2.wav", - "debris/wood3.wav", -}; - -const char *CProp::pSoundsFlesh[] = -{ - "debris/flesh1.wav", - "debris/flesh2.wav", - "debris/flesh3.wav", - "debris/flesh5.wav", - "debris/flesh6.wav", - "debris/flesh7.wav", -}; - -const char *CProp::pSoundsMetal[] = -{ - "debris/metal1.wav", - "debris/metal2.wav", - "debris/metal3.wav", -}; - -const char *CProp::pSoundsConcrete[] = -{ - "debris/concrete1.wav", - "debris/concrete2.wav", - "debris/concrete3.wav", -}; - -const char *CProp::pSoundsGlass[] = -{ - "debris/glass1.wav", - "debris/glass2.wav", - "debris/glass3.wav", -}; - -const char **CProp::MaterialSoundList( Materials precacheMaterial, int &soundCount ) -{ - const char **pSoundList = NULL; - - switch( precacheMaterial ) - { - case matWood: - pSoundList = pSoundsWood; - soundCount = ARRAYSIZE( pSoundsWood ); - break; - case matFlesh: - pSoundList = pSoundsFlesh; - soundCount = ARRAYSIZE( pSoundsFlesh ); - break; - case matComputer: - case matUnbreakableGlass: - case matGlass: - pSoundList = pSoundsGlass; - soundCount = ARRAYSIZE( pSoundsGlass ); - break; - case matMetal: - pSoundList = pSoundsMetal; - soundCount = ARRAYSIZE( pSoundsMetal ); - break; - case matCinderBlock: - case matRocks: - pSoundList = pSoundsConcrete; - soundCount = ARRAYSIZE( pSoundsConcrete ); - break; - case matCeilingTile: - case matNone: - default: - soundCount = 0; - break; - } - - return pSoundList; -} - -void CProp::MaterialSoundPrecache( Materials precacheMaterial ) -{ - const char **pSoundList; - int i, soundCount = 0; - - pSoundList = MaterialSoundList( precacheMaterial, soundCount ); - - for( i = 0; i < soundCount; i++ ) - { - PRECACHE_SOUND( pSoundList[i] ); - } -} - -void CProp::MaterialSoundRandom( edict_t *pEdict, Materials soundMaterial, float volume ) -{ - const char **pSoundList; - int soundCount = 0; - - pSoundList = MaterialSoundList( soundMaterial, soundCount ); - - if( soundCount ) - EMIT_SOUND( pEdict, CHAN_BODY, pSoundList[RANDOM_LONG( 0, soundCount - 1 )], volume, 1.0 ); -} - -void CProp::Precache( void ) -{ - const char *pGibName; - - if( !pev->model ) - pev->model = MAKE_STRING( "models/xash/barrel_brown.mdl" ); - - switch( m_Material ) - { - case matWood: - pGibName = "models/woodgibs.mdl"; - - PRECACHE_SOUND( "debris/bustcrate1.wav" ); - PRECACHE_SOUND( "debris/bustcrate2.wav" ); - break; - case matFlesh: - pGibName = "models/fleshgibs.mdl"; - - PRECACHE_SOUND( "debris/bustflesh1.wav" ); - PRECACHE_SOUND( "debris/bustflesh2.wav" ); - break; - case matComputer: - PRECACHE_SOUND( "buttons/spark5.wav"); - PRECACHE_SOUND( "buttons/spark6.wav"); - pGibName = "models/computergibs.mdl"; - - PRECACHE_SOUND( "debris/bustmetal1.wav" ); - PRECACHE_SOUND( "debris/bustmetal2.wav" ); - break; - case matUnbreakableGlass: - case matGlass: - pGibName = "models/glassgibs.mdl"; - - PRECACHE_SOUND( "debris/bustglass1.wav" ); - PRECACHE_SOUND( "debris/bustglass2.wav" ); - break; - case matMetal: - pGibName = "models/metalplategibs.mdl"; - - PRECACHE_SOUND( "debris/bustmetal1.wav" ); - PRECACHE_SOUND( "debris/bustmetal2.wav" ); - break; - case matCinderBlock: - pGibName = "models/cindergibs.mdl"; - - PRECACHE_SOUND( "debris/bustconcrete1.wav" ); - PRECACHE_SOUND( "debris/bustconcrete2.wav" ); - break; - case matRocks: - pGibName = "models/rockgibs.mdl"; - - PRECACHE_SOUND( "debris/bustconcrete1.wav" ); - PRECACHE_SOUND( "debris/bustconcrete2.wav" ); - break; - case matCeilingTile: - pGibName = "models/ceilinggibs.mdl"; - - PRECACHE_SOUND( "debris/bustceiling.wav" ); - break; - } - MaterialSoundPrecache( m_Material ); - if( m_iszGibModel ) - pGibName = STRING( m_iszGibModel ); - - m_idShard = PRECACHE_MODEL( pGibName ); - PRECACHE_MODEL( STRING( pev->model ) ); -} - -void CProp::DamageSound( void ) -{ - int pitch; - float fvol; - char *rgpsz[6]; - int i; - int material = m_Material; - - //if( RANDOM_LONG( 0, 1 ) ) - // return; - - if( RANDOM_LONG( 0, 2 ) ) - pitch = PITCH_NORM; - else - pitch = 95 + RANDOM_LONG( 0, 34 ); - - fvol = RANDOM_FLOAT( 0.75, 1.0 ); - - if( material == matComputer && RANDOM_LONG( 0, 1 ) ) - material = matMetal; - - switch( material ) - { - case matComputer: - case matGlass: - case matUnbreakableGlass: - rgpsz[0] = "debris/glass1.wav"; - rgpsz[1] = "debris/glass2.wav"; - rgpsz[2] = "debris/glass3.wav"; - i = 3; - break; - case matWood: - rgpsz[0] = "debris/wood1.wav"; - rgpsz[1] = "debris/wood2.wav"; - rgpsz[2] = "debris/wood3.wav"; - i = 3; - break; - case matMetal: - rgpsz[0] = "debris/metal1.wav"; - rgpsz[1] = "debris/metal3.wav"; - rgpsz[2] = "debris/metal2.wav"; - i = 2; - break; - case matFlesh: - rgpsz[0] = "debris/flesh1.wav"; - rgpsz[1] = "debris/flesh2.wav"; - rgpsz[2] = "debris/flesh3.wav"; - rgpsz[3] = "debris/flesh5.wav"; - rgpsz[4] = "debris/flesh6.wav"; - rgpsz[5] = "debris/flesh7.wav"; - i = 6; - break; - case matRocks: - case matCinderBlock: - rgpsz[0] = "debris/concrete1.wav"; - rgpsz[1] = "debris/concrete2.wav"; - rgpsz[2] = "debris/concrete3.wav"; - i = 3; - break; - case matCeilingTile: - // UNDONE: no ceiling tile shard sound yet - i = 0; - break; - } - - if( i ) - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, rgpsz[RANDOM_LONG( 0, i - 1 )], fvol, ATTN_NORM, 0, pitch ); -} - -void CProp::Die( void ) -{ - Vector vecSpot;// shard origin - Vector vecVelocity;// shard velocity - char cFlag = 0; - int pitch; - float fvol; - - pitch = 95 + RANDOM_LONG( 0, 29 ); - - if( pitch > 97 && pitch < 103 ) - pitch = 100; - - // The more negative pev->health, the louder - // the sound should be. - - fvol = RANDOM_FLOAT( 0.85, 1.0 ) + ( fabs( pev->health ) / 100.0 ); - - if( fvol > 1.0 ) - fvol = 1.0; - - switch( m_Material ) - { - case matGlass: - switch( RANDOM_LONG( 0, 1 ) ) - { - case 0: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustglass1.wav", fvol, ATTN_NORM, 0, pitch ); - break; - case 1: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustglass2.wav", fvol, ATTN_NORM, 0, pitch ); - break; - } - cFlag = BREAK_GLASS; - break; - case matWood: - switch( RANDOM_LONG( 0, 1 ) ) - { - case 0: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustcrate1.wav", fvol, ATTN_NORM, 0, pitch ); - break; - case 1: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustcrate2.wav", fvol, ATTN_NORM, 0, pitch ); - break; - } - cFlag = BREAK_WOOD; - break; - case matComputer: - case matMetal: - switch( RANDOM_LONG( 0, 1 ) ) - { - case 0: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustmetal1.wav", fvol, ATTN_NORM, 0, pitch ); - break; - case 1: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustmetal2.wav", fvol, ATTN_NORM, 0, pitch ); - break; - } - cFlag = BREAK_METAL; - break; - case matFlesh: - switch( RANDOM_LONG( 0, 1 ) ) - { - case 0: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustflesh1.wav", fvol, ATTN_NORM, 0, pitch ); - break; - case 1: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustflesh2.wav", fvol, ATTN_NORM, 0, pitch ); - break; - } - cFlag = BREAK_FLESH; - break; - case matRocks: - case matCinderBlock: - switch( RANDOM_LONG( 0, 1 ) ) - { - case 0: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustconcrete1.wav", fvol, ATTN_NORM, 0, pitch ); - break; - case 1: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustconcrete2.wav", fvol, ATTN_NORM, 0, pitch ); - break; - } - cFlag = BREAK_CONCRETE; - break; - case matCeilingTile: - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "debris/bustceiling.wav", fvol, ATTN_NORM, 0, pitch ); - break; - } - - if( m_Explosion == expDirected ) - vecVelocity = g_vecAttackDir * 200; - else - { - vecVelocity.x = 0; - vecVelocity.y = 0; - vecVelocity.z = 0; - } - - vecSpot = pev->origin + (pev->mins + pev->maxs) * 0.5; - MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSpot ); - WRITE_BYTE( TE_BREAKMODEL); - - // position - WRITE_COORD( vecSpot.x ); - WRITE_COORD( vecSpot.y ); - WRITE_COORD( vecSpot.z ); - - // size - WRITE_COORD( pev->size.x); - WRITE_COORD( pev->size.y); - WRITE_COORD( pev->size.z); - - // velocity - WRITE_COORD( vecVelocity.x ); - WRITE_COORD( vecVelocity.y ); - WRITE_COORD( vecVelocity.z ); - - // randomization - WRITE_BYTE( 10 ); - - // Model - WRITE_SHORT( m_idShard ); //model id# - - // # of shards - WRITE_BYTE( 0 ); // let client decide - - // duration - WRITE_BYTE( 25 );// 2.5 seconds - - // flags - WRITE_BYTE( cFlag ); - MESSAGE_END(); - - float size = pev->size.x; - if( size < pev->size.y ) - size = pev->size.y; - if( size < pev->size.z ) - size = pev->size.z; - - // !!! HACK This should work! - // Build a box above the entity that looks like an 8 pixel high sheet - Vector mins = pev->absmin; - Vector maxs = pev->absmax; - mins.z = pev->absmax.z; - maxs.z += 8; - - // BUGBUG -- can only find 256 entities on a breakable -- should be enough - CBaseEntity *pList[256]; - int count = UTIL_EntitiesInBox( pList, 256, mins, maxs, FL_ONGROUND ); - if( count ) - { - for( int i = 0; i < count; i++ ) - { - ClearBits( pList[i]->pev->flags, FL_ONGROUND ); - pList[i]->pev->groundentity = NULL; - } - } - - // Don't fire something that could fire myself - pev->targetname = 0; - - pev->solid = SOLID_NOT; - - // Fire targets on break - SUB_UseTargets( NULL, USE_TOGGLE, 0 ); - - if( Explodable() && ( m_attacker != NULL ) ) - { - ExplosionCreate( pev->origin, pev->angles, m_attacker, ExplosionMagnitude(), FALSE ); - RadiusDamage( pev->origin, pev, VARS(m_attacker), ExplosionMagnitude(), ExplosionMagnitude() * 2.5 , CLASS_NONE, DMG_BLAST ); - } - UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); -} - -void CProp::Killed( entvars_t *pevAttacker, int iGib ) -{ - pev->takedamage = DAMAGE_NO; - pev->deadflag = DEAD_DEAD; - pev->solid = SOLID_NOT; - pev->effects |= EF_NODRAW; - pev->nextthink = gpGlobals->time + m_flRespawnTime; - SetThink( &CProp::RespawnThink ); - SetTouch( NULL ); - SetUse( NULL ); -} - -void CProp::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) -{ - if( pev->health <= 0 ) - return; - if( m_owner2 != pActivator->edict() ) - { - if( pev->velocity.Length() < 100 && pActivator->IsPlayer() ) - { - m_owner2 = m_attacker = pActivator->edict(); - } - else - return; - } - if( pActivator->IsPlayer() ) - { - m_pHolstered = (CBasePlayer *) pActivator; - if( m_pHolstered ) - { - - if( m_pHolstered->m_pActiveItem ) - { - CBasePlayerWeapon *weapon = (CBasePlayerWeapon *)m_pHolstered->m_pActiveItem->GetWeaponPtr(); - - //m_Holstered->m_pActiveItem->Holster(); // strange bug here. ValveWHY? - - // HACK: prevent attack - if( weapon ) - { - weapon->m_flNextPrimaryAttack += 0.1; - weapon->m_flNextSecondaryAttack += 0.1; - } - m_pHolstered->m_iHideHUD |= HIDEHUD_WEAPONS; - m_pHolstered->pev->weaponmodel = 0; - m_pHolstered->pev->viewmodel = 0; - } - SetThink( &CProp::DeployThink ); - pev->nextthink = gpGlobals->time + 0.2; - } - } - Vector target = pActivator->pev->origin + UTIL_GetAimVector( m_owner2, 1000 ) * 50; - target.z = target.z + 32; - pev->velocity = ( target - VecBModelOrigin( pev ) ) * 10; - Vector atarget = UTIL_VecToAngles(UTIL_GetAimVector( m_owner2, 1000 ) ); - pev->angles.x = UTIL_AngleMod( pev->angles.x ); - pev->angles.y = UTIL_AngleMod( pev->angles.y ); - pev->angles.z = UTIL_AngleMod( pev->angles.z ); - atarget.x = UTIL_AngleMod( atarget.x ); - atarget.y = UTIL_AngleMod( atarget.y ); - atarget.z = UTIL_AngleMod( atarget.z ); - pev->avelocity.x = UTIL_AngleDiff( atarget.x, pev->angles.x ) * 10; - pev->avelocity.y = UTIL_AngleDiff( atarget.y, pev->angles.y ) * 10; - pev->avelocity.z = UTIL_AngleDiff( atarget.z, pev->angles.z ) * 10; - //pev->angles.z += ( 0 - pev->angles.z ) * 0.06; - if( ( pActivator->pev->button & ( IN_ATTACK ) ) ) - { - pev->velocity = UTIL_GetAimVector( m_owner2, 1000 ) * 1000; - pev->avelocity.y = pev->avelocity.y * 1.5 + RANDOM_FLOAT( 100, -100 ); - pev->avelocity.x = pev->avelocity.x * 1.5 + RANDOM_FLOAT( 100, -100 ); - //pev->avelocity.z = pev->avelocity.z * 0.5 + RANDOM_FLOAT( 100, -100 ); - } - if ( ( pActivator->pev->button & ( IN_ATTACK2 ) ) ) - { - //m_Horizontal = false; - //pev->angles.z = 0; - } - // m_Horizontal = ( fabs( UTIL_AngleDiff( pev->angles.z, 90 ) ) < 20 ) || ( sin( pev->angles.x / 180 * M_PI ) > 0.1 ); - // CheckRotate(); - //ALERT( at_console, "Prop use!\n" ); -} - -void CProp::Force( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) -{ - if( pev->health <= 0 ) - return; - if( m_owner2 != pActivator->edict() ) - { - if( pev->velocity.Length() < 100 && pActivator->IsPlayer() ) - m_attacker = pActivator->edict(); - else - return; - } - - if( ( pActivator->pev->button & ( IN_ATTACK ) ) ) - { - pev->velocity = UTIL_GetAimVector( m_owner2, 3000 ) * 1000; - pev->avelocity.y = pev->avelocity.y * 1.5 + RANDOM_FLOAT( 100, -100 ); - pev->avelocity.x = pev->avelocity.x * 1.5 + RANDOM_FLOAT( 100, -100 ); - //pev->avelocity.z = pev->avelocity.z * 0.5 + RANDOM_FLOAT( 100, -100 ); - } - if( ( pActivator->pev->button & ( IN_ATTACK2 ) ) ) - { - //m_Horizontal = false; - //pev->angles.z = 0; - } - - pev->nextthink = gpGlobals->time + m_flRespawnTime; - SetThink( &CProp::RespawnThink ); -} - -void CProp::CheckRotate() -{ - if( m_shape != SHAPE_CYL_H && m_shape != SHAPE_CYL_V ) - { - UTIL_SetSize(pev, minsH, maxsH); - return; - } - if( ( fabs( UTIL_AngleDiff( pev->angles.z, 90 ) ) < 20 ) || ( fabs( sin( pev->angles.x / 180 * M_PI ) ) > 0.3 ) ) - m_shape = SHAPE_CYL_H; - else - m_shape = SHAPE_CYL_V; - - if( m_oldshape != m_shape ) - { - if( m_shape == SHAPE_CYL_H ) - { - pev->angles.y += 90; - - ALERT( at_console, "setH: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z ); - - UTIL_SetSize( pev, minsH, maxsH ); - } - else if( m_shape == SHAPE_CYL_V ) - { - Vector mins = pev->absmin; - Vector maxs = pev->absmax; - - mins.z = pev->absmax.z; - maxs.z += 10; - ALERT( at_console, "setV: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z ); - - // BUGBUG -- can only find 256 entities on a prop -- should be enough - CBaseEntity *pList[256]; - int count = UTIL_EntitiesInBox( pList, 256, mins, maxs, FL_ONGROUND ); - if( count ) - { - for( int i = 0; i < count; i++ ) - { - pList[i]->pev->origin.z += 10; - } - } - pev->origin.z += 10; - //pev->angles.y -= 90; - UTIL_SetSize( pev, minsV, maxsV ); - } - //DROP_TO_FLOOR( edict() ); - //pev->origin.z += 0.5; - m_oldshape = m_shape; - } -} - -void CProp::DeployThink( void ) -{ - if( m_pHolstered ) - { - if( m_pHolstered->m_pActiveItem ) - { - m_pHolstered->m_pActiveItem->Deploy(); - CBasePlayerWeapon *weapon = (CBasePlayerWeapon *) m_pHolstered->m_pActiveItem->GetWeaponPtr(); - if( weapon ) - { - weapon->m_flNextPrimaryAttack = 0; - weapon->m_flNextSecondaryAttack = 0; - } - } - m_pHolstered ->m_iHideHUD &= ~HIDEHUD_WEAPONS; - m_pHolstered = NULL; - } - if( m_pfnThink == &CProp::DeployThink ) - { - pev->nextthink = gpGlobals->time + m_flRespawnTime; - SetThink( &CProp::RespawnThink ); - } -} - -void CProp::BounceTouch( CBaseEntity *pOther ) -{ - if( pev->health <= 0 ) - return; - //ALERT( at_console, "BounceTouch: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z ); - // only do damage if we're moving fairly fast - DeployThink(); - - if( m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 300 ) - { - entvars_t *pevOwner = VARS( m_attacker ); - if( pevOwner ) - { - float dmg = 50 + pev->velocity.Length() / 40; - if( pOther->edict() == m_owner2 ) - { - dmg = 5; - if( pOther->pev->button & ( IN_USE ) ) - { - dmg = 1; - } - } - TraceResult tr = UTIL_GetGlobalTrace(); - ClearMultiDamage(); - pOther->TraceAttack( pevOwner, dmg, gpGlobals->v_forward, &tr, DMG_CLUB ); - ApplyMultiDamage( pev, pevOwner ); - } - m_flNextAttack = gpGlobals->time + 1.0; // debounce - } - if( ( pOther->edict() != m_owner2 ) && ( pev->spawnflags & SF_PROP_BREAKABLE ) && ( pev->velocity.Length() > 900 ) ) - { - pev->nextthink = gpGlobals->time + 0.1; - SetThink( &CProp::DieThink ); - } - - pev->velocity = pev->velocity + pOther->pev->velocity; - float dp = cos( M_PI / 180 * UTIL_AngleDiff( UTIL_VecToAngles( pev->velocity ).y, pev->angles.y ) ); - if( pev->flags & FL_ONGROUND || fabs( pev->velocity.z ) < 40 ) - { - CheckRotate(); - if( m_shape == SHAPE_CYL_H ) - { - pev->velocity.x *= fabs( dp ) * 0.8 + 0.2; - pev->velocity.y *= fabs( dp ) * 0.8 + 0.2; - pev->velocity.z -= 20; - pev->avelocity.x = -dp*pev->velocity.Length()* 1.5; - pev->avelocity.y = 0; - pev->avelocity.z = 0; - pev->angles.z += UTIL_AngleDiff( 90, pev->angles.z ) * 0.7; - //AngleThink(); - } - else if( m_shape == SHAPE_CYL_V ) - { - // pev->angles.z *= 0.3; - //pev->angles.x *= 0.3; - //AngleThink(); - //CheckRotate(); - pev->velocity.z *= m_flFloorFriction; - pev->velocity.x *= m_flFloorFriction; - pev->velocity.y *= m_flFloorFriction; - pev->velocity.z -= 10; - pev->avelocity.y = pev->avelocity.y * 0.4 + RANDOM_FLOAT( 30, -30 ); - } - else if( m_shape == SHAPE_SPHERE ) - { - pev->velocity.z -= 20; - pev->avelocity.x = -cos( M_PI / 180 * UTIL_AngleDiff( UTIL_VecToAngles( pev->velocity ).y, pev->angles.y ) ) * pev->velocity.Length() * 1.5; - pev->avelocity.y = -sin( M_PI / 180 * UTIL_AngleDiff( UTIL_VecToAngles( pev->velocity ).y, pev->angles.y ) ) * pev->velocity.Length() * 1.5;; - pev->avelocity.z = 0; - } - else if( m_shape == SHAPE_BOX || m_shape == SHAPE_GENERIC ) - { - pev->velocity.z *= m_flFloorFriction; - pev->velocity.x *= m_flFloorFriction; - pev->velocity.y *= m_flFloorFriction; - pev->velocity.z -= 10; - } - } - else - { - { - pev->velocity.z *= 0.3; - pev->velocity.y *= m_flCollideFriction; - pev->velocity.x *= m_flCollideFriction; - if( m_shape != SHAPE_SPHERE ) - { - pev->avelocity.y = pev->avelocity.y * 0.4 + RANDOM_FLOAT( 100, -100 ); - pev->avelocity.x = pev->avelocity.x * 0.5 + RANDOM_FLOAT( 100, -100 ); - } - } - //pev->avelocity.z = pev->avelocity.z*0.5 + RANDOM_FLOAT( 1, -1 ); - BounceSound(); - } - pev->framerate = pev->velocity.Length() / 200.0; - if( pev->framerate > 1.0 ) - pev->framerate = 1; - else if( pev->framerate < 0.2 ) - { - CheckRotate(); - AngleThink(); - if( pev->angles.z == 0 || pev->angles.z == 90 ) - pev->framerate = 0; - else - pev->framerate = 0.2; - } -} - -void CProp::BounceSound( void ) -{ - switch( RANDOM_LONG( 0, 2 ) ) - { - case 0: - EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/grenade_hit1.wav", 0.25, ATTN_NORM ); - break; - case 1: - EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/grenade_hit2.wav", 0.25, ATTN_NORM ); - break; - case 2: - EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/grenade_hit3.wav", 0.25, ATTN_NORM ); - break; - } -} - -void CProp::Spawn( void ) -{ - Precache(); - - if( minsH == g_vecZero ) - { - // default barrel parameters - minsV = Vector( -10, -10, -17 ); - maxsV = Vector( 10, 10, 18 ); - minsH = Vector( -10, -10, -10 ); - maxsH = Vector( 10, 10, 13 ); - } - m_flCollideFriction = 0.7; - m_flFloorFriction = 0.5; - spawnOrigin = pev->origin; - spawnAngles = pev->angles; - m_flSpawnHealth = pev->health; - if( m_flSpawnHealth <= 0 ) - m_flSpawnHealth = 30; - if( !m_flRespawnTime ) - m_flRespawnTime = 20; - pev->dmg = 100; - PropRespawn(); -} - -void CProp::PropRespawn() -{ - UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); - pev->effects &= ~EF_NODRAW; - pev->movetype = MOVETYPE_BOUNCE; - pev->solid = SOLID_SLIDEBOX; - pev->takedamage = DAMAGE_YES; - pev->health = m_flSpawnHealth; - pev->velocity = pev->avelocity = g_vecZero; - pev->angles = spawnAngles; - pev->deadflag = DEAD_NO; - SET_MODEL( ENT( pev ), STRING( pev->model ) ); - m_oldshape = ( PropShape ) - 1; - CheckRotate(); - SetTouch( &CProp::BounceTouch ); - SetUse( &CProp::Use ); - - pev->framerate = 1.0f; - UTIL_SetOrigin( pev, spawnOrigin ); -} - -void CProp::RespawnThink() -{ - if( !( pev->spawnflags & SF_PROP_RESPAWN ) ) - { - if( pev->health <= 0 ) - { - pev->nextthink = gpGlobals->time + 0.1; - SetThink( &CBaseEntity::SUB_Remove ); - } - return; - } - PropRespawn(); -} - -void CProp::AngleThink() -{ - pev->nextthink = gpGlobals->time + m_flRespawnTime; - SetThink( &CProp::RespawnThink); - if(! ( pev->flags & FL_ONGROUND || fabs( pev->velocity.z ) < 40 ) ) - { - m_owner2 = m_attacker = 0; - return; - } - if( m_shape == SHAPE_CYL_H ) - { - pev->angles.z += UTIL_AngleDiff( 90, pev->angles.z ) * 0.7; - if( fabs( UTIL_AngleDiff( 90, pev->angles.z ) ) > 0.1 ) - { - SetThink( &CProp::AngleThink ); - pev->nextthink = gpGlobals->time + 0.1; - } - //ALERT( at_console, "AngleThink: %f %f %f\n", pev->angles.x, pev->angles.y, pev->angles.z ); - pev->avelocity.y = pev->avelocity.z = 0; - } - else if( m_shape == SHAPE_CYL_V ) - { - if( fabs( UTIL_AngleDiff( 90, pev->angles.z ) ) > 0.1 ) - { - SetThink( &CProp::AngleThink ); - pev->nextthink = gpGlobals->time + 0.1; - } - pev->angles.z += UTIL_AngleDiff( 0, pev->angles.z ) * 0.7; - //pev->angles.x += UTIL_AngleDiff( 0, pev->angles.x ) * 0.3; - pev->avelocity.x = pev->avelocity.y = pev->avelocity.z = 0; - } - else if( m_shape == SHAPE_BOX ) - { - Vector iangles; - iangles.x = round( pev->angles.x / 90 ) * 90; - iangles.y = round( pev->angles.y / 90 ) * 90; - iangles.z = round( pev->angles.z / 90 ) * 90; - if( fabs( UTIL_AngleDiff( iangles.x, pev->angles.x ) ) > 0.1 || - //fabs( UTIL_AngleDiff( iangles.y, pev->angles.y ) ) > 0.1 || - fabs( UTIL_AngleDiff( iangles.z, pev->angles.z ) ) > 0.1) - { - SetThink( &CProp::AngleThink ); - pev->nextthink = gpGlobals->time + 0.1; - } - pev->angles.x += UTIL_AngleDiff( iangles.x, pev->angles.x ) * 0.6; - //pev->angles.y += UTIL_AngleDiff( iangles.y, pev->angles.y ) * 0.6; - pev->angles.z += UTIL_AngleDiff( iangles.z, pev->angles.z ) * 0.6; - - pev->avelocity.x = pev->avelocity.y = pev->avelocity.z = 0; - } - else if( m_shape == SHAPE_NOROTATE ) - { - pev->avelocity.x = pev->avelocity.y = pev->avelocity.z = 0; - Vector iangles = spawnAngles; - if( fabs(UTIL_AngleDiff( iangles.x, pev->angles.x ) ) > 0.1 || - fabs( UTIL_AngleDiff( iangles.y, pev->angles.y ) ) > 0.1 || - fabs( UTIL_AngleDiff( iangles.z, pev->angles.z ) ) > 0.1 ) - { - SetThink( &CProp::AngleThink ); - pev->nextthink = gpGlobals->time + 0.1; - } - pev->angles.x += UTIL_AngleDiff( iangles.x, pev->angles.x ) * 0.6; - pev->angles.y += UTIL_AngleDiff( iangles.y, pev->angles.y ) * 0.6; - pev->angles.z += UTIL_AngleDiff( iangles.z, pev->angles.z ) * 0.6; - } - else if( m_shape == SHAPE_GENERIC ) - { - float ianglex = 0, ianglez = 0, imaxanglediff=360.0f; - // if first number is zero, it is angle - // all other zeroes is array end - for( int i = 0; ( i < 10 ) && ( ( i == 0 ) || m_iaCustomAnglesX[i] ); i++ ) - { - float anglediff = fabs( UTIL_AngleDiff( pev->angles.x, m_iaCustomAnglesX[i] ) ); - if( imaxanglediff > anglediff ) - { - ianglex = m_iaCustomAnglesX[i]; - imaxanglediff = anglediff; - } - } - imaxanglediff=360.0f; - for( int i = 0; ( i < 10 ) && ( ( i == 0 ) || m_iaCustomAnglesZ[i] ); i++ ) - { - float anglediff = fabs( UTIL_AngleDiff( pev->angles.z, m_iaCustomAnglesZ[i] ) ); - if( imaxanglediff > anglediff ) - { - ianglez = m_iaCustomAnglesZ[i]; - imaxanglediff = anglediff; - } - } - if( fabs( UTIL_AngleDiff( ianglex, pev->angles.x ) ) > 0.1 || - fabs( UTIL_AngleDiff( ianglez, pev->angles.z ) ) > 0.1 ) - { - SetThink( &CProp::AngleThink ); - pev->nextthink = gpGlobals->time + 0.1; - } - pev->angles.x += UTIL_AngleDiff( ianglex, pev->angles.x ) * 0.6; - pev->angles.z += UTIL_AngleDiff( ianglez, pev->angles.z ) * 0.6; - pev->avelocity.x = pev->avelocity.y = pev->avelocity.z = 0; - } - pev->angles.x = UTIL_AngleMod( pev->angles.x ); - pev->angles.y = UTIL_AngleMod( pev->angles.y ); - pev->angles.z = UTIL_AngleMod( pev->angles.z ); -} - -void CProp::DieThink() -{ - Killed( VARS( m_attacker ), GIB_NORMAL ); - Die(); -} - -int CProp::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) -{ - Vector r = ( pevInflictor->origin - pev->origin ); - if( ( !m_attacker || ( pev->velocity.Length() < 700 ) ) - && ( (CBaseEntity*)GET_PRIVATE( ENT( pevAttacker ) ) )->IsPlayer() ) - m_attacker = ENT( pevAttacker ); - DeployThink(); - - pev->velocity = r * flDamage / -7; - pev->avelocity.x = pev->avelocity.x*0.5 + RANDOM_FLOAT( 100, -100 ); - ALERT( at_console, "Takedmg: %s %s %f %f\n", STRING( pevInflictor->classname ), STRING( pevAttacker->classname ), flDamage, pev->health ); - - // now some func_breakable code - if( !( pev->spawnflags & SF_PROP_BREAKABLE ) ) - return 0; - if( pev->health <= 0 ) - return; - // Breakables take double damage from the crowbar - if( bitsDamageType & DMG_CLUB ) - flDamage *= 2; - - // Boxes / glass / etc. don't take much poison damage, just the impact of the dart - consider that 10% - if( bitsDamageType & DMG_POISON ) - flDamage *= 0.1; - g_vecAttackDir = r.Normalize(); - - // do the damage - pev->health -= flDamage; - if( pev->health <= 0 ) - { - // delayed explode - SetThink( &CProp::DieThink ); - pev->nextthink = gpGlobals->time + 0.2; - return 0; - } - - // Make a shard noise each time func breakable is hit. - // Don't play shard noise if cbreakable actually died. - DamageSound(); - return 1; -} - -void CProp::KeyValue( KeyValueData* pkvd ) -{ - ALERT( at_console, "%s %s\n", pkvd->szKeyName, pkvd->szValue ); - // UNDONE_WC: explicitly ignoring these fields, but they shouldn't be in the map file! - if( FStrEq( pkvd->szKeyName, "explosion" ) ) - { - if( !stricmp( pkvd->szValue, "directed" ) ) - m_Explosion = expDirected; - else if( !stricmp(pkvd->szValue, "random" ) ) - m_Explosion = expRandom; - else - m_Explosion = expRandom; - - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "material" ) ) - { - int i = atoi( pkvd->szValue ); - - // 0:glass, 1:metal, 2:flesh, 3:wood - - if( ( i < 0 ) || ( i >= matLastMaterial ) ) - m_Material = matWood; - else - m_Material = (Materials)i; - - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "shape" ) ) - { - int i = atoi( pkvd->szValue ); - - if( ( i < 0 ) || ( i >= SHAPE_NOROTATE ) ) - m_shape = SHAPE_NOROTATE; - else - m_shape = (PropShape)i; - - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "gibmodel" ) ) - { - m_iszGibModel = ALLOC_STRING( pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "explodemagnitude" ) ) - { - ExplosionSetMagnitude( atoi( pkvd->szValue ) ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "respawntime" ) ) - { - m_flRespawnTime = atof( pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "customanglesx" ) ) - { - UTIL_StringToIntArray( m_iaCustomAnglesX, ARRAYSIZE( m_iaCustomAnglesX ), pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "customanglesz" ) ) - { - UTIL_StringToIntArray( m_iaCustomAnglesZ, ARRAYSIZE( m_iaCustomAnglesZ ), pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "hmin" ) ) - { - UTIL_StringToVector( minsH, pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "hmax" ) ) - { - UTIL_StringToVector( maxsH, pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "vmin" ) ) - { - UTIL_StringToVector( minsV, pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else if( FStrEq( pkvd->szKeyName, "vmax" ) ) - { - UTIL_StringToVector( maxsV, pkvd->szValue ); - pkvd->fHandled = TRUE; - } - else - CBaseEntity::KeyValue( pkvd ); -} diff --git a/dlls/wscript b/dlls/wscript index 0a40cb81..2c372154 100644 --- a/dlls/wscript +++ b/dlls/wscript @@ -6,7 +6,6 @@ from waflib import Utils import os def options(opt): - # stub return def configure(conf): @@ -16,119 +15,21 @@ def configure(conf): hlDefNode = conf.path.find_resource("./hl.def") if hlDefNode is not None: - conf.env.append_unique('LINKFLAGS', '/def:%s' % hlDefNode.abspath()) + conf.env.append_value('LINKFLAGS', '/def:%s' % hlDefNode.abspath()) else: conf.fatal("Could not find hl.def") def build(bld): - source = bld.path.parent.ant_glob([ - 'pm_shared/*.c', - ]) - source += bld.path.ant_glob([ - 'redempt/roy.cpp', - 'tot/civ.cpp' - ]) - source += [ - 'agrunt.cpp', - 'airtank.cpp', - 'aflock.cpp', - 'animating.cpp', - 'animation.cpp', - 'apache.cpp', - 'barnacle.cpp', - 'barney.cpp', - 'bigmomma.cpp', - 'bloater.cpp', - 'bmodels.cpp', - 'bullsquid.cpp', - 'buttons.cpp', - 'cbase.cpp', - 'client.cpp', - 'combat.cpp', - 'controller.cpp', - 'crossbow.cpp', - 'crowbar.cpp', - 'defaultai.cpp', - 'doors.cpp', - 'effects.cpp', - 'egon.cpp', - 'explode.cpp', - 'flyingmonster.cpp', - 'func_break.cpp', - 'func_tank.cpp', - 'game.cpp', - 'gamerules.cpp', - 'gargantua.cpp', - 'gauss.cpp', - 'genericmonster.cpp', - 'ggrenade.cpp', - 'globals.cpp', - 'glock.cpp', - 'gman.cpp', - 'h_ai.cpp', - 'h_battery.cpp', - 'h_cine.cpp', - 'h_cycler.cpp', - 'h_export.cpp', - 'handgrenade.cpp', - 'hassassin.cpp', - 'headcrab.cpp', - 'healthkit.cpp', - 'hgrunt.cpp', - 'hornet.cpp', - 'hornetgun.cpp', - 'houndeye.cpp', - 'ichthyosaur.cpp', - 'islave.cpp', - 'items.cpp', - 'leech.cpp', - 'lights.cpp', - 'maprules.cpp', - 'monstermaker.cpp', - 'monsters.cpp', - 'monsterstate.cpp', - 'mortar.cpp', - 'mp5.cpp', - 'multiplay_gamerules.cpp', - 'nihilanth.cpp', - 'nodes.cpp', - 'observer.cpp', - 'osprey.cpp', - 'pathcorner.cpp', - 'plane.cpp', - 'plats.cpp', - 'player.cpp', - 'playermonster.cpp', - 'python.cpp', - 'rat.cpp', - 'roach.cpp', - 'rpg.cpp', - 'satchel.cpp', - 'schedule.cpp', - 'scientist.cpp', - 'scripted.cpp', - 'shotgun.cpp', - 'singleplay_gamerules.cpp', - 'skill.cpp', - 'sound.cpp', - 'soundent.cpp', - 'spectator.cpp', - 'squadmonster.cpp', - 'squeakgrenade.cpp', - 'subs.cpp', - 'talkmonster.cpp', - 'teamplay_gamerules.cpp', - 'tempmonster.cpp', - 'tentacle.cpp', - 'triggers.cpp', - 'tripmine.cpp', - 'turret.cpp', - 'util.cpp', - 'weapons.cpp', - 'world.cpp', - 'xen.cpp', - 'zombie.cpp' - ] + excluded_files = ['mpstubb.cpp', 'stats.cpp', 'prop.cpp', 'Wxdebug.cpp'] + + source = bld.path.ant_glob('**/*.cpp', excl=excluded_files) + source += bld.path.parent.ant_glob('pm_shared/*.c') + + defines = [] + if bld.env.USE_VOICEMGR: + source += bld.path.parent.ant_glob('game_shared/voice_gamemgr.cpp') + else: + defines += ['NO_VOICEGAMEMGR'] includes = [ '.', @@ -139,32 +40,20 @@ def build(bld): '../public' ] - defines = [] - - if bld.env.VOICEMGR: - source += bld.path.parent.ant_glob([ - 'game_shared/voice_gamemgr.cpp', - ]) - else: - defines += ['NO_VOICEGAMEMGR'] - - libs = [] - if bld.env.DEST_OS not in ['android', 'dos']: - install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_DIR) + install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_INSTALL_DIR) else: install_path = bld.env.PREFIX bld.shlib( source = source, - target = bld.env.SERVER_NAME + bld.env.POSTFIX, + target = bld.env.SERVER_LIBRARY_NAME + bld.env.POSTFIX, name = 'server', features = 'c cxx', includes = includes, defines = defines, - use = libs, install_path = install_path, subsystem = bld.env.MSVC_SUBSYSTEM, - idx = bld.get_taskgen_count() + idx = bld.get_taskgen_count() ) diff --git a/engine/sprite.h b/engine/sprite.h index ee0c317b..9b112d9e 100644 --- a/engine/sprite.h +++ b/engine/sprite.h @@ -28,11 +28,14 @@ SPRITE MODELS #define IDSPRITEHEADER (('P'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDSP" #define SPRITE_VERSION 2 // Half-Life sprites +#if !defined(SYNCTYPE_T) +#define SYNCTYPE_T typedef enum { ST_SYNC = 0, ST_RAND } synctype_t; +#endif typedef enum { diff --git a/mod_options.txt b/mod_options.txt new file mode 100644 index 00000000..5218c9fb --- /dev/null +++ b/mod_options.txt @@ -0,0 +1,18 @@ +BARNACLE_FIX_VISIBILITY=OFF # Barnacle tongue length fix +CLIENT_WEAPONS=ON # Client local weapons prediction +CROWBAR_IDLE_ANIM=OFF # Crowbar idle animation +CROWBAR_DELAY_FIX=OFF # Crowbar attack delay fix +CROWBAR_FIX_RAPID_CROWBAR=OFF # Rapid crowbar fix +GAUSS_OVERCHARGE_FIX=OFF # Gauss overcharge fix +TRIPMINE_BEAM_DUPLICATION_FIX=OFF # Fix of tripmine beam duplication on level transition +HANDGRENADE_DEPLOY_FIX=OFF # Handgrenade deploy animation fix after finishing a throw +WEAPONS_ANIMATION_TIMES_FIX=OFF # Animation times fix for some weapons +OEM_BUILD=OFF # OEM Build +HLDEMO_BUILD=OFF # Demo Build +MOBILE_HACKS=ON + +GAMEDIR=valve # Gamedir path +SERVER_INSTALL_DIR=dlls # Where put server dll +CLIENT_INSTALL_DIR=cl_dlls # Where put client dll +SERVER_LIBRARY_NAME=hl # Library name for PC platforms + diff --git a/pm_shared/pm_shared.c b/pm_shared/pm_shared.c index d5ad05d5..32585d6a 100644 --- a/pm_shared/pm_shared.c +++ b/pm_shared/pm_shared.c @@ -31,8 +31,6 @@ #include "pm_movevars.h" #include "pm_debug.h" -int g_bhopcap = 1; - #if CLIENT_DLL // Spectator Mode int iJumpSpectator; @@ -2481,6 +2479,8 @@ PM_Jump void PM_Jump( void ) { int i; + qboolean bunnyjump = false; + qboolean tfc = false; qboolean cansuperjump = false; @@ -2564,7 +2564,10 @@ void PM_Jump( void ) // In the air now. pmove->onground = -1; - if( g_bhopcap ) + if( pmove->multiplayer ) + bunnyjump = atoi( pmove->PM_Info_ValueForKey( pmove->physinfo, "bj" ) ) ? true : false; + + if( !bunnyjump ) PM_PreventMegaBunnyJumping(); if( tfc ) @@ -3319,7 +3322,8 @@ void PM_Move( struct playermove_s *ppmove, int server ) } // Reset friction after each movement to FrictionModifier Triggers work still. - if( pmove->movetype == MOVETYPE_WALK ) + // Use movevar to avoid lags with different clients and servers. + if( !( pmove->multiplayer && atoi( pmove->PM_Info_ValueForKey( pmove->physinfo, "fr" )) == 0 ) && pmove->movetype == MOVETYPE_WALK ) { pmove->friction = 1.0f; } diff --git a/public/build.h b/public/build.h index 4e4fe110..636d97a4 100644 --- a/public/build.h +++ b/public/build.h @@ -30,15 +30,22 @@ For more information, please refer to #ifndef BUILD_H #define BUILD_H -// All XASH_* macros set by this header are guaranteed to have positive value otherwise not defined +/* +All XASH_* macros set by this header are guaranteed to have positive value +otherwise not defined. -// Any new define must be undefined at first -// You can generate #undef list below with this oneliner: -// $ cat build.h | sed 's/\t//g' | grep '^#define XASH' | awk '{ print $2 }' | sort | uniq | awk '{ print "#undef " $1 }' -// -// So in various buildscripts you can grep for ^#undef XASH and select only second word -// or in another oneliner: -// $ cat build.h | grep '^#undef XASH' | awk '{ print $2 }' +Every macro is intended to be the unified interface for buildsystems that lack +platform & CPU detection, and a neat quick way for checks in platform code +For Q_build* macros, refer to buildenums.h + +Any new define must be undefined at first +You can generate #undef list below with this oneliner: + $ sed 's/\t//g' build.h | grep '^#define XASH' | awk '{ print $2 }' | \ + sort | uniq | awk '{ print "#undef " $1 }' + +Then you can use another oneliner to query all variables: + $ grep '^#undef XASH' build.h | awk '{ print $2 }' +*/ #undef XASH_64BIT #undef XASH_AMD64 @@ -53,21 +60,19 @@ For more information, please refer to #undef XASH_ARMv7 #undef XASH_ARMv8 #undef XASH_BIG_ENDIAN -#undef XASH_BSD #undef XASH_DOS4GW #undef XASH_E2K #undef XASH_EMSCRIPTEN #undef XASH_FREEBSD #undef XASH_HAIKU #undef XASH_IOS +#undef XASH_IRIX #undef XASH_JS #undef XASH_LINUX +#undef XASH_LINUX_UNKNOWN #undef XASH_LITTLE_ENDIAN -#undef XASH_MINGW #undef XASH_MIPS -#undef XASH_PPC #undef XASH_MOBILE_PLATFORM -#undef XASH_MSVC #undef XASH_NETBSD #undef XASH_OPENBSD #undef XASH_POSIX @@ -77,74 +82,63 @@ For more information, please refer to #undef XASH_RISCV_SOFTFP #undef XASH_SERENITY #undef XASH_WIN32 -#undef XASH_WIN64 #undef XASH_X86 #undef XASH_NSWITCH #undef XASH_PSVITA //================================================================ // -// OPERATING SYSTEM DEFINES +// PLATFORM DETECTION CODE // //================================================================ -#if defined(_WIN32) +#if defined _WIN32 #define XASH_WIN32 1 - #if defined(__MINGW32__) - #define XASH_MINGW 1 - #elif defined(_MSC_VER) - #define XASH_MSVC 1 - #endif - - #if defined(_WIN64) - #define XASH_WIN64 1 - #endif -#elif defined __SWITCH__ - #define XASH_NSWITCH 1 - #define XASH_LITTLE_ENDIAN 1 - #define XASH_POSIX 1 -#elif defined __vita__ - #define XASH_PSVITA 1 - #define XASH_LITTLE_ENDIAN 1 - #define XASH_POSIX 1 -#elif defined(__linux__) - #define XASH_LINUX 1 - #if defined(__ANDROID__) - #define XASH_ANDROID 1 - #endif // defined(__ANDROID__) - #define XASH_POSIX 1 -#elif defined(__APPLE__) - #include - #define XASH_APPLE 1 - #if TARGET_OS_IOS - #define XASH_IOS 1 - #endif // TARGET_OS_IOS - #define XASH_POSIX 1 -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) - #define XASH_BSD 1 - #if defined(__FreeBSD__) - #define XASH_FREEBSD 1 - #elif defined(__NetBSD__) - #define XASH_NETBSD 1 - #elif defined(__OpenBSD__) - #define XASH_OPENBSD 1 - #endif - #define XASH_POSIX 1 #elif defined __EMSCRIPTEN__ #define XASH_EMSCRIPTEN 1 #elif defined __WATCOMC__ && defined __DOS__ #define XASH_DOS4GW 1 - #define XASH_LITTLE_ENDIAN 1 -#elif defined __HAIKU__ - #define XASH_HAIKU 1 - #define XASH_POSIX 1 -#elif defined __serenity__ - #define XASH_SERENITY 1 +#else // POSIX compatible #define XASH_POSIX 1 -#else -#error "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug" + #if defined __linux__ + #if defined __ANDROID__ + #define XASH_ANDROID 1 + #else + #include + // if our system libc has features.h header + // try to detect it to not confuse other libcs with built with glibc game libraries + #if !defined __GLIBC__ + #define XASH_LINUX_UNKNOWN 1 + #endif + #endif + #define XASH_LINUX 1 + #elif defined __FreeBSD__ + #define XASH_FREEBSD 1 + #elif defined __NetBSD__ + #define XASH_NETBSD 1 + #elif defined __OpenBSD__ + #define XASH_OPENBSD 1 + #elif defined __HAIKU__ + #define XASH_HAIKU 1 + #elif defined __serenity__ + #define XASH_SERENITY 1 + #elif defined __sgi + #define XASH_IRIX 1 + #elif defined __APPLE__ + #include + #define XASH_APPLE 1 + #if TARGET_OS_IOS + #define XASH_IOS 1 + #endif // TARGET_OS_IOS + #elif defined __SWITCH__ + #define XASH_NSWITCH 1 + #elif defined __vita__ + #define XASH_PSVITA 1 + #else + #error + #endif #endif -#if defined XASH_ANDROID || defined XASH_IOS || defined XASH_NSWITCH || defined XASH_PSVITA +#if XASH_ANDROID || defined XASH_IOS || defined XASH_NSWITCH || defined XASH_PSVITA #define XASH_MOBILE_PLATFORM 1 #endif @@ -154,27 +148,17 @@ For more information, please refer to // //================================================================ -#if defined(XASH_FORCE_LITTLE_ENDIAN) && defined(XASH_FORCE_BIG_ENDIAN) - #error "Both XASH_FORCE_LITTLE_ENDIAN and XASH_FORCE_BIG_ENDIAN are defined" -#elif defined(XASH_FORCE_LITTLE_ENDIAN) - #define XASH_LITTLE_ENDIAN 1 -#elif defined(XASH_FORCE_BIG_ENDIAN) - #define XASH_BIG_ENDIAN 1 -#endif - -#if !defined(XASH_LITTLE_ENDIAN) && !defined(XASH_BIG_ENDIAN) - #if defined XASH_MSVC || __LITTLE_ENDIAN__ +#if !defined XASH_ENDIANNESS + #if defined XASH_WIN32 || __LITTLE_ENDIAN__ //!!! Probably all WinNT installations runs in little endian #define XASH_LITTLE_ENDIAN 1 #elif __BIG_ENDIAN__ #define XASH_BIG_ENDIAN 1 - #elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && defined(__ORDER_LITTLE_ENDIAN__) // some compilers define this + #elif defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ && defined __ORDER_LITTLE_ENDIAN__ // some compilers define this #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define XASH_BIG_ENDIAN 1 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define XASH_LITTLE_ENDIAN 1 - #else - #error "Unknown endianness!" #endif #else #include @@ -182,8 +166,6 @@ For more information, please refer to #define XASH_BIG_ENDIAN 1 #elif __BYTE_ORDER == __LITTLE_ENDIAN #define XASH_LITTLE_ENDIAN 1 - #else - #error "Unknown endianness!" #endif #endif // !XASH_WIN32 #endif @@ -193,18 +175,28 @@ For more information, please refer to // CPU ARCHITECTURE DEFINES // //================================================================ -#if defined(__x86_64__) || defined(_M_X64) +#if defined __x86_64__ || defined _M_X64 #define XASH_64BIT 1 #define XASH_AMD64 1 -#elif defined(__i386__) || defined(_X86_) || defined(_M_IX86) +#elif defined __i386__ || defined _X86_ || defined _M_IX86 #define XASH_X86 1 #elif defined __aarch64__ || defined _M_ARM64 #define XASH_64BIT 1 - #define XASH_ARM 8 -#elif defined __arm__ || defined _M_ARM + #define XASH_ARM 8 +#elif defined __mips__ + #define XASH_MIPS 1 +#elif defined __EMSCRIPTEN__ + #define XASH_JS 1 +#elif defined __e2k__ + #define XASH_64BIT 1 + #define XASH_E2K 1 +#elif defined _M_ARM // msvc + #define XASH_ARM 7 + #define XASH_ARM_HARDFP 1 +#elif defined __arm__ #if __ARM_ARCH == 8 || __ARM_ARCH_8__ #define XASH_ARM 8 - #elif __ARM_ARCH == 7 || __ARM_ARCH_7__ || defined _M_ARM // msvc can only armv7 in 32 bit + #elif __ARM_ARCH == 7 || __ARM_ARCH_7__ #define XASH_ARM 7 #elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__ #define XASH_ARM 6 @@ -216,34 +208,17 @@ For more information, please refer to #error "Unknown ARM" #endif - #if defined _M_ARM - #error "No WinMobile port yet! Need to determine which ARM float ABI msvc uses if applicable" - #endif - #if defined __SOFTFP__ || __ARM_PCS_VFP == 0 #define XASH_ARM_SOFTFP 1 #else // __SOFTFP__ #define XASH_ARM_HARDFP 1 #endif // __SOFTFP__ -#elif defined __mips__ - #define XASH_MIPS 1 -#elif defined __powerpc__ - #define XASH_PPC 1 - #if defined __powerpc64__ - #define XASH_64BIT 1 - #endif -#elif defined __EMSCRIPTEN__ - #define XASH_JS 1 -#elif defined __e2k__ - #define XASH_64BIT 1 - #define XASH_E2K 1 #elif defined __riscv #define XASH_RISCV 1 + #if __riscv_xlen == 64 #define XASH_64BIT 1 - #elif __riscv_xlen == 32 - // ... - #else + #elif __riscv_xlen != 32 #error "Unknown RISC-V ABI" #endif @@ -260,10 +235,6 @@ For more information, please refer to #error "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug" #endif -#if defined(XASH_WAF_DETECTED_64BIT) && !defined(XASH_64BIT) - #define XASH_64BIT 1 -#endif - #if XASH_ARM == 8 #define XASH_ARMv8 1 #elif XASH_ARM == 7 diff --git a/scripts/waifulib/compiler_optimizations.py b/scripts/waifulib/compiler_optimizations.py index 688c6f55..9cc81b7c 100644 --- a/scripts/waifulib/compiler_optimizations.py +++ b/scripts/waifulib/compiler_optimizations.py @@ -118,7 +118,7 @@ POLLY_CFLAGS = { def options(opt): grp = opt.add_option_group('Compiler optimization options') - grp.add_option('-T', '--build-type', action='store', dest='BUILD_TYPE', default=None, + grp.add_option('-T', '--build-type', action='store', dest='BUILD_TYPE', default='release', help = 'build type: debug, release or none(custom flags)') grp.add_option('--enable-lto', action = 'store_true', dest = 'LTO', default = False, @@ -129,12 +129,11 @@ def options(opt): def configure(conf): conf.start_msg('Build type') - if conf.options.BUILD_TYPE == None: - conf.end_msg('not set', color='RED') - conf.fatal('Set a build type, for example "-T release"') - elif not conf.options.BUILD_TYPE in VALID_BUILD_TYPES: + + if not conf.options.BUILD_TYPE in VALID_BUILD_TYPES: conf.end_msg(conf.options.BUILD_TYPE, color='RED') conf.fatal('Invalid build type. Valid are: %s' % ', '.join(VALID_BUILD_TYPES)) + conf.end_msg(conf.options.BUILD_TYPE) conf.msg('LTO build', 'yes' if conf.options.LTO else 'no') @@ -175,5 +174,7 @@ def get_optimization_flags(conf): elif conf.env.DEST_OS == 'psvita': # this optimization is broken in vitasdk cflags.append('-fno-optimize-sibling-calls') + # remove fvisibility to allow everything to be exported by default + cflags.remove('-fvisibility=hidden') return cflags, linkflags diff --git a/scripts/waifulib/library_naming.py b/scripts/waifulib/library_naming.py index b8985c92..78acafe9 100644 --- a/scripts/waifulib/library_naming.py +++ b/scripts/waifulib/library_naming.py @@ -35,21 +35,19 @@ DEFINES = [ 'XASH_ARMv7', 'XASH_ARMv8', 'XASH_BIG_ENDIAN', -'XASH_BSD', 'XASH_DOS4GW', 'XASH_E2K', 'XASH_EMSCRIPTEN', 'XASH_FREEBSD', 'XASH_HAIKU', 'XASH_IOS', +'XASH_IRIX', 'XASH_JS', 'XASH_LINUX', +'XASH_LINUX_UNKNOWN', 'XASH_LITTLE_ENDIAN', -'XASH_MINGW', 'XASH_MIPS', -'XASH_PPC', 'XASH_MOBILE_PLATFORM', -'XASH_MSVC', 'XASH_NETBSD', 'XASH_OPENBSD', 'XASH_POSIX', @@ -59,7 +57,6 @@ DEFINES = [ 'XASH_RISCV_SOFTFP', 'XASH_SERENITY', 'XASH_WIN32', -'XASH_WIN64', 'XASH_X86', 'XASH_NSWITCH', 'XASH_PSVITA', @@ -78,6 +75,8 @@ def configure(conf): # engine/common/build.c if conf.env.XASH_ANDROID: buildos = "android" + elif conf.env.XASH_LINUX_UNKNOWN: + buildos = "linuxunkabi" elif conf.env.XASH_WIN32 or conf.env.XASH_LINUX or conf.env.XASH_APPLE: buildos = "" # no prefix for default OS elif conf.env.XASH_FREEBSD: @@ -98,6 +97,8 @@ def configure(conf): buildos = "nswitch" elif conf.env.XASH_PSVITA: buildos = "psvita" + elif conf.env.XASH_IRIX: + buildos = "irix" else: conf.fatal("Place your operating system name in build.h and library_naming.py!\n" "If this is a mistake, try to fix conditions above and report a bug") @@ -136,12 +137,6 @@ def configure(conf): buildarch += "64" if conf.env.XASH_LITTLE_ENDIAN: buildarch += "el" - elif conf.env.XASH_PPC: - buildarch = "powerpc" - if conf.env.XASH_64BIT: - buildarch += "64" - if conf.env.XASH_LITTLE_ENDIAN: - buildarch += "le" elif conf.env.XASH_RISCV: buildarch = "riscv" if conf.env.XASH_64BIT: diff --git a/scripts/waifulib/vgui.py b/scripts/waifulib/vgui.py new file mode 100644 index 00000000..7f1b5a68 --- /dev/null +++ b/scripts/waifulib/vgui.py @@ -0,0 +1,79 @@ +#! /usr/bin/env python +# encoding: utf-8 +# mittorn, 2018 + +from waflib.Configure import conf +import os + +VGUI_SUPPORTED_OS = ['win32', 'darwin', 'linux'] + +VGUI_FRAGMENT = '''#include +int main() { return 0; }''' + +def options(opt): + grp = opt.add_option_group('VGUI options') + + vgui_dev_path = os.path.join(opt.path.path_from(opt.path), 'vgui_support', 'vgui-dev') + + grp.add_option('--vgui', action = 'store', dest = 'VGUI_DEV', default=vgui_dev_path, + help = 'path to vgui-dev repo [default: %default]') + + grp.add_option('--skip-vgui-sanity-check', action = 'store_false', dest = 'VGUI_SANITY_CHECK', default=True, + help = 'skip checking VGUI sanity [default: %default]' ) + return + +@conf +def check_vgui(conf): + conf.start_msg('Does this architecture support VGUI?') + + if conf.env.DEST_CPU != 'x86' and not (conf.env.DEST_CPU == 'x86_64' and not conf.options.ALLOW64): + conf.end_msg('no') + Logs.warn('vgui is not supported on this CPU: ' + str(conf.env.DEST_CPU)) + return False + else: conf.end_msg('yes') + + conf.start_msg('Does this OS support VGUI?') + if conf.env.DEST_OS not in VGUI_SUPPORTED_OS: + conf.end_msg('no') + Logs.warn('vgui is not supported on this OS: ' + str(conf.env.DEST_OS)) + return False + else: conf.end_msg('yes') + + conf.start_msg('Does this toolchain able to link VGUI?') + if conf.env.DEST_OS == 'win32' and conf.env.COMPILER_CXX == 'g++': + conf.end_msg('no') + # we have ABI incompatibility ONLY on MinGW + Logs.warn('vgui can\'t be linked with MinGW') + return False + else: conf.end_msg('yes') + + conf.start_msg('Configuring VGUI by provided path') + vgui_dev = conf.options.VGUI_DEV + + if conf.env.DEST_OS == 'win32': + conf.env.LIB_VGUI = ['vgui'] + conf.env.LIBPATH_VGUI = [os.path.abspath(os.path.join(vgui_dev, 'lib/win32_vc6/'))] + else: + libpath = os.path.abspath(os.path.join(vgui_dev, 'lib')) + if conf.env.DEST_OS == 'linux': + conf.env.LIB_VGUI = [':vgui.so'] + conf.env.LIBPATH_VGUI = [libpath] + elif conf.env.DEST_OS == 'darwin': + conf.env.LDFLAGS_VGUI = [os.path.join(libpath, 'vgui.dylib')] + else: + conf.fatal('vgui is not supported on this OS: ' + conf.env.DEST_OS) + conf.env.INCLUDES_VGUI = [os.path.abspath(os.path.join(vgui_dev, 'include'))] + + conf.env.HAVE_VGUI = 1 + conf.end_msg('yes: {0}, {1}, {2}'.format(conf.env.LIB_VGUI, conf.env.LIBPATH_VGUI, conf.env.INCLUDES_VGUI)) + + if conf.env.HAVE_VGUI and conf.options.VGUI_SANITY_CHECK: + try: + conf.check_cxx(fragment=VGUI_FRAGMENT, + msg = 'Checking for library VGUI sanity', + use = 'VGUI', + execute = False) + except conf.errors.ConfigurationError: + conf.fatal("Can't compile simple program. Check your path to vgui-dev repository.") + + return True diff --git a/waf b/waf index 919420c6..f93cde51 100755 --- a/waf +++ b/waf @@ -32,13 +32,13 @@ POSSIBILITY OF SUCH DAMAGE. import os, sys, inspect -VERSION="2.0.22" -REVISION="9848c8ac89183c48b69d47e767462720" -GIT="3f8bb163290eb8fbfc3b26d61dd04aa5a6a29d4a" +VERSION="2.0.25" +REVISION="9dbe1df4d0e92facbc1de0486ec78fed" +GIT="ee63711f9792665ffd31c3397ab0e770300b938d" INSTALL='' -C1='#=' -C2='#4' -C3='#/' +C1='#n' +C2='#Y' +C3='#X' cwd = os.getcwd() join = os.path.join @@ -171,5 +171,5 @@ if __name__ == '__main__': Scripting.waf_entry_point(cwd, VERSION, wafdir) #==> -#BZh91AY&SYqz?&_$e>V#/cgs`P#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/#/'zھ }Ug7Ч>וsF#/Vnګ}m;ni6-9m]Ц^W}{\#m\Ü֯6mNU`}w[馑黾>{y=oz8=(vkoJ=!v7P)EF#/҂Q:v}}f{ۨ u=z#/#/#/9lX]M1TE)Puv*⏦C@i R ʊ6٭ SU#/UQ;#=#/xg}b^.f#vq^M#/vyw*6{w#=Ʌ#4amKj BP)=6b܈#/=`$.ͼ+9 t_J}{#/#/#/#/#/#/;>[[QEh{S@#/ӧ@WU2nqZ5Zl0#/#/*΄JJ#/#=:vhl#/>7wyws#}#܀:Pv[7ηIG}ܥ@:>zEy֗|}t{ǽt{Ͻ}u>I{ma^i}{v]zw{6 w{xvO@4*WTF;Fٶîi%wnkKthaS]0yi|ve.ӷƀ;v=n=xDϧֻS{nwۻ{{|w+{={޾.ٻe}zwt{eZ{xfo_]sfGGlg-osoYKӪȋw<ϳcs>{>8}{GӪzTGzSww;|}ٶfufv-yvglhK<{^47g%Kwy'sׯέ}}k 黷v(*ѹkX;Sk+>wG*]V7voxdPZ6"X1IAn]oi{]i]}RG ͉l=z9۴0w*;U9#/*ze_w[^tmsiͨW;%m]ATvt#/#/gXJ}I.r몚ԠP>y,j#/T=N}n$@(+}}{ϽV8#/+l Gnmf{md]#4κ(zvg/SonAݰJ6P;WwUclϭWL^Au*wyʹEg#49vITIJlon#4,꜁{U#/ fU ]aӵ#/uqծϏݛ#/#/#/ZȠvݎDn;{*![L5Lm#4%|co>&Y6Ivu{ƮƂwsݻnJ%h#/=#/k#=[#/!+mBs#/;亴KEWC$#/r#/#4]#/Ԩ#/#/#/==#4P"m}@p۳O䦛|^<4Ѐ@@#/14hLL&4)ISz2SOPP=GJhA@@#@h)ҧ*x§Oz#4='@P#/4#/#/#/#/#/#/$"&@50#/M3*z5FLOO64h=M#/#/#/#/#/ D#/4OMM$)Hf5G=' =#/#/ #/#/d#/#A4Ѡ4&'ѦL?ВzITɣ@#/#/4hTj"#/4LJx4LA4icQڀ#/#/#/#/#/#/#/?dU'#=`9#=G U7?犧DHS:J"J@@ #=| 4QÏ6/h{"zN8)[ɛ+8|ojJUND].nStLATRO}#/Sƪz *YC@K1#= F0M7UxO4‚7=uu2T;MM\/tPD1% J7` Rl'c( d+B#=t"" #=C@BiYJq#/@]*" _ܶ?x#44T1#/ P RTT"Op^$&T+ BI. 9CGQxDKSCHSE2pU0&),DpO7#=5 WU}((#/Q(DRB#/RJ($1D1DQD1TEAELE1TD$4UI$E1DUDQTASQ,IEQMLDSTS5QESMPLEIBST14P#=Q4E3,E@5H#=PPST$RJ̱#/)3!EI$5Q%Q$ES00T-D#44S!PAI##=İPL4TATE#4DIUTTS1RL-#4#QDUUU AQ TPREKD TUAT4,T$D55S0RP4,PTTAM)TCCS5 EM#4% $Գ5U#44L5*A4$!@RA!I2RTDID%3PĤMTAR0ASMTPA)BI,)KPTCI5D44ST ¥UBDLQ!"(B,D@34DL@UE4D JLTICPQE-,Q$E)QR2IAIDI@SPT4RS$@LQLQTEPRTAUPTUT3SU)Q1I1Q@EU@DC2ELDQUUMLERHS UITD1CC0!M%#4LQC11  C!DAL1PT14E-#4U4T#4ME#4UA(RQCE1)QLEA-DITI-QQL#4DCMPDTQTDQ%$DIDEQPSDQQ1D-DADMAEEM0@TMTD4 EDAC1Q,0CKEE1TQ!$DTDIbJ&("(%(H("!")IbJX("#=iJ%H H!)X X*@*X* &I* a""**Ii*"*`*& (i iR"Z(d&")Y$$#=&*I(h%bfjbJe&))&f"ibZ()hJb((i"$)#=""H%)"("XZ#=#=Y&(J*"*& )i"*Z H "Iei#="#= "(&B*Jb""*"e()"BH* jJ&(*"`bjJ&*P(HQI`)&"h" *"b"*d(#="Xai)B`i"(#=%)"(afSb$UPd #/jV&a bY"J""&#=Yj"H b*("bB") #=h)*#=je"&("HH*"&&#=")i*j)(j`"& **Z"F& 40J10TMAS񳉨Vab&Rf* I(("I)$f"h (f$!!""hb)&f( ()(`#=hhHi %)"h &( $B"(#/$ jdb( aB*JB$ a `f**f"#=*RJB!"RHIH%>r(ii#=b*#=") ""h (R*bb$640LԕS5ULERE@D1QT4IUQ4U3TRM%3L̥#4H#4(55LDC4 EQSADI254S251IEḎU2TULM%T0ԴPCE15HDUE0AUL)1LRQ$T05DDMBEJPKQHDHQA4BQKE5UD43TM4 I1LC T%!4DQJЅ#= 4-S4BPRS4T%1$Q!)M,#4AUBJ !T!#/@PPITMBRRT)C0BK%!LPICP,I%L$ %Q0%D LT45MKIL,RQ0TBPMU!$M#AED0#IDP!@4-RQ#CADBBRPД%+CU0 U-U LIL4JU)3UAKE%%Dą1Q1MT QT%)4HЄE-#=(JHPMQDQEDLCT%R@24B!24LQ#/CL%T#3M-1$Q#/D, EBERE4EPUHLD@RQCADSDE- Q- @U!31,TLJ DPPDĔSDE#4,E$0!SADJUTL1DQ BUTLSR M%M%C3U0CQ4U5TČTQA$4EAESIT5-IDD1 IDTL413#ACDA1I4 3UPUTIC5@A,ED LTUU4QKK0DM#4TM4JQA5#4)QHD5%!-2IK#4+CTEDEALBPPPTHUIA3DIIC0@L$SQ#AC% E EM!R#/RȔE)0DTQA1MPTPRAU!PEA+Q#HIĴTQ,1)10DSPE5C2!$S@Q@D1RAUED% R5%#44#LԕEKLDK0#445HD#4UERU4-TAAALE% C QK E!JIMQ IU T!BP5LUTU$IDDЄ3%D1#/R1$ITATҔQM+5E#=!T0-,QE1%U DTEUM%2L0-!E 4/6hbBh !#=bDiHV"ZX#=#=B$`d)h#=( i "i(Hh(V $"&f*(J@#=H$&Rh*HBj(!Jb!#=#=X a)J"iR )i@((ZB "%i$"h&X`JB"Qe*$( #=I(Z#=BHh h(RH#=Dd#=X$Bh(*(#="bj I*(#=i)b@b" Y*(#/*j $VhTjj((#=hh()i$!)Z#=P&"iV)F $X!Phi"`)*()h("bb BPJ#/O #=J +!bC>?tZUW+?WIms1gdM~M5 T~`SL P~4u (\ۨFz 6j#=~ĭ2R꭬m `r?nk#=mrhM8ԍr0?ھc zBm 0ff?U PbП !ɝS,#=I6]zT](/' Iy75wOX+C#4r<*Pth֦})2= n!V@?Q(~](z.T,Nu넾ߟn׍U֬0:rڻbg :w6b i`G=ȧe1rh8*4l&Ac2VFUŝ\jZ}P2oITнŘBR(T‰Z72%[G(g$ݧA8Ct,ͽny]P |t'Չ#=̴MO&|<Ȑ|߾;4p$嘕4γ";o) &*d >9ĈHjaK[vIlIO'+yD})$l*Xq$&CtKKEBǩ{*BQ-&0TGN#/@aMp!pXP:UP(gڷfk̰F{ǿ0 )2 l^ը^X$єY k\D#=9V"&ý69_]xZѾΛp!khi#=/aI<)AO}SCz0=PPL,̢M i)^=3臵:͚x9tiʿL bJ'&Z#=5r8k#40b>z2}X[xw^t#/S"v偺PZ4 =#4XfqRZi7fFHDr#=)t:lHCˎeGWK8@μ$W>ʱ e;vUiFk[]iGfLYd>JR #/z;Q!h^"4#4:h(J2+9ELE\}Lۜ}^ifi,TP2kSuy} xT;9%^ gѣfՒgdgQRn]mjJvp &WԆ>#4V|*ooy(뻽e?,SrK?eP#4h\sUeAs?v(|CgeVYl(@TuK:tŇ B"{%gk'->#=iB C8juAS #4ērQHNS^9#4\ #c#4F֚;L@#&Ŗ{n>>˗-grz뚅SLM&ҡǾluQ8xI%ww?Ǐpd3T%(2]R uJ^l>~K&YE S$G[Z#=Ei)$gϝG#/vp}t{vO^vb"BQN.c Sծ&+ )'>]pXrL6,d#=r҃ &!Z'蹖A7ZIE/n ۳Mq$ۣ}P+kY#4CSnFU#fED>(~6#?+a,R'Ftj멘;!6F$ARL )(Kb$#yK7m(f, HL2= JsQɅg%R޵M&D W{qtWX(57$N+("|ز"0"B\l4+12f.N|<GkK8>€iaS"QC%];ֿ~rh?#4 y&8qPkE#=ͮW`F9m8฼S@TG4VsR YpxlWPA/F@1J=KB(4`vgY Y`wژa[JVOպ d.n+N.ˇ4:kЏ8啀S6b]m_?6b#/DͣI(SQ1 Dr ;Zv(#CMg$fz@l#/x\4iDu:)P^Q4zգd>]I9k7_&0`+@ф2( #=Wuc͛;!2`xr/冺#Eba#4#=<d`NBd\u Ȫ#_uBjS3(#¥꣝T"oUӟ0qX$3@r`Dd?1#=I#cy.n="&ص|˯ku#=!󍻱㝬^SD$6_Բ#=HϥOc#4_q(}/9`}g%xa5!1m?֜z…I'QIzI8hOYxV>缼3O)HXwfJ&}ZXU6u#ְme5gaUGb'!ӥ׊StS;7ɐ(T-;/v/ AQT) o4N#ʷ[`x_3$E2bCpcsV+ytj DPz>ԩgж8?x_~9̜ȟ'b5317zF7aʬk?U'ZюG p9]+MܐJYYАT*|^ܱe^KcN#44,IP #=pJ(+H=9H$ڔa7P!4*k&dLr][ϞCc ` @B#42B?!7wl0],NmBkspsxfn3 ^\$H2}8J(ZN#96$:4IG29$޿tuoYW)j!t,LJr&֯AbKRJ3BhF#/N?}9P`q1)ʥ^{H4%!a,#rGzkb?LpB,bd²ᦨL>T7q0#=_#/q[YP@ `7g+nu.y^6@JUYq5Zx!XԫnwqSZJdE$2ތ<{ITinbм](tϖa4"QT8&p#=iTRc9D,J.x䡭ղA#4d Ѓ|+#4TYP=4}1դoMFZ׸#42!(+f =ˡAW0ݰ˭3]lGl{u ”|jT{㉫cTQ0ao>C~+:{Đx6VjfBAoN27 j4|׻+,{QʏJl3#=T\ʪR5 1d(MYQuquH1~#/Sh1Tfvw硳 lޖ>ul`JYs!&L]0捛nKU>ծV!CGBo>{Cu25!`/G) "(W-L#4KJl뿧!SM1X#J_8>}"ZT<>Ŝݖ~j5q@4\?y_wwA6i%>BϏSɐ^Td/Q7k"l9_N2/(LYKs|.g iKըlqu?R[Bÿ#=V^~np~#=Jp(0_loĝ9~:cconR& #/ 'uL#=j2 }JWZ)09O}\i>0'#pf9i_#=VfK<CCjR)HƒAJy<S$b$  Hb>i3PUvfĂ.\>C;#=U~QB +.u/^L݊B. d7Cvh!#=k+(Gwt-#=,#>MJPdb1heU"ف jk`dX])x EX4L~ldF:37u#=4_Gߟ/} k_>#4Z2;P6I{Noŷۄ#/^FDA]R*7=1C$/bp#=VЇ-5<'SB4'%;@@ۆ'NRC{OC-q%쯪Eg؈rcE#=JZp`"矏M"f" | %"'fC-RUE>Bc#/;Kؾ(oګniolW+hk.(]"bfkwx&^IS9'щ)^FW(Ż%74<7eൈkn#=a&fw84tU)O:(O #=d#=U|J/;#/q@cnb촂=Xşh@{a2$s0c0@Os;lx8$/kzڪ3z-0 2e"{B oLHf.|Tq[A}U6uX)bntoLG}wn#4G]%hV>EJgpΩ9`6[1[f4u׷M눰)mORLl j"c` y\]LHAVI^(T#uS-얀+#4с׺{5)E\hTPm3Q~^5?&}~rdHƱ!#/YT3-L'^=NfL7#4:ꕩEFmՇ0Hd#=t⑐W$ٕ</ .*.x|Ò`_p#=HvWS%Aձ7^9R8Ւ8#=:PEEt.ջlW St;qA[8SF#,|ܬi|&(EmLj_3s8V2531sB#4F-a°,61W |?kQ>&/ˈ}deȦA{w3Я`9LvOx{)ӻl}c21qR.ߎX$?p)R-rcqjfoiktUf'J"-릘KPYJ;*5q n_ڟ\W'>f^sfrb(}f2q4#X,Fs*#4m1Hbo!3dF6J`=$J]3n6V#T$d-э3fyMK3/_.q+lGqѽƃ3qU`]Y;T$1yz|3egAJܞWBwfI)2:}A~)YK%rn/A.J}<._ط61Uo,VZ-aͲt~yۿ[DAQB!E.EM"|=P$qUdRz-2k~qq+8b#-"j"*Tn. K3#4+]SJ2;eh0u$0+(w<*icNʘ*eڿb *æNK(=!qi-~/[;kf6CTX U.$|n'D <Zɮ###Q9l5#4v>(g)SJ5A6szWMP @( :&bT/}eHڬ귘/- 2${2%AG_vYGuJCJ9iTVS%xɒ/I;vHq>,LJpZD(gw@zunσ{!n$5(Qr oݼBbPo)o#drkNT>78@4K8`@Iө~krsi א3£ ^+,.ml#4#4m<'g\LY"ZP'6- _Vpg_\,yL{ڝDq02`p\8@^R1a{.9snf#Qx@ 9+5RO;\7?ON=jֵB¼<#4_/|<BgZMBm-ogxx6ÍiݫqرZ=ukKWNVamr>ڴ@(]t3P#=Ixv&^Sk9OO|Kp˃ƶyO{tL\ܢ]Nа#4P`wyKŘ-#4_dG.܅^⣏rE—%&MRFlɛn.pQ\:ȜEp7awYBx#/iIo?kF쳣\7-+vFraj/_®+؅pD.$_08plYo]j&M#=Al]y/{,2NѽT C(#KވUWB_ħ!6jJoEZ{|!ߒ Nmo#5 Q3#=3- #=+lMdD0`rZF!>6rIo4Cr;N!uCvw99~s7Y _ŤnִHg!n!z\\?qm+y,Fbz*`Q9M椺_WP^MA#/I;{e%` '[k2mdP;V`] Q †j>7X[ry}ʐ?Utu"=F`ez#;t_ŧ?Q^ޭ+SCH!UXGs躎!gv8 $>o.˰Q^{H}#=Xخ ݓ۱t*d ;w%]ix_veH%q3Cs8i#4~TjuզC_rSAo,]ABKYL^(U};×3&/#4I2ڠ{:ܾ5^jsW-swFFWtT(໏/#=b!. Pbj#=R(o[`6KcAE^Y> "zv-ӲѼ 7#/&ί2r*Hp.Q#|"9(P[#4EgP#/؀ S@w2!>NiHgY1*ͼ >?w]s߃[e7d%FE~ۭ/' eNMc~I?ۇ)@g #U@H}C% 86'bS+u#=55JIk^B喋f.ՃM6@|xTv}O ^yS\b(\B `n,Tdʨ#j1ݺûF&2ab:u*GHV #=#4I Hz*:K#/HHqs*&vn3Q~/&[umÁݫ!2:vJGvf!dؒpd(JWT2ERJUg秹3Lf<.#/|0Ơ|V $!J#4芟I}KR\[r ƃ-&bFQLzjTh:k& LIމBD5IL~,@"+CL@;Gͼ_ԧ%JfosFP5ڛet[6N0AEh%i#4/k^]}LJ;Csyzat,I~dg}1u9#/6#=AO?: /ogP^*W#/7FPp9@vyeQY=>Ӭ Ӱw|@!^ z/9{'hñKfƠzqiT\^8)+ѻJsb]Ntqͨyd=~hPy[U)#4ws-i=w9E[m8za C_KJ&-lcu;c3]4eʜܖjM6t7aX{W>FO#4Ӂֲ495+d[{k(IQd_7xLV9$TmGU35EJ Y @?v]|d}4u"@:$0}.όj<aENs@#ъӻovrWa7>$=wD3h#4#ITR4 BGm~Xu>wz#=4;.Hk1+P0vCI"hJA BBn\;v#XjsxAÁ\''<#/{ו-H{#=Eb*#*e:NGG7nYσJ#4N.v];YbXe A;TKIEE$]WV#=tIUm[*]4)vn3^t W3;|8E\#T`3 gt3D71a)`q\a( `,lו)7H `tʥ7urh)ǎͳ @5n|}7 :K4&lSHnk7,`CFKqE.jT[!BG8B@g#/q>[4E)^ LKfwh#Ga1fRC<`:L&} B6T&(cY/R4EQڣE#߬<{H eHHI>yxU@60h7~k8;X sՋGO*gHZƗlGچG ބ_C"Q#4xj(Y*#3&i.~a.G#49(efbCv=tBOGgzcוcf`TVN3قDl`t|abljCfC&#dY&oML X(ȌKI˚~rf)<ϮUXBH3Ы47I=y-ZHiRьX,gbXXL9.+o4R= J )79^E9cŭ FgHF&kEdf(g!dR0tum%;#cpP\Ii]p"*or#4C]`XAm!V"#=QP+XN4f#=oG#4D#I^&$盏,y1sɁ"ŗ J^Ro#4Thจ\ (-MC{a#+SSp\r*k*G/,BJ#4pҀi3mT6d薐81MF3D%A#4жt.KIIp#=S 6@u*#4xh &Pr1:pbňсX i>a(:vCh4 ;|EA#jj=٢O'#4ClCͺ(4Gډɨ əU?}jHs} bOo٬Ę|R&#/C17%/C.C~h$gb lBGd|5/}s$Ӕ1 ޽zBѥC@^-ÔR#/t&/Qj|)î_c#=AwscK[tV q^elER#/O$Jd#4'.~Lc\| g`?ƙχ #=$[y>ٿ\䝺i\s:֡ZsdǠEһZpB41D|Pv5h\9m*  INu~ϭE~rd40C32>U{'J+#=#OQHPo8*}տL{>y}ܢ+V[)ߋ0k##/H}䤖c:Ըi_/VL}Oun4YqQɫ wz]M~ HI#p5Nxv#&#^qzEyF#4pj#/Gvi _j<є'ǘ{J#4: :N[hx+!#/N &l2QYy X!;bj.ߣ0#UKM 7#4%pƚ-PjLc?b=eezܠ![s D -\""u( P8rŖ!B|>cbE׮jf68Z*)#=\׻!vĖ0P;!% tUC}FjV"f@KA{2I.\/KDFT_!U7éOY&abCMQ'k'b|axT3@[uDP#4_rO,#/5N_il3A[4rR1YBEbz< 媠rvmU n,sł$:ں;YC.0rĘ4QCͩJB]162He#b4J M#=y`t)PqA#42mT( NPBvOȤD{0jo[ޏ=tĎ4~7[#=]yeDTމyQoZ -WLvsы,Ӭ#< 'n:1MTLoTkV &4K D `$AH#4O/*N+drHt2[͝"PysMO tH|5zͯc 4 Sc{g͢=`8pJXBbT@QqL­NmOk1$EoTbSa9qu##='8dfMbqT߳ܿØ1]忛g[}GS`IIBA#/o[-$hsgK/HN(A#=e}K.{ γ֙$̓ELg>yRQC5?U_CHW@$C5:n7ê¢go1ַ˔jؕ'x,17nݘT@ܔյhVLI '.m뉬$i\us̓5=]Jʢz87DPܲA~vL 5MH#4{}\ÕG5[A(<5ѳNU%C<#raE8 0Į^]zz1'mZQ죖[ē_[~λ>,@>#=#wRKSE,f]&;~?-ʥ)~K7>_ 4b A5e|ON~ nVBQ#4]\K`ϣX!_u ]0L?qwW7-1t1^8#4^xx%)҃mc4) 'O.!vꚵ[g wL#=fq#=ӁZ6+j^Fox9G"Н5?#=?1˞3n.#/Fb󿉐 =jӰ`0J0YXbg8*<QIE.Q̰$ ~Q]nשd ]n=p 4g3v:9W3/1vdk:#= }-9̩;KAA7'iyȈ[gIDPE#4[۸Nt8}MG {-AL焲A^E4/u[s!)?8#=8qj-ՄҺGe"=C#45nxhg"BE#/&0W {vF R[q#/49'uI*}M6jQS`9yD3.a1ak,U`a{}ue٬6;jqG*6#ˌP(y`D{eu8!D &Y`K1>@#BUwCӰXysܐOT^Zn) ka|(-SHmZDݦ,Ab)I P2D8@oe:9<(#Aʣvr;w2YM2F [kKtP/@Lc)CZO7@qmM-鐛Y,)Q* 1bYFQ%/-LZO1ϵ:}o z;{Y4!vJ lbeMpd7#_ ŌۙaEٕvS-ᱍqgQfu1l@lB#4()bƹud)Bצ09k#c@(_Jk_gYlKVs {ㄧ#4tS;OTF@#=Ċ模t^圄fv4lӘJ2ن ]NBD<>/xv/" /Z!#so0ë#/Ժ&%M]\#/2PD$1#=~!tgjsxRw8 =NmH-uq&h Гq`G@[5A@ٲj-hH\ē$SG%:đmѹ#7 Ձ %F2C \B2t_.e#/I&^vf!ȏ-}E=aQYԊgڕbg$^k!JsUkbv9 O$tL8aP4l<2`.H.7b2ߢuP[6[s:j+R@ra 6m¸Qg=Dz 7Tyw՚];[2%&^x4o?#/S!etQ^VDc̗o᧯|lzWg ZD͆#/'PndFn g[Zl^@8\1 g"cQ[qAR€r8 h2/p?G`qτeP( tj徬eŽ.{r"zAx|ǛWʹ`d: (/ҹVpX_M2?C.gM\^on':?tG#4QJ({"ve;DcUFUq\1a&Ϟyj"%$/[>fa2ha#/ puqˊ"3FGvD@rzLZ}ue@dj"XH@ WT MOPTF/Or'S`6ʒdn^s*]tߨÄFA@uooӃAHj>O/vxE~_>aGp;Q'bx!#maŸsJNH A۾a0%22@n?x6ɅESZ}=?8G4\:گ^ݷvQOЛjzg2,h6옖m3#4𓀼Kn׍ҿ.A=#"JԽO٘Y5K .;t#49ixCG(~Q~cHl}^$;C U:"vY/{zSRDj<;tC%bHv&#,ʼn)+f(n_`eGzv^ @#/^,7XTϷ3t2deZ(*BE]_#/İ^fDPz-OA#/U69FDIItu]#/#GBb#4Y2AAB$q_N}rQvW)0Ϊ56 Š/ p1`rᗟݗq1(g$-_!~E+m_'}6cJ0#=B#/';}g~_ֵߥfo:߻WPWj;F4 "D~ 𑱙,ǫT)*k3eRmJFq܂*RsF[RG T4#/!ON]qkuAL *0GdE(h}P|k㜁m/vyu.tۯ!ӭBgȚ#,J(ha wΌX;ɳ0k?TXvEssbe#49ꠌ!Ԁp>3mMQ QMw\_'5%̞_#/M< )<!c 4D,\-%p%)O/H"K|%F#˰᧗?6q1@'ti!6##B{A3P@D8a^*{sM-aIGlHH//,_#zCO/gꗰـ:L)i.R'uߧ+3w(QOMT%]F 79fQC-t٢j\Gtbff)Bl-VUbQ%#4[Wyzت{7J`OzzX433!=vD&#J/mǐ~qOs)`mOvLDnu票Ε\sβY1kzPU3bUV]YºhJG ^|>c8!J:qÙ1ͺh#=٩©g%42F,.َ(Xs8pH8\e#4y.D8&5+z) /^μZfψ}j+7a`FJ,`#46$SYPyTh%qa@IjzA]Z0Mw{TkK@24+^GAQr#/3cI kxX)<&؇.+_XdT)nlJ$3bo&R6RYWWuGKvn(sn,5j}_u#4;<&1iGRfW-yz cmخ]#/#~lH#4z|~a j>D{%h|m[%ZB!D5H-a6l9p(M|:$A};㽬10DS>U#/o@ x+!= #4'h &040!as)ŭM(CL3#4KIɖ2Ґ8p+JGD62_tXN&rNx7{2>8$'e?#:~;P6c3Ҩ]ҿrL+6fLF[)g^"87I~\I3m I&3c&0\G/V1}[>;j(WH^&GRסg'R|R)U #L35XBB`gz[ G\1Fo31T48YͿu_}ѐ3ulL#6nLB @__?Ʒ}; 8#4KpHsiA>o$7qz>=fKFc!9AC O~~geԺ,c: =,(X۾W26o+oY6s )dƆ#C֜,%aL$$c֙kU`,ҦZ.J1I$$sE/Oȣs˶V٫&$Na|> QF9h >X~^Y3=?F{@0#4oP6ni5)jf|:(!-50n ="x_dɟo^ߖ0J&CTG!5V@;#&fMI#/G#=~!c]D,R%}x ]gbncZ@Ǯ罘iGWg0f8|Z4dkB=_c x$o<_p/>;CsW'ܦ_L5T4EB*#=%SueS7T,\3wnti}\ǢA.g3,,g#4xZ0H6.Q.7.1& 7\(^:%1Qv#=f}; i#4)XwŐ*E/)d!,ju18™orSRDr];NMdΕw*Q$9j@8<ȓ"\~A#{*}z-۟AK(l% |b"I /w'8U^6E\N|R胃q?L%SC\4_#4_xo ̳r>H8w0j72E9C(,fyyṊJWtpzE;on"\ %/Y0z >'`ۇ1T"8A#4c+S (0ZA-2Lu&I#4v;"!S+ܮi3T>mW,0N!hAoTD.ȞPs3#/r5~q 0Rf#4aM挚+ÚlY+CǤ8K巍qB-U@W|$ӝ#=ZĠvjTj<|j<ˁ$?w&A/QΩ4]I#4EKmWrM(D#/o*/e^e@:<'Jm͑K"XFֱZK:#=bq1QHô`cc,#4̎siWa|֋1e:lCкbra8vL?I$ k矇;l1'/b_?iꌊFw<ãx=>`=Id9gFwXfsa3"#/~r" 5S'iVMhܴnyϤh\_xI.-D*#4X d[PzE=TK@RA#L캓xC:{uצY#*;R7HavHn̥kXHV#4~ݳ c01U  Qb@#=v;Kv̩~G}PgUV[z*] wW}`l+RʷT(CP>1U{f+¦BYpjv N/AI7DF42@}ͬ;iҍO-e'wo]g#=(YgT ̄#=ysX`Uw{9 v=8hk ݥ̰mmgP@&ѓ`tb:ft&BXAc*} ^]xF9#4J'9bܕE *.6ħϽ 7U;(U |u%5I#=>|-Ƹ vesJjr>!CR#4Yk]b-|[٠q >OsZ~O lw|"1}1aqmBDyq~ú>Ry?` >UqwRtRW[,}s6_#4J\%PP{|5*Ŋx;7`Y#4)t/EwQ)7VF$̖I0V&n91w0(U8F.:8;M: 9^Ngj+tը37gBf_EļVL$;EaX:ׁ>˗ a\8+vƦjAJu'si$*J8DJK esS#=LN\0nBM[x3CNvϜ [6A)g#4= R놙ba%Т DŽ]@=FyMپ1~i;׭>_=怡0U @ِRm'(鷄~9SGnw]BkGY# pmAHZҶĸjbT5 EXG#4b܌+CL5֨[9Q(&4Z9®[`10z#@FfpJqA9-8~=#4Gw ~z.S @:#= eZ`l ol#4x.-a>6ݽUrb], 4,=Y:9>5BfߚJXnZtQ ʐPITwF98;ޔgX UsZ,"5Z^#P#4 (Z=idqr4ݮz96t#ƒV\5̅ɟXQ;}-zrp ǥaL{g|\zE2*xZH$_ǡU"d!Hb=H';} U -t^k#4~W>뺏LROrcd?~?V졡$i|^t/#/(5 [*O6X)ٍd4"2mGCc,B?#ntD9e}cnkiU/hiz=rKp|gdN|e(#/"zdY=*B"@T eV(YE̻^.- )#4-⻖c!;/URe,C?neKdUOzg0AVV'dO`TNڵUEF"=OxH$o7aqʸFN#4~o= #4pCq.]p@VyB\$ȠAL;&@wq72x_8)`Y8A"S9 4.{?4/`sy ?Q6htpPP9+[~) .~BxשʥhYYoUuO ժɭ9~+ι%,/T#'dsaH#45S%#=;ib/AEWSjR" yQ026t3A߈3.Ͻ/d (X\;>9tÆQr9=B÷kB(v,_d^p9"|?[z"$f /?s/B뚵fG3o\~%?i|?(CՎ+ДLr4hmulD#4aL^?5 Q #=A`As,4/Z`t4s,AEEjۼsa.Y4Zcd BPZU;i=ݽmjC^>^w!Tl8#4tdeDVBAȥ[R#l||䐟D| ZS.*}f1>dN4/Wy3$UC_~8AhUYg8+YrW#4+-%9q=æb>Nv}M69B62y +-[k@\0mT& DktI#/Rf+r tFE)#nH*ҜwO, eh,e`%fp*K#=t>#/]^+*.񡲘rr4GP9/7t̃ލ;fdܕ>#(\>GSOlΰ]ڱ bQ須olueBWΰ ۛ~c*nl,dTNV4jٓ9f"gץ.AoQƐ~wr@vk爮#49tFLkm؈n13 2 Hvo>Uy|HPocxgq}7@#4H Qo#CGiWћ޻NA},:\!]\0$ԭVq0Q90G`p1}j otoԷbmM\+ni@qn+]~U^pc"¦!MsTo+wtLq[f{#n:xkKoaɏo]Ǹ;0`_fx=p1m}<#=ͮ=#T\f#=\8X8N+۸?t5^*#4) rlr 0ejh7 ModS,t(^nX[|>Y -`^z2/_|QH+CMؗvu bL*J<"z.DJЈX ܺ+#4qٓdb1PK3*0j9>_a74߅ar01/]8rC"ZUҒ61' b9Gi ^&p;1DZ3|PRɪt~w5 aNȅ تl퇏W玭faQSd1",IC6)Bhz>=>pprUaA#=M A/JxlO`'#<7&y;TI,l9tXDj߂; OIKA)a yhLQ꾜|z/Nq&.eRdH_dB{b8 ,g^Lq$9#4\iӸ%6:-Z^<J-'eqv_t:8f}'2wB3F)XkO#=BqۜvAǎy_GU+l#4-U-wVRc`PpȨc@_0!ԐXDS,XFC' 7ÚY51*qȆ n?18%Fvl5 ߘ彅~G|y0Q-9ߜ. DE{: sUF㲱7nd1;[xf#41e2Cd^`oTU L%9|p,=wNH ̞^l<1Ӷe.8#/*#/rɰxZ?y&B8 8VnkvB4L &ɓb_\}fKzț'{#=[N+;c$H`Q%fB!΄"#/mYx#4f+.)Nwa)(lH'd^2>(sUAP,S7#=a-{AHҊY$,\;1;^UI+OIv0xc#4W]rx1h%0ϧN@0TUkͧbbeh8'~׈&L y*X\eMDS@pß7~EϘ`lG9<%)񖆂 <9w8g~p)3?2x* NeW,(U\R̔3Nh=0%Vp6Y./!JD^ih^DTƍj)k^e]U.>O{oˉ/ 3A蟝{|:t#=U WBdWrcŠ4F Z;)]GF`79"\&3ڝW9ѣZİ_le=`m)Ib+#/$M#]#=}U砾!.1?q/3:Z\IeU]a"@!HA"\zРFqh6'/~f3 .)iT>]?T#/Ԅ#=g V7ܸE&6,oR $DFx-8iC;ꌃ7H4!SxMqT½y|X0`aTc8n[9bQp2fqQnyj)8͕33_{ǜq 627HidGK(9PNJ1nA!OSL…M%%-7 ,Sy39< Dus7HQXb~LU^Oz0:p$]E-p0cbEUT^6  Xh ,+>xy6<#11u)\o^WXiKAq]Û~ձ,-:dE RJDeiD₍kq hsKC?`FQ&mt0饆[BaB4H5xS¶EÇ>J3uߝPi~!EA::'AvJ5Kz1.58|o0Q::SeQtقɡţWmת钩fUD#=81'!3Q%a}V. Paa(!ݽ z1>:I!#/:ӴҟZeDoӟc.M6Hm[뤹Z(#/̗wu0(7R3;e0WI,OM%0U{zcsRWcvY,.DqjϓtHV"%0mBl20퀷hnUS(mXa"u`6ȑ䨨U>/vFm#=Խ:72#4œ,eP]q `0AW5fq@`;:{$X A_ҧj?\<2Gn`#4<yF@MYJLGAA,Qre]d19w8EHSA=~G!$9JE U Ք"Y\AT`!;K͠wϱOi pQ 33>~fVn.m wo"< rh?1#;Jԃ}y)mwTk^[ *4|]Tu.,"Ra_QIRH,mzmrJGԵt&6]p粍B%0SDTR_Sխ0كɃF/wb<\EfC#=n*FU$  *;[f+zuuqь>yB[fSW.lD#4rI-]hl4l&C.v_#/ #/v7a'ta@\Mqb>?Qxuzf\z(>0|xp%T(s2h*z0c߮`fv"}gㇶv>֟_ - ˿iCJhI>o; 8o[7ñZ+V/'؇Mm_qB[~fq&+#=U_&eʇ+R>}xWڄ,"#o'ի BԿxuU[<X1&o–'#4lf2H mUkx\2U4vY״C1ʤqInU?S#4+0=:vY)quZ֧8z ͹x q9ܾ[4Ŷ66G5q#4S`j\!`\S%.Rm#'gby8`AǓ]F!%uP"F5<`e?rd",w iq}Ovz3zҺq$7k^]\=s 湇N:S`hHs.6"/,ڳYⴣgefJ9#O#4zwHZ=s:þB}O M$ָܹ,k>ɮ#=k֔=z}xO7:Nzw-֍UVUpP{s}T;V >0*m#AU}*Z\gVƗ9Zuie/6Dv@3#=v%{,*q/k3fM(Ԃ\^4|uze=f_>7ni6-NW9Nw*e(y"-@R[I4,g#4F>un?EyvgGe.AXr ة#Hw>(g@(th#2k?_&Jl_1.: L)/v3w՚%KSXn-+D|ZY1RhgogQ>vO#\Q-ׁVi#=9 ^8ݐ!꛴& ZOBe)<J(UcO\+_s̚6I:꿆UwҿqNcqCOPxeǽĩfV2p a)V{œM.\Lv)R/ʟ׊{|(N̨׮1|%9-G.ZX}%NTŕصr&x00Cgho#=y׀n\_)2uLG^XWX4'_ܭ]Pq! =E- X>/q.^*? gf%IB#/r#/$\>r86S~[}Wx˘ñhKF'XlDs3nps()N""9E{Db6s6h&A(B$!!Eq#/m2a|Y@ރqEJ0ʹ!-F&b-+_2m/5=#/\:)yݦ&lsy^o]&RDlq bU:d9ĝN\5^~:P܉ͫ *\,1g>|pԽc-)r0A#/`U㜉KoWzKqꕝ,鱌m9[1xF=r璩yxq؊b9^/ђm^q*PC9$Ǣ̀aw#=8iH||.7J \X̠pH1")K9hG#=L૗JinQr5„X" TYS#4ᴌ韟U#4)g>1kh}F$DȮ:tzryiPb2аfJ#C዗nOiH3\[aj+,%׋h)f͋|J\Yr+ Z =}N"ãzp9#=Db1eZ O%8cICciz9Qڃ#4tC#4U,Dg{LF]bORЈ$cY%x^ޞX (t 0epIcue3Xd#=Y(BS,XY/ C9*2K$[r刢 D~'QB 4-N4l|%׿j&KqƖSik-x "k#ZL.(^PtuvPv9 #4.aO~Q|TDnz%%}3Kp Hd`g B\%ed<'t|~}շ<SWh<74wDAG!.Q"NLmI$NļA:䓟xoml^|P֙phb7g=j]8$H(d#/mC5Og#4iǻ5X[i8uQâ`a W!\ )cVn e-P Exn >K1;>RD6sPJhOIVa|QQBxwcY/;Zrxc8e]iY[zKUypnw\U}a=>g#4Y^x^XcIWGɿ}s:c9!wE}{pe~/k|N}ϩ7.(jypLz\:])8{<;MLǐn9WfDw+L#ߪ^PU$XU3l=cygM3'÷5n'.@?`#=/lQ]TC.3uq?ͩV!3dK;g/KJp $Qw`48-p2=<#:]]z)pu=Ӎ8a'xDANRʬWOg@#45 JH,hb^B&%")M. JWBd7={&C}j0XKzi#4`P@Z*"iOl$#/&%C5B \Aff}2)&^xC!jYvg BdLz7K~+.]iD]Hގ-!](û8~r{x ABPPOlؗ|'R~CJ_㮶!<{O|(*`jungo8(q:a#/@ ?`9ǖ7Uڮǩ[ن'QDkru[{Om'$)@0SJo{%=2&Ю-Р$SHx"yB}1[@F#=iAR Á$ED lB7K!~vij"qyx}#4nc# ;}c8]:~}Oo sRR?\#/w?8ӏE)+.s_$>Q2ۣo<0[e/E9 &Hm#Τ/ՀT%ہkU H ;˧}z~0#/P֗)"O#4(!9~O&Aށ4?J5#=hS5Cܦ$:~ ^w#=w}B])E<;<.y.^ccjݔt6s9d@ȵh4 m5Qqwz1 H@4,KDj놕iVDuk@D*%[KY#4#4G!:/gT@FO*K>N?166/.qV%-g#sh|chmn#4!+2#4, -c7;GKpE׫u\Ei0)5kTawWVl`ޤ9n vd[9j\8n(FQ3MBcE4QV}Dr}lR};-^ B!JOnd%?Ɨ(PPpEHUNݹr+`k;l%ZE;j(}k@Occ( uB#oHweR;>`(E@"}xXB%"J"hR8A#=?qjI񀤖z#=iv,g:ryQ8Wb h,64wi{T48ðD)TOh0$1ݴ:M7ql#=1__s),cwc.0mE6M_2)TH QRx@ЅCgb23 %>GvyW#=mD[0Q iؤg*ck{GV+D.?ڝѓJ?#C&8y S un^I6,pTJ峉6|7X30}|PC;Q3ECJfb|؆8#4gCێy,"C:W#='$K0~~ J T~~t|P?*0QܚoX@QQֈQvPW † )_562*LT,:#==4Q!2(Pd CʐF# Cz4k|oإK`׍?ŢN:vC<ݚTFǛsw;29Ȫߖu<چ2?S椺pUDO.dAJ]oNk 4}qsF{U|0ّ]έi׃P:kfϷ#/B1&ؿ{t1F1#=BnaHYK _~Hj,ûY˒ԄMJypP$`#/]tz;-7߻QPsu%Q?/#{UO\(.1g"R>CN_3YKV@O?Ԣ_"hmNj}Q(IuJ}brI~Iэ|.#=yh2;׋fFOL&;?7n /ɛ)ڽ|q6)Q+]NE(IZ+@u\=A(#="swyG[$qdPC1dX4G՗#/Rc$Fѿ䞢#45Ӟp^#4<ќ=/=~a/{]t4xzߨuwhk0.> wOV%1| 3zNj1&<.:fV"yB#=` y>zv9~S?ϿW^uo.bL/ҙNeRy3{zj=1ݜ":kS9w{/v==A@$Fbࢉa`T#4s!hb&"%my'ψ|7mFݍ#/_v+ E^d2'D8buMrj#YĂ#4@ O<>'%O^_'#4F[L;>Uz>j#/gN_5^no{E80_]Pt5~Glݤp5z>~9މm^JOg!E6⣳[:{S+q#=s~#xS~ou{>.߈6j.`xE??>K[0aݳ/Y3j>DQJ#՗˖;N;Ƕ6#߲L=՝>:}BO7柤CߧcN ]C )/ rͳKw&&)/aXN|n<}7/Ҙu0:DzSRɦ~v7cGV'mܴ?%uK#4B0./hn,>z9yXW׺1Ϧ럲]Mn;~Ł{k~yF^^}CD͆-KGt?oŷ^[o˿e^N:Qau.ݧOn^+om4,YTF%,]x`fYVj~}f$6}##4VKE 22`|\x 4o\=V)3zak5q&ӗah^M0>^o?,~立N[6l(=?%G_Og~hl []Z}K} >!'yύˇݴ~/c#8q=%֨>C/6!K9"]Oͻ۾B]pFwi ?:OQ,TRG>-r9qM^#=Knw>Ds;Qy83y>|xṹ2/|Oy~eWOOg|ҹ9݌qxTMGڋP$;#=vϹ_p#4>o湶̻aL>zrJ|?K9ՄJm,!1/O~Mw((SC#=@23mP_>ccO~^빛J-ͅe{bɳ4O.m&̵x>|QjL y)*#4NrR #/bf LWig~|&(?/~Yt]86-rv4~7m~sHaO#uuf{4ю||KvG{߈FT[w~"޽@[_fZw=Kz>acM#=وԪ>Uq?cKX|Y'ktm׫1/qseq{gGO~#=7|ãh/#Go7GgޗӠ7@#/GWʠB<@ss#/#PHr N.D%:[iNN7et7A/hˣ$z:FyG~G$^>(GTaww>P.~m%=qsSQ&gQTbS۞YVX|w䡘d,"hH'ce]#/#=D̏wBk#=<:SCU9>mܚç Xom˲98R&; 8TA DupM.~ 3E- "1w /m}[l>>< } V]z_0 #=xEۦuQ$864kB. -Egx=iD:퐛#=aK%D虣MA7-`z%&>oXnLcgV:RC{)vBDqzפɿ-y#4q*8W_1l6r#47#4{!MNPԜ mtLt|ڨ`jpb7tA(B`SqTmFZ'WŨ ,ܢ)1ڳ9w`aI$7>k}k#t"a;9k,pr3!G.@isRcC{#/8tX5xg!se>ϾáзAftUwAR~#=1lM4c6k^-Ň?;|TkWݱO8}2.d)K锆6 Q#4* ֗tuE$;eǮ>oH9NYEݸ9?/=|tӱ%[*o9:9A puPt[Y>L{Q?J5.ͬ9%#4U&'Q6r'7Vq mS#]>~2'XU뫪L26FؚmR2I9#=2?I7(VCIX9ˁt6yyr֔AQ$M*IAcNT ӭ<dh$8p#FHnY("ӧ j剒QP܊i0f1G$KvJ1R=g~=(8#/ӈRөzڹg6eOfw"< %#= (1)*//7Orc`I$% I$@^Gh66󁦏$b 1]߆ƞ ϭfֿ_pgyzyk`7鞰V]>K_5}6w5yͯ_?n<$'x?([~lXr6[>PoG˚C#=Llt']9W& n#sZ MYoJ-T`?~ju~k#4?:$#=Y!|_Lt;CXA>`-(ȺA;aMᯚ˥x WpGD5#4#(??~U/0ؚYURSjxYфr"!,ˡ[G#B1GۚyN#YQ g@չ׉DQcQLŸN)#=e#46^UqV[k42XicَLv4fpF|6#=qRLμ0-101\8DY#}<<}H\ЯnN4Ys:#ss<*#C^0wX2K l*b8+8; i=);{w Dئ6dƴK,\Ab ѱ!O_$ |X`[YJaJ4dr(4g/wL"}xwO=5HwV>a,qQav //'ObSv}rn)OߒV\(&~!;}CNnmBvAy.?JsD9*~F< xb#qyG.aN NܺCs8Cak#+tu`G˵G~>)(:O;#/>IRJ[EC$Pwਸ਼xN#/A&qL~=/d#4CUw?`%{#{K:ܥU|3WZ&*b%P{GUÔQ<5p-OҶ"5>QDog7a3p"wbB)+qz^'\Μ7bbI^pW68+nԧ#4qMR![#4Dc#, h1;was2pF[1njc#4A{HD>L#sCjK bjH&h$39&&!V#E zd!ҡZS1Tlg XYX1;c,TX"T=|ԐY f81UqHa6t"ܡ)#45BQ4h؎ vD\M)_QRqIMqƣ;[E_\ZqE2U3GnI:JA2`rdjvﲠ}VQCj#6c]S+uj mջUa~ <眭iZLnp#4쎇Npqޝrm&%υwCQ {#=6Mƴ>DU4Q+n[RVusSKaN0lzǤڲZcBF=w0\#4dV ٤x`5.A#43]Ǒ[[bɉ(UF0- }`Ar4#41 Qt#4h< f`Y0G1^s`)h#=-`$iZ-ftlFTcN>Eޛ(6+I8isAҦۅj(>>7jQUCDnε1QC?S,=8O[ܜ({NkQE1{%?3GĢE>jĄ1{%1A0v:mbb)>%| N~x#P#4)QGN!;iC8''3{[`O=:1 PVf#4#4OYnO_zH"~$_OC:(v.1(w~a.4zqQiz R[qRO$46Vr5>U;xA!4-Hdܞ)CmUBC(_~ͫǭLXt0ia֚m#4m+:LElCMQj)I# O4̑eE[ LdaxC"mb1$:;I&@#4bMi4Lqʔ1NB E"8nh- }z6" vi"Ŋ#={+5\oQow7Fz8?m a8|&,;#4E?]9j#4:Mc[G jC32(ksҏQ*uwMS~Wb)^ϭXc{낛F7&5]۞{=<]ѷv~O&,Kd!{zVn_'nU.;ml*-uWƆb#=J˖ЙKA]ݙTz%e%z2uyw.YOs_\+*zfXnD7 PU#=t=y&c1&e%梆/)9kfQDF#=BIKa]@QG#4Ói BxrMf˕{iC_Fdߛ3l*^(W/Qw~s%AaOR|~;y~g?ȶ#4wB}n6jiݧC)<V-SC'9w|?n߇3V:{X?5#/F"Y@#=6l_X`dZ~ڿ%#4 0+ܯ E#/^MU=^q!G(k o 홚QO&g-MI\o7#/cƘp[v>QtbJG-Ip_C#4 $<@1ێ> ]݉E*+e ">d4Q X_J`:#=#4$<3tp=.LTÉ`ƍc *Aw_njyů0$'.P(8jsB_HNwߗQ@|)DmOSI_w$I'4z8v0o d0-90g,2{ZhU0U'Eldϑ7z}SS +ZwEGiHĽStn1w#/y <ⶳ$I*"EF4=jxfOdͱUi%|7~ b̳3R4BWf˓ލT׳!Z̳ͯ#JΎ#4a'%hbVUqbfv8FZdچ2u30F\tb8U0~a}3Lɗ,DY+C& Zv__IFO&gZog o';;'L:`&hC>o&W|v,ųICK>g_8AS`_4QkȒ4[X󺋀b#/l.Rw=9-r|?eRi?@;bʃdֽ}ǧSoےY9ѲM|<'5;jN@PQU/FAUAA}h@> z#42eD̿>} jNrr#4[9PF&SIj!L,>DO\RNpˋ-&Q/mHR9pK~ʢ$7@`ԋy1Q]#73egJ~tc&bCZ+85>"W 桥Yn#=T㐼,QO41#4iJTxj5j38i͕Bi8R b-.RE6*'NH׉Z0Ha#4͂ڣ#= =hw>]׌#rU HxOA#4ɻ-nsW !aۿ+.:kEc'5z@d[d KDb@:ћav)U`Rt(#;(| `Ēo|6& h54rn>3ȴiwr艴kxo zNֻV ݿYv;si-2-q#4Ҏ̢Խx\9["g7#4=R.$4bF4UxscqLA|y\J_?=؋F%%%;%o{"G6OMБ\^L\7fhCD,M t!>7-D4Ͻe <5Fm5YLJwIS)LoOdxɼ–&[|/،CA1N,s^~NQĈI -XLNhLWZs7ҵsYRRe^;tOV%1"9j6~)h ӧwԺpN>kx;V&n3Dvk.ώB(YseHd3l{;]gWWcH is4muy>H:#=RbtfGWƫ/ L ֓[JgmwKw20v;a-V6F%ՓExJ4n'.rhZђy|5/O7WefrH[} Pŧ/Il(0D>MN.;ͦ#4nmYL 0&#=\͜,L/Q*{l%хyi͹Eh,H+YYd>);eTm0єp1"^wk'$*n;m׾O ڰ@.Y0+7*@{0LV˦fgxPņ~a֢l9XJM*Ȉ!#=]d\vOl X[o>l%پH`ފ/Yں#=|E@@ԗ<xeV$+sѶ'%#=JB+[LDA @.d]G>wGe#/+WXd]VEٴב|րʼnU06iզ-y\ #=/zff;>1ڍ}T@.m!HQFvJ`325d*4y~+.Y#=\uփ6a<b TpL s<[7Q0Ung:s;YUf^HҖYUXNL(6V3J_f#p|Z3h!դ:#B#/q:Ӝ{++޾_fq.rM"#t5;G)Yغ:_%rk«u@<trYѭbA%jUe4`-9o&.F/x{|^u;-nP~^!rxyGNQB'i5(>Fƞ8_T w7b3aSF[AlyC@(IFZ/Og2Lt4Z׿wjk±(Zs+eX͸87)G>~KI|$9i^$|ҔओN\˵ť4sv_}\Qݛ}ٷxU7˶I{b_γPv[T)νg xt>V: \}J~W;޳lg7UXFH #4'f^6Uqʞ '#4p#=p_[@3dDYf JqARsV=k=(qk-~4Øno!_wl0!=1^)a-DI#/pwϮ)By[1йT.f7D?AՃ4N("VTE АX8 FNԡ#,PL9xwggbsEg;#oa%NQ)j q)BiΧk8?~tˉ5#`*8FjVK\aixyFцYn6z1S߭YP]G}͖roLjJzO](Co|%#4WHSrao#=֮.x?C]#PHjZ*̓Z m(@ܬ~.o3V1=Tea@qgVҏ;k8>:D7I{w[(OrG0qlmGK3HŦm^Yb\8JwHm#OdmBTنM ՠYH}8?6p2~?WqF;g~PAf~.k#?K25mscb0#ωpd6waBzu]O]LkV0+WFDwu)FM"? \\0f&x3EFd=6k* Dv8߽k%\cʅDi yA#Zͬ^ $]ٟlh)xN0լF/8ZAa {C51ƍt#ӫfwhδgPA4Od#4#=GxMѤv+A#/վ='vX=#4Eyʡm̷kI\#4e)㉶v8vPJa{9#C6t;Ͽcpjz8%(cZtQ[anl^.V]P7[UWH̺V*>UUmUSq>?.Q󝵦^j` hQ0yyI5Qݭ\---oZB P躍jJ6.+ic#4/y|1#!I&^5y1U(gtc"7Վ~y3"z,`5a6/<xZQC#4C:җ|yNUp7e.ҽ8"ygɳ2ssˍAI1 #4xٴ|X9fypx!I5M5O"W_@?9L o#=[kaԃ0;]kCuO'׿oRM#/OZ=cSPuċ0UV-z(db䜖5 Nj%l GPn>@,d4G34F> hDϳ<_D4~w]~as7'N~lF^Mwsc3b$ 83M'^`7]HLNy\k𹨕tK%/m큱Բt ~=5xiupnFtlPE=sJ.utu|}_)ѓa 3=ZO5K#=`g$=B<^ ,f7*ƭC7cVV6+AT@9a^_hF e臊qnp6ٸ+AeLdtXAfq~F"Y\7gd$oRFzf P7s?]Z,~/M~Z_FӀ+H`c\KOvwKh#t* .[[]2Y-b.-S1S= S F.Fc+UʅʔlI/ۭFrԘ;0bƼ+A!}Pȁ3_0:pjgQLEf/Oq4g¾yo|#4/v=lv|ծL@u0#^q~ /5/rk+fQL#xo\K|Q?$ҽ# Ra0#s$AtpuO7>T28JYG *E)⥸eJ“]Z@RJ܂hy2CR>4M#=v\}9c6AnV#z1aq#ͶCNt9U7da^aG=0bdl#4i8!~GRJ'1X#=}W׈\R'sPm/b#t6%tϾ mڮڃ>763Z}7=6rj@HaLaRbTtiEr?0]c9aHNcFN{.`ڣI s2%Kp0 ! 󇃗%@O&r{ ݻ{'iss9Vh$E+gaD@=b[C&u˾4[=ߡ3=,J{t'7K|:j5 ?O9}۰4ƃݺߡ`?.v{\a%?[섺)_Ubmo@A#=JX/OJBO xσ_k9']]7"QvU9WN1y#!r0ެ 'RzZ<^XÜ#/к[ hN:tcEØ)(<@)Ga÷~x@Y=AwKm/oDH5P=rrU#/sl|T۹Q?P?\D;pOV/\ 1oK#ᚈxb0 C5T2еC{YW[6^d1x$@Rp75 #=/2bKMĊB? v.鯐nvy.navJ>Fava 99eusЂg=]ˊ}έ#=#=#v[4;P=9D-~878}ޤBT/瀂J&F$bR!!!#/_|_~IG Ô[oOC#=\9J3rFbr&1}I!:t#4?gi1 yJ۷ܽyyJl1deUAB종Ђ.AU^:wϜV#=#=HIFJ `0)S*0P x^F$l&CH]}Ll|KN%ir↚h0,[9#4S<;`6 ڟڋ}#4 t|VtxE#/.&M7H&#HA^b q\ ($Fɯg׬~3c۰kvXc?"dUBRR@/P[RFCЌ.}1^ˎ:m1[yNUO*#4u#4p'Or,\rK'nFIM[~%꘳\xF^Tu ? j{:oUi>:bz`1ù>c驤pѥl_#MOuZ*]bdqaSFZH[រM7#=Y#4N9avz&ծ$X_[v`tLv"o__R2*q54d?,tԹ\åvr708pvpMVPF0"#=y 6|Bb E#/B'ݥ q/r#)a)d]Tܿ{s0y"`Q=]:ƶa)Ȱ"i#/56&ݎB ΢J>Hi3jG@η蠽z&hFɉL|d4$$Xwz':t'wWz|@?K~c9.Xo=~fv.2u~#=|q20#Cqxϝ8\컠yp1Q+Pvyu4%zYFi}@РdIwz-)G&_)&lK'Kr]~Xoݬ!O(i<1 2VLB(f )ͧD'h!) 2/ٮX@vy=VHP\}ϑe`ACH.VBt+޺ֲ{>9G9~6WOdqG#,SQSx`$ڲfV3jmh`2Th'dD|D Yd\|LTC"o#4T`'-ӱ>l#4T1an##'lo,s<]zMnXX'̧'禪u;Q#=@,)ȡ-։GZJ|ux#/AKzS Ksp4J^-CE<󍎜S-ο5a_A802Ϻ5Ň:Szxv%-Fknh#/v>]d[YB3 Ң|d+M@_&!2 a[*SH;0Ķ1d˗JXX,wgՔQ#=^<|'ӧ+탠m7 E<ɝāmrI#/|+SYR]9@ZjNaB6U=&qve:}ְk:#=()SA?@ds DDS-) QW| WyCr)KTBA  }blh-P)haݣ&TH#4]86CՂAzaDEYD5ޘ !Kw:br"9k.`zڣQ+*5Z\";TD01(DE0ys76sR>BS͞%ZN_NnsƤ-3[bqu}W|7 )X%9"")Ȑe߯xsj=$41Ka,~De.ԋ3ՑșqηyqR#oNS7+DW3lh2#/RAE];XI<k HM#4X@ԧ`&$gy[ǭ4k|R:H!Q&QwFuD"t*`QȀ!y)̃BI֗j`0kmJ##/lP,(7L?5vMj˵88X`y3V \O1F^D߽Tri;7ձ^hFCbjby(e *,86â߉XMɂI(Z)%[O Qzzk&UH>;o@1)$3N"G/r MHASREMtH"=!&dfu]%-!!Y#48'D3^4Fm*)tδM['*G#=<#4Yvlhn!\^ɮ."I0~PWNMK4t!yF2:>#/ o0t3分9#4y]1`paNq.`Pz C#/a]Ǣ$6*ÈFħ&7sD10|<#p(eűӯѡ7Vu#4X[B1=V`!W~du2_@)z;:Gt:͏W0xWbPE)aFhrU^cKl/Ljd2k&{=A_J!PPֿ̕O ϙJ≗^4VE'8Yre#CAUQ%QC\tAjhj"Ƌ;?,pT[:qȂ#=㞷&m#/hUQZ?Ps;_a>\TQaPA/?_#4{)+#(.QI/ik/ot]ϏDB)}rW<TTg|4>σ%#=fH7AGt4؀{?#HyHFJϘ~8tx@?ҡӱ@XRd+ ޔCӖVt~x2n2f^k 0)sI*=.vR[#=$p0יC/<3&R+a~(=^Ee @׻h ^=vL=wL_"tt Ý˻5@#/̞Bi>jPXmZFC#/D% rcAݿ(Hn~lFD;7R>Zu+_rk#4:0͟yv鑾"u5o8\dOUY ќ\|'lg;Zhm>,6*D4cn6/m)@:)f7UF<9 .ձFfjO1.s8dcq77-̻Ba$LchKa2V4*!Ә&S"͗[=ޅ̪qB5=z`Dzc{JfA\gYϴqzc}0ȳZ<YTƐg #=JUy\,̻ _;wZi8eFUY#4WYL&[m%07(adFMC؍,Hd&cv񚋥7»8 ?ar[#=ͼ?EluD|f"ª*%L+Aψ /VbñZH%#)s:3؍jJn^XN- h~];<ؕg򸺽#=/C#=JwH$;zQ6 Ҹ07Ԗ:'V(HYۏYBI[v[ŚIŎ #/  z E0 *!GoĀOs"#5^ ?O:$y0?/o??_o/_?Of3?y_>7??_Oc/w#=Xʔw$KMk]46oo@3;j9?I&\9Zbl*QO'OC15x vi) \D d.x #48=Nt06rT(m~ĝĜlpHD#=WŕI:#0Q#4&EAp@(p1@!%ߘiVȋ4t~&?>h9:Pk~ |qܶ8'LAhCQgrA\hGDС;"0]S"hc?,<2|ooСFPc0lS&(Ի'w,γG>.fu{h>OsŗdZ-;& ~n#iP4h؏Jxgs2Pe=PQ; eV[:%&tw#4U0 köSi|/(?&~^Cȍ=<rWF% XHd =FEA8Sx"(JT3N唎{/<+R0dկv6:r H<#4xV&MQs@h|>{Hӥth+A"{,9#/EI풙 <7d& a~<< <z/CЛXIawiF߻)b Zt'H6)"+A!40 $#4LdGQղ|Qyr/A#/t&LX~ y#/@UN!#/Ņ {wɹ:H#9a_N=W_uİB"46jV3#=m" *T颠-H9uzkYFK< 9_rf!)>v!f{O-8)Mdi>E}#H+I_KFؔ`ZL:QULS4U/6f y·cgI#4!#4R`\Mi7diGh&(1?RaKܔXù}w][qF 8;$ UPEC#=L#/! ?jny8c̞8;8Bꎹ<<}]EgSLebhx_9s>^ܔTs=⊞0(i.Cm{o\uM1#=_ԭ0"z'PyyqV2y!,9]JR3ΪZ #4#4a.#/n$obܑ+Q86d!"`~o{]#4O/V?nq՝1虃D~A NOϓDL{:9U׏sؼ*@ٹt(%#/>};01%@[cݛG]eX=tQC `lچ"Y#\q)r-{'NJ[Β7#=%u{J4)F&|t;m"@9L3=9[BϡZEF=ei\8O,OG䙲nQfu-F1SA]r#DTAjbR6zW6< q:Ct0=Ԝ~E'lkc.ގ.-mVrעQa2ȭfs3:k6"Ct#=҅X4Uu$qBwnr$߰5_9JwOߏn.}oGCSmbERROf` h*ZCmǶb?vwrIGu=/0I_Ĺ3mLOGp#=딯)`sg鯫?'~[o#4ޫ“,%0 alJ): CfB7d>>q({vw)4݅Rug)%/XU=$C.BFG'pgRC<ѰggGM@吼aVDD|T#/ |a@~?iOP_Ϯ;y~ S/^ʍLIy8~07H @ԑOL=*}|@[+>ϰ΂I  $DڊB $@>ɮoW݃B$VoGqƙsEv6ms;4 `ƒ%#14Aa{$2@7ѬSb'NuU yE\`P fMDI걸tbX1q_XoO_iY~;@ m?q\y56ۂ""#4{#4|i*6S$!(no#4pG;áy>#/Vg<:yk/k#f?GWC`LQ1՘AIJ|#4?A>ޘpx"V*a#=,6s-G0Mqd u[ʗ`T0Lt*-_$#/fȔRNkU^VZ71v>UQE%"x.ޭ* }jyOН|8ST6z(FKkG/5 cSh8#/t@;kϥ)7$+JQd̠}#40+ۇB#/NR#=%U=6d龆J+Woev߿çޞaHʈ8}ZTRArG$0 |>}N?@#4%#/̈3yh$=APy@7#4F}_ DDP>ԅħ#G#=fqPKlsIu 9Q ~F}O}! '6{ELq?f<,uuu%A!]8]D/g3~p3pjnWlٯ˚Np%c*JmW DJ$o5ynORCjx# :ou0<1I_洺 ܯ@Q6#/GI(O#=AL7sD#/5}zC.gn|;g\_|t[B3먄?7ka[X myױ9S{.\>'@WrcJxڃ-&@)z#Κ(r *",S6uD*n.6~7ƓcxO/#4}d:~)?$/0Ï<}>/繧NRk;_&$ot陆I&^ߌFQe33z(\`0&SCffg)-)@M+qo1PHhCB;t>;w{*"__`5##4ZL#/Vgq߲"XJN!c!!($+$#4MOΉDDHo0Mnmw6;.Mڈ}a#=##/!JXM';P$nv`81{""2uRO}_FИ8%?6{&33mxu$q+9qRͿJo@k7[[h;#4&p#=#/2P(Ax~'_Mofã% 𼣔{=w?5b#/$R~@.FBQ(F#/DyI)۪} rG^q_6B@HR3"F<ɼع܃)8@CwY[.IkQ?Aj"Nv 5]"OG/s|_钩<{ϰ!ȈA/aepQ}Q`#/T}(~X ذU|,Ӛ*?D=ʨ 7=C!5=M]s2xN눚5/UY6ʤP49>RGC$[YjE[CYqo5a /Lx0[W#=PVI jRm a}m=:\ss83X󚪣KBp#u`t#=-NCx-T%Axtx^.ۧU{u"5E;G [-0ՇOFCg1ö}U]Mݼb+e2"i/MITG9mko&C?weP8[T}8d9C|J"1/]$k}r}~kܾ*ˑm9G#=|eS"LLo$Pb8Ln PQFP%?/mzõj\bFtzDZ"k[fiVj Wzy"[<彃^3o{j:WW+;٬ V{Okh+t˙F+HfoCaËESe8nduT/F%#ug3u8 .UyL:,%nvָc:bfU=t__>cyqAN?bPҺs߱`L| 298u~LNQpǻ%Ľ:ꊜ"l8fn]Uct]c6h<‰MQR {C_p6 7&:EM8)#=#=%#=&X3"6ܓ>[Ɍ*vԽn{wf0?f/wd`Ds(6Az"a{}M#4|!V0!%جP>8 <ﺁ?WyMb9n'Ps~}3*;\f7!+ GZ!E9Q|K~\6?Q='?5$)Dzk\>+ӂ.Q3ư^Ơ#>؎]q}1yaA1;{{Xx8uB[JsRcӘ<+b1um zj)fvX ׄ&c?b4[੧w)Ϝ:?5h,⠕I⨒bAlGH.˯m(bm߻8J7:[WK&ORR ɇ1&9(#C?P{n9B^<2h!tg#+KpB^W.nxl"$c-`GrQFW w3#^FEH#=Fք$D 4wPKpϷuSC)ԪU*&"/>IP߳øu#=^#FK`׾s;6;r#ȇl8Qp(YxB05PEɼ)EYG lJ[3EV#=4veR].Y6?NdzANQ3_&nZ-FSv͆>Sl4UJ:3 D@=;p{z- dq#/з)G}ᛩŀ~;]3 *3R!f+:Li0sǜ6(A,`M:qCi:| ¸:q @0.Ly*؁|"'g5EY^#[3L=ABsW+񃐷%J.2 y냅(xjd P4c9U :9Z"#/M. GT*$JaC:CzԥHxǗdH,##/B.#=I3c꽻w67_־d؛7tL}~fad'1:Vxaєb%~La0ⰊlyZs~)洃:˂FO-xpsM/H|<)z_Q爍:dol!D.#/n $K;Y.G{?.KٞE#=Ό8phIxdS `ݧk!Z:!>D=/@c<3>=3NwJ}x{dU8G$gI/J#4lXrvF2d[CCѲeI $Om#4vמVwмPsa@J#`FcVrhMO4Ϣg@_+A'vW~.A7C) nC#4KUUNTdJMT#/#/)%V:!5 xrP=j}_&[O~|nW64s|T{x~SR|iv?z>>OKKeBʽkU E3j>q.D K " e@$>,$'"$͵W=^6h0N#4e,X{0dd-'QWSo`>)Pnu*Օ; #=R%>xV4u~tn|v>X׻btDП14(%@#4t?Y'zpr_zL3΍KeTB_ ?1ň!UOIDQ#=3 $_(9݃"CҌNIq[hZ5Q#8Mkf0;N=i|$lQG\u@a(UH1AF.F6ke }hDE"aL ՚3͓4TهVCeT!XpCLf Z9y/6>OD1À03 }Xbm1: %#աōe{&ؒRhSR; ,ZY;H0#4/&NB2C^;g ? |<=*>=gDEFNѬoT b!,r,rrW%4Nt? ?qrtȀ,Bgnd?oAX~OYm4X$?"kH4=|K?@3y^o3ē}}11,tfuI|>\b/:3 -5kd`v%);c.g[%Jtr"482m)愉ĺX(-j+N\`R &O͢Ł6,#W]#4Rڏ*=4vi=|sr@2&#GNgrH)g@j$ 4(7 dĠPS$\2Kk6k dr|>W\#GIgDߋ,NM?[i;H6S3C% *.{Y Wi"X(7HL3`IF(p(F1#/'}mp`O#G6P6d1x4N76vz%֛5GoΩ?Yeqt?jd0_88#4 C]JE1$+("8uNوfBwjwšAT5#4!#/1rwE7 YsVo#/zix#/cˋq P6ٯq#4`aǗ]!;.X@*#48ڵyɠCchADL_gS<#=~\2AC*Ҫ4t:cxyI($]+d۵ArI ns݈av@Э21|dOߐ#/6@9#Jrv4}y/Go(m(c?i#//a1_Mc>ؕMOp5>!nhNF_^ׂ&8Y2̛twӾCg ^ _k}o#4ϩ䞥hSTN>#ɛ=Ҽ.#4ݐfxG34!#/DȑX(<1Ӑ]{|@6m0%&<5+G< xkv >bB|P^"Pz ] @MUuD) ;9q̦&B *6S\L['0ѭO0xiSN8SDdVO#QZAD%4A~xulwP/>Q|*Nc g#=G 5b~54̑}G6)s¾Eg#43r{6 |t|BOﶾ:As$Z\u8IFknoWwz#4B~+;ukBĝ=B0quxЭ힄N0*+INUt4R>*@ ܫL(+$x`~U(xC=zە;3_6!0x90ف{4Hv̗~5LEf ևІQsQM%(PmP:{A{qL6P >CC:/꤫h;#=FBN# LFeP]<!Z0xw)8scҋ?  li`Zbgc8 vl'%F##/>-`#=ꔈ$)?/4| U,%`|P)Q=6lgFP!#/>Fx5 ɖZ!RʶuAwD/ ߟ{:bO?6J%#=b.i%#=<ժkGld}'Pd=zsmB{^hɃC1V#=(9q__5 tnCe,,,x)Bb7N71~J!6xEik:henhDI3U?5`~'ndYS?3'٢_E3{Wi]13VteaFR>O 5a}}LR=um? ~!A D1YMPsM> 8'>nͳqۆ#@8ԥúpu$6#wQ"q^bjAi/Hq 58& -6!QH{eR¤ߟ4i]C< fEG殀_Xn0!hR}.lGo*~#/{gL b j Q 0o_эbHQ,?xe-8uf̑~ls8(E!Kl4?vbUѯT:r?72g#=usB"my|.>)>J+#/?_(sqF8L_ױ!Sy`mC`!k:ŕl #=6q;t#4G5=tCN@#4;4,B M td_HACDm-^D"l :Fo'J{:<@=H@$HC)g[%d "(utQt@I_қPDD#4[ƣ1{Æ>Q|k.#4Qdw1KM5ր>{b\zBIH`!~9?/Ad>; 7yӯHN? y}U:攕$$Io;7ǻuovNni=X*!(@&_j{LoP)|:0=z$`´w;N67ڹ׮*F5 _xs8fw{CGTynE9F/S*_^]C~'^bYb&)vt#4:#/"^,ݷ 9?VƁCbw70y8䮉p:;GoM?;MTCD߷?L3#/DDUOD}+0=#/|" ԁ T@Xf?Y\[-QFW$m55[ؗmv &j"~t,7N |ّO\^ͱtH?X-U4T}*~0 I}_>'Oo Uzq|)\QO'Nb/ވ:X#4)!֧f%.jMp؂-9lt컚]f52ZЙ'8wyA#΢,0"D1真aUqK4^PQwOrn?QT't@r#=6ɧ:u;qn]Gѭ{ީV&":.-UC[0?PV##/$}#=7 ]?wr;2" " TJ g=Yz#%Rt\m<@#=:t=cǗdw}#4|[P$PACWbxY\t+PCS'fE*67FV[4{|<pCdBOG.(:u1&r|9#/#=MR }[r>FA>k^ӖBju5݂^til)0~OAc#/4Dniꒅi ̺ m70=!l'bJԢ/wOi#7Oc @ru@#/ ~g(#=$+\m&ZN?{n`=_b!g1#/c;>>CF|C0QFGnrv{<WBk׏y7P:F]ľgh!#A,[Åryy"A#/P/R렯^S4&pġ#=#="z_5,СWQ@S܉Dw/P,#1ff&s1Ul\]K?,lOϷ/=KCIMW}xw>2ġe#4 ޤw;x-4UZM'H)1f-#=.^p ?!6L 0>w@@uMZ !V%`/h &%Dٮw Py0Z\\'98`dמ@DKyenٙ_?pow0R:}ڊxDTA0QGUPyCsg4A#=J Fl!-ldߪ^i%SpM!d9Ɂ(*NI\#4upbH @{.R~OWRWM<}|0A[@SM}>~\đuHA1ڍ!moV$)zP(U*$ATI,Zc@X}2~F1??ߙ*)r~!o`V#/&nȀ,3;u>Su|R#=Гf2]=;080^Jf3#4ש)igg]QΤXU PIs=+@:$|S1F8=٤1Y֡(H"fCILlNTChY:.N|4^Hn.U _yá@\utx7;D^N7RnXZ``@#vn ビS؀WI&ݥ zY6q0uݞsP?F/ q< A1CN#|_30U]4Ƿ: mYl)d?aHr@7.#4q1_h4 Gɳ>eX#/ȩ`9:C=S&VdX{rI&m?#4e5TUY2KdX*3F¦*ldqק $cAIb02x,07?G<ߧ~Өyt ͞gY1eQsa`1^|O9#4NHM#921O>pQus˚={YDۇJ?Wd9~B>A͢#4d[(ϏI 1Orr؟#4G倃܇R2i K94wƵ.ҌбI#4]F!mol*WACNv?~Kp1ﺜNʀ&$O?n"o@!Á5Z3EOS~K=5]kuq*U6#4660p ޡ0G=^'>Ss+c5Q?gæCQ|fN-(lM$}Dda&;u?⸔SĜ a]q+`efB*K#=L ' IW#/F/^Sſ?n N*hI |5 p@ gq0A1ab6| Kxz;c?=ޏaޏBU>ܬi ÏuTGdv![PRNUq:d!G0C=#4VޒZ:4e9~3*uYI=C2jT$ #=Qi>n{_DȠ̜mGb)q8I߯tD,Z!=4#/v#4ond#=$$H{'$^z.O#;WES#/@M54xaq:W؋6cy۲#4q(@(07[!5^<'#/#4HҟI~E<0|#/o}UW)oq$}l`#4QdQ.lLM=7Bێw~Fx?f٤:~̓ٙ2Q?WHPq#/ ׯ:ŖlI|͓7ݴ"c0bf5x =5#4&E,%; !=Hq8M!~Tj{USҥC嵂18Ϟtw8ˍP2dP[d,v8vIpL3fhŘYߜ<-?RugS[7Ts߭o~`Vãޠ3jzYx$ Zf\>_,'Ibblt2(qOɲ:ï@D4@#=J^&~3zkuւ?$M!2LPi_N#/Yw#/Lj*'ر8/zW>'Hn(1%$1<^)<\LdNu x,0cia+-!\%Dtor#>N6y6: }p?0 #/5EPj]ǻw$B%IH-O>U+)G1G,H֒FvB#4 kM=Bdp*BI1$ŲGf7E#TAO:ӿԌ\aqIcJsn$)9r"j"Nmfhz0˕d+ 26ŮۼF9PnZڡZ Aqe, JQx`X?[JԩTK?M~qhWlzfEDꋬ#/Ig40U?~odb"!Ej(#=H6#4#71OEk V?#/_?6(Cbb1_T>XM>5I~ǿ#=k3_i$lT({Ow|qGn% ]W!I>Vu@n3_ˢJLPG̅NY@k ԅ|oϴzÿɨldUFtpR"?%P#4Q~@2H}bPҨ!O218djV0, Ԡ2#/. B] 0+g$R#/Er K<}( @HD4><=ԺIqdXUI'|?py{`y&ap{#4@j?H(b=OA@r%7yA:#=/%M4'' D_S/q41BfIk+lR*xMH9S 4-pcb?fhg9BR(Zo#>39NS6p@v#OVva^f]7b?V"fi#/!`0B~~˷ֻbKxudUQ@+ۣ~sTu9Ĭ%(#4J;?5TTD5ZZ[2dA?.GdG+e\rQ$eP %%EqpD(#(^~:DK䰛#=Dre(/A%Y6Ogn,ҋoF 1Lr󁬩y1#46oRaTv-b@!B#0LS_}@(I|`B#uO3|cX=W7J<}HoOœ8L(o#4V{uE9'e.j$txm=ïJK]qg:zX GPû80)HŅ#/c" yHab0X˔jU'cԯ,CJJxC26|wQ9A FX.y35Εed$ыsn\/Ч5o4C(Y!XyP"K'.J*"@t!$@4V0D#/B"fO鷞oh/U; !ؒZox# Iz(QHnY#/qoBwh$f$-Tk/5 u@މNEioI퍗~ޜE&#/(UT,|amQװie"#4Ȯ4EXd-B} 8d#=&s<ƎsdbTP.*#N#=u #4qsl˯rsJһ-Xoa:7Ѡޖ-(Fx{kjm>?nφLwtFażp{S`4.K1LtaJ~}GCvgrՑg~wQEttP8c)K{k4 D[B?zNB|=Sh 9ܢ;, T'Ef z5nS02#4H*"FǎPs*/? #/Pa[Q4ԓy7cǝHu^ a_1޹zY8鱎I~\˽"T. /Y.p:ЃJ׬k\/,_?ĞBHzpM#=FZ1gKNɯ+5xUh2GAP^DSzT Peߤ$F >h!%ɐz'}́>9sz`2f#hRdu?bӿ/* Oe\jT$#/8>m3 뤼EZ(\v\#/ bNgs$@3$ s=Pc8V≖IbɹpD#=wmD@ԅKNj d=xod &~534A@"n4V&Hs%TH<=L9!2G:%FŊuLm렜=&>XNJfO3?^#4,=VQ`Y()C|A.)03=w>a'.EШR$1ߧ;wr>XeC~|G36;N_}`CϪ$j_V?O\& 3'>!GgFg2r7nۭ㇎"d3,@W?+=ذ:z['c4w1$: $el%@x(/M#/E2S#=I$AH+rA;*kC 0Q`b52^H`)U#UKMOϦ1\(&f_nz?lzOݖGbޗ@G!̴ppiu͌p#>oBS11a##45G7u^}bAC`d?70w7G1X͖2!:^MnY>io m`$S!oF*!#=wmt?=j-r/]TEUUi f d8dݹMVw l2"DGwS< ʤ1hH47)ِOɊ I%jcFntVHbhX^y[{=zm7:x#=q?N,d`97O"p8p>| U L/AW az#=]X<\>cÒ`_';t%Oa .a/^l|Nf"d m5!#/w'J(0zaDoƇBa5\Ƕ<&0y*(I bL7m fs\񙗗=;3rmKnk^d ewzg-d?,8.0"8Ɇ#4(ۅY$6Ί&RjօIuXb#4*֬eU9KЇ646IC]}۲=k8a(%؄cWs(0@`N%r&CzMNq7fSZΒm>s B/C>X5XK>[XD@mTtR*.#=QyT(j"$gQi&O/~9V.qfBtM(\x:w>!#4ޣ5<CW hA 2)ݑ4wTJlPjn/WI䓡;0B"<.{jJ2%Zg*|-.,nPV5#ִ<΢}E|ɡbc7 #=}&d,i'C T9-#=kAf\4)4z6Ȣu \yhg&?,s,i#4||8/H=^ޔcw~g?o"~պhd1/oG[cQfm  c:`6 r*A#4W+R˹T9M {_O0'҅+E%RT}b59.HyiLvΆ2L^1i5E=#='97:b(UPHEAJEDV;hZأg)9h':98 zk0uIے̲g!'-aZVZ#4- 1F2o;xwnG9x+zEL$njuSų wW2xs7W :gttB̰KhdE8:ZJ$B338cSX).}ɁxlYoD$ٹsUek0oNx_}e+R5X#f"{|J=a<ꡨ^Ryh)ADw6q$Bux"4stzNPuM#=b˃M Y6Aֽ2I.r`yTb0i8ɂ&]ῳ{ T p6-G u R dg/q_>-*Nrˆ$VbG~{ĪsuÈCT廿<ɀe8<8̌ߏMm*Hh&#4zaiz3<+#=&CD^L[<2,`4"Q(M' N#/Աɓ#ƪ{#3޴U6'@*QFa :qۧS;0Ne3@9Bϯ83Pj[MIbk ̘;ٚfn{Fjb#4ƙc#45"0y%$d/R4ʛA봙 b)ZZjd3ޜl@#4j#ޏǞƈ~/1oGg `j0#0r'{h#xqϳ+#4ˬd.v{O˖B䛧OP8>F(f~׆#4e‡~1.8_ s)_g%!oH(#4akc5#>bƀ$I"LCux]>8reD8uFB'k jNЈiu4!yzR'X 'Cjr3T#50Cu Cgx3q8ԾN2U=G9Ciw@hWN YNrzRKX0;C#/8dGqE*4&J=I8Q[3%gϪ2c/X;В֒HLX{b*wwb1wۺ i $S$6X@.t5^iL0$ueY$إٙ6NP,apȳϯo{a祗MFu,~V^pp>e׮V1y!h\q5/^1LQ̎,S C;_7=mt1wNCtgmix=Nu3r~˕Jq)egQN8R>Q)A.$KaSKXG"Wd'imdǭ`r(!5/@)i#/,'4CoUt7 ,\{0!Z:qkլ!n{)#=N\$٧>$קev-gC|"}CAHc4D @7U#8{j+z&@}XIKщʹF@Y [qXxT?A>WH]ޖ*uRf.j#/~=ۧfr@{.l!#/W׈p=4kߌ̃ubs,~^zO/ǿ?2`U'=B'6C澽ʹ?-O3ʾ(Lsp =Z|g>gϩM:Kws/puwG@0` ۹Wgr*|kS~UЪ#=OT(#=d#= j=bmRz=녌(ˑm#=T1Ʉb#=4J$xEnY( xlxa)'L&SD)**TcAhJl3`[#='~";U`aYDޚU ~ch)Y. A'#=Dhx"?q!T* \!0Gc2,UFD?B^>χh!۫cܕ:b 1h.!9S0MC&TIM#/0L(eh2 *z:<_ Gc]7?23bjt(**|p#/P+z /r""٭j6E (s[uуG_GxCI]"h_Sr*Xv}?GT@@RLLQRR{dL#/@9sUS=,#5[q]ebz~ڃ0a]gt#4 !B2FPϦZulh+HDH&4_uλnD2f`JQlJu' |??'iN0(c1>q4\s6? gʛiL//# Σ(#/hrP& |J> @# /+2;D1%#/H! BGw@_h@T{9'q)5ޤ0X#4@ ؽv15md]73@$KуfE2qͤC#k n(I"+B1JvX678o$kB#A΂!dc0`?`@4c&!` z׫=]ОCNE>g[i>ed)UNqF*~dIJ֜DX'!e)aA~F&dC?G'fnC 1)Hmַ ߸lmjT$VLflŹ}(٭sv_gf*ᖚ&[tHj(7jnޟ*+#DDۏP#/U`uG=^GP0#/4 A()F2!&X~ߤ#4>Ln(#=kb+AƊ*${LQ!* #D@ 4- a(ȄP‹$J??ZI%Bg٘O,ՀϨTF71%0#S J}\|#4& ǯѦ'ZdE8 6tDTRƺ#4٤fӢދ4D@HLb 3P\dBD"'C`.<4h2ZBZjE Hᒔ)ih:#4$@ 3D#=I"hm#/HaPЏ!)C2v#=R1 ^L7,C`@ \GNoj*J;tC}Au'#=Bv/)x *ޤ~N+~J9zn)fD?V$>o^V vF+\C L*(_k#= 4ۖ&I5IԚ#=|A~v%#{^8#/<> mt[u<#gMu#=T"chDb#=T(yjEc$i4sOn=#/#4!QZi#SssV@dKr XA@SV9%\Y9 ==@}'g2"VJ.gh}A+ZZT0P困̎c-n3&#Xpl~PKԸ`fzn̘b6~ Qa眫GYeL^=(匝^#Ohą0#/~SoB6W8u&׺JH?6v@knAbJICon)>QCe *CdǷ#4LUnd>D4z`4$L I*EH&1{UZ*#4OST^}?E*RaQbI/>5Zק8pi\5l|#n԰;\9.9Mq%V~H\B;1}#/he~{(2JF+0s#6 t.M#4#= jIs^@wVm^HP`(UZ &"KϨ`ҫRpm)e[0_I?C]`,Z69NAOgp2rlMj,lm*U"&8^#=] V*r"@0k:ԱQb,lmb ;h,6 "-L0Ȫ4?Nܸ'9 #42S"PE4B#4 P1%!BA-%L0HBUE2B!2@2D%JĤD% 4)P B@PJ¡(P M KABP 2P'g~=+f<$IiK*eNwK#4]-a>E*UJ#/iQTiQ#/C'+#/;#=s\ >O擡4&`m?^6tO8|3`niBHMhyD@q}N;AB\` X(i4PD90lg >x>'> XTO!z!#/<G7JD&C@p~BpiMS~,BAB~nIÅ9| MRcwNF?CDcsftw'6g1]vp Ŷȗǂ!c3P`9`,#4`"$sOr~nXlŷG1869 JL`)Sz";ZhWoM#=?٩=\تsJ=(rQZ#4xv|zXՆ~}Kh)ԯwkR6uLhw*<3?3#4f,giS\8*!4E?daJji/ ]^0>0'l'q=2o(FM0^(!<Ϳfu&#k`#48XG='PM Pbt} ܍\>ǿJ= @6#KA/1+#4i6ĄUxq h9uѨُ#4D!>tLAӗf:afAAa'ivurc9|©YU1"n (GTW)i¸:CATUXÓЁ dd)Q@[2QZI]-_:*;&*UjwďM={O#=ccXΌMǑtLjW'PsX"t#!PΛ1hzarR%t7΁ M/g}QEDŽABLAKBPQ")=A"iՆIA& 'U4Du9)C0Hn=xѿӬd{AdnxDX49@xuMQQ LT#]lQ3_Q{* _p@HA~ey*jgClPezPm7}ܲ=vĂ|h:4b?UGQsz蹧DV064֠c#TNW e#=,'@`#4BJ"*E%Ե00XN#/i:ABh:,HR!ShlTE2lh@bSE.BJ D:}rc;oVP!6#4s6R".kx-#=A Yg9)wbQ-ٳʇD/FGci+FGg;Ʊ}/m]'џr9k>FHcјתA)/{1xp|8Zx#=aK#/W-_(zD-+m"4A6:X77t`p]\P) i(c;βwlОAٛ*M80hs8~gB0.jZoK.J dDNaHEa$;#={uq\k3x<cS<9u1|&!kzI?lܛFbey֧쬇RmeΣN/{/w!ôudw,8%iQbnwX.hWmD#/iA/7@םH$N#=^@jk_#/HGxڑ@jBfn.3tAsJQ p #/p;T3~FT:c|G-R`}(C~K, <.'&zcLlOu?#4 M aD`I]p%#/y`/jU4@D{llEWcvtef;T-[ic9d#4 HK!իY+LѣdChCq:I [L.=P'6]DvuA7pA4ԇ]$/(,\ˠ zKü}TO#/3Jk_qٵ7sn72m5sfR9Hf!њ"1w(1+yB0w G0&h*@i* i)*eS ɪ4C@6/63m#4MA{:y$h8h#48z3Ӌ.\%$*ɇA >07N뼂2!2= |EGتLiօ)h&#=&B%%S++Fҏ_tKCm2t#4=SáHI8mnqEG#=x ӘYQcV*-*¶O5)I{EǙ\rKPU G`5]86;`Pd"{#=#~r?>;y'Ӛ!Jtd02vI ޒ,*@n}H^ i&lm(xo 娪"oNM"TŊ#=:!˥]#/Ҋ Z7&];a@c+@8##/w~@QI}0|=Cv>{8|H#/PmE!}#/|M=6p0Bpt#4h-E#pLpN2sF7 M qG$!e8(&?#45˅_Eh%#\$(RWl#4 ճcbCD)#=((a\Kv\%!!̇8(1F#4Zq h8x8 qO@"Bm)fR{ s߫<몘Pc5ɶI}a*&tNYOAE*]͏̓BX4d#Yox\51'䤂 D#/;N8~7a։B)W-Hu' )l* “5ǹ!3q0]g*Hn;F:dʼnD]"bz/Bz̛a rc<#R@zt:݆u"H+Y4tjg7\#==C}iaЉ>E1]ljl&sb?MmM2bA ڪ;Nf\DrK!?F\y5#=Ȅ&OCTp+4P!Eml=6i-DMbD5 @d@MP l`n mЩCY>F${UhC5%tGPpČ$^+NTe;9Ds_qwhȐi v^eBiaS~:q[J<4L 0AK`9HIh,J_Hc=9A(UApn=3|_'׳rZLGVnz.brx,b,^WHH"" `4T,#4|04V Pa?;SKo#4ږ'NTNw6xr#4aPդ@@<+fu 5ahå570M:: bGUrR%^ٺ/#4#GrET!#=Iݓc j ө߁u; 5-$:D?K :.TBW`Hv[k<9*jk:+\gAm=E<z> >nQP~,' ?JJzk[u:M "a($GD \T!E硧_pF 4%3hU#|babsCʌ|/t'd#/ AWOoa{ HkP* "iA狋:xx$p~EԤ'SG"aʦ0Oj.HYx"$֥#PVF'kpG;%)`N@!I!4QCBh(҅#eb &V9df$id3ESJ=0vbI" )D@"#/2DQU7 1#=#==e@TcHRS#4pnICM̀PP8'3B w#«8GT"%q3q 1hLPbduD3#='T!ީ#4܃]1&vTIt#}1Ը)N5~#4!f>@pwD\źABJfPAψf`5~_aɄTJO,980T1~ LbL}ten^[5o& m@r}[%C0(cTc8cgh5 wktүʊ#4 (V%V4\eNYWJ 'zɗ&xrT߀%f'aGMG\3d%hNXym;ݞC*Y-}ܶe$uzqDkV6My(OA&?#4#=[QF[=1Ks֡/͟ީa8Qj"#5I¿ͱ(EsD5FGP!Î28u) 1ܚf#4&j-=Q+:5#493JAsZ5A8T#=$#=6UAɉ^c촣C[ozXע巫חyz4t3WH1]4d "ik IN7Iwwrׄ]}RV5܌2 orVc1WZ8d-(ԳD#=He"y@s8d,zi3n5LK(h2!@L3Tѭ,୉7G!>Nyj'U(LnҖ: ,4Օ-=piȹDž9pqګ|ES @4rtN\9Hq^4D5.XmC6 Q3,:1tj62EҌcr#=v15ʹ`!;Dr=Hy+Дb}l'Čg#JJ o'n ׾a̩#46ozXXFB1Q0"4ޛ8 LO+fGu_ko#40*]&Ӭ:A~#4]aL[!fsS; ^9/yPL==3g,-ۮDeέ _#/VtB!@x8&#= m֊ dCgHH y\ rb9. |Q5/&<=#=R'V,#/l5aY̽ Э2(1)jѰi lQ#4 )YSyH;SZΆVNDKbI;51:.@zHM],Ȑ2  єuaM$ͬ럏ׇDaW]jg#]1dɑc;=8s5!HTN_ZW|'C_BGuu#4 z҄|8\##4, ( "#}5Q,1$HME@ J'و[0#=TЎ@2 Ay#4#=5Tb)"l;+AwN2\1&'LIg݋ݭàϕ(*݀wlY~>h$bRƒ{3żƭ#4nj&sm5vM 2j~K?ozZhō>(b? ?ʄXjҥse3ԧqF?mnE!N،MHaCgn_"QZu=FO~>DpAgz1xCL^#skFEm'Ӌ#4G 'sE\7Oo73Ozo^Ƅg*pz#4]ݗl+L(#4KHc٣74c)={%{Bb^#=e =9ܚ8u~{c#ƊH_WJOfj(rK8 Zq_lEZ#=&OR<"֠}{i<,r~sSJ'Ҽ;oFX^!i\|!c ˈ|U%ͲƏڅL,֧6ƍtI8LsTa1+tg7R #=њz*)腮X\ZPgZBC]jͮ;QDW0έb:]DKl嫀X>3$9[tŏ##/2hځxDFF~ϼ Z)À]fBoСP8(vڃ6~9>˺S'Q-ӲM2#/$Nid,LU#=beg#/ra=xpx#/,\-SۆѡH!^U/TB#/B8!}(:`Ԧ2/!c)Ot~_ўuEz i2U׆~mҘ pXV={ !ho,hYe#/z<{:B}h&{VfX`; xG#=Qm뒕&dWï{eU<f- p2Y6LzeF4;Y0P:(=^C&Nt*zyJ#_ڨBUVR #4AQp l/Y{:Úvܒ't$iҺV$iRk׼#/D%)>wUuZ?sQ/><!hq:WUdqX(rY霒:NYŨ$Ji#qau`bxc1\̽C†i>1CeP`pk[9*_8tKJy\M[=X|xIH\Z"j^Y:j&Hjl;<l'/!m:i8E+Kg| Z0['7Λ?z1=ۓz]n5:R<}Q*]zTn#=b="#=n-Y[CB:L:aD_gɧJ#,J)M뇺y~iTfw̛t(w\SXʗ\EZOٙEy ]p;j4s3o71nkVlWw,]Nk7#4"Xt/RY|<#4B'QU❁9ImK(v)ÿ3+$vV(X3 PBitbV96y:# Z!$UKoyP}3zMDv#4ܧƬ=(|l(Dǣu"8B3gn]I0= qla#=`pɍ0mL<]=,PZErl_8:v5h(5hn_[1)iˆ+$|,I`sc8-AqT5jɊwV"Anvo?7 d̸&0&P]\a#3Ah&rM萩;O Pid#+``İJܻ=˛1 v|Ze61;,Mc~8B3&2{E]yQ^zFf蒋¶*mvèC#=Lr=5wQ?ND;Yuy)ʕN>6`?{UvW9' ug{߶;REm$XR LkF\h1GmW{$Cdꣅ`.D6`M{~o"]ymc9205͚IKv!O}LC>"':n](t %,pxu/D9s/na8]c N;$>٦e}&R%Eْ0֒3#4z [B[%cPò[#=ߍ=2- I\(@UoVm*a('JYmb U F#=cf#4 -|BȐaxb*ɇlfˑHa&Ĩ8"X>×Z0nR9GS*m_V\TNRUr[o#=k+1XVS[ڌbGdr5\c<%IbﷻJ]o6cT7Hfh1zB)H^#=; ]AGMMl?\n +]LJD8puψ4.ÒšMz)-ݔd6s#/L$J3\]qR^RרiZׄv&=,]a&`i,5{t+Olv4A"$6baH#NhE&!UP!M=:$לԤmDun@81#=ƇmeON!\LbLɜY Đ>XC𣟤 Q{52HM&]2qYaJq5mnAFj+F{e9=uܙ5/#4\Fh"/VKҔe(OXqN:[p֦#G}e]WDf`'e.͎fSeQTJY2g.V5_+7I vwfgmq;ls5cc.S534\VVc1c7 ^29HtsXv &*c'Yq#Q"ʌa''B|HɌnu$BV3>Z]*31롪t™֎mnMd"P`F嶶\"\\?f Et0PQ$ͩXsni`W^$" M$jjMKH-JʇԻR ͸;lc)>gc'Nݲϣ?nIP YeK2zեD-Ќq'ʣO58 -K_1o*:޷~Wy/m%/Y; @B:fyd+be-#=f9Māw!"%@8>WFnm[t)ugHp`Kv̪,2j41Nnᐴ6ܭCJ:5(w#8aY{J 9]P*=8veLo h#G L%7zwA0yG~EϏٛć 'Q #4֡HO3em s`[%8ɇ]] ,#4Y92(Z&hc4Xۥ#=֤Cxc#/0#4[224ڈ[ xfx.BJ#4I{L0plФ*Z#=JQWJiQiGzP5dGrf2.BtPmmه?Re];ø5fI@К5!Yxα5@{-$89CR4Ӎq.C\8`аj:m#42#4Gh,#4'Xc+}OqxfNGbg*Bv9#/t#thA,ȪF=O:uhY~/h=iSzw1Oq-.I9dPj*Vxz2k#DZM$36Rr:}7#=c@y#=+4Q0`IShj(jpn'6b8(2K ƬDf5䁲?.CP#/Ԉ@pi6aB-j#4C`2:#=Cd3˒T(Vďgc'rIdz/RvHdH₝#2#4N+#DXDJ )ؒL9hT`"pE53J&I,!=ʼHKɆBL01L53#4arXa̘3I,ٮVp2r75 FYU#81 \%ʦ $r,`:m SrN jz=㐩f֮iw7yXpĂ3TNc W#݌K#/D4@T̂R0&D LpfP6[1^K#==C3#4p=@R@CÚʰ): LN>ʝ$#/MS¼{>#/P1 Hԝ CE11(Pwg>*O#f"IQ냺S)ζևn)mӦhRSܔ~t~9Bm8bbƌaX- iN#4 ^9!;~#4Xd##/Au݂#/D#4M/Mgo~$= .(^>N=POimwq,&[r<[T#= n;P͓/(y;+(ZGCwQ"fTˆ;^P,9k)w4bT3 f`B]Ï75C!mr$?ztΗfrJ*<ɒA{ƢY8t]39M7A'%q!Zvck/],k{;SR%62bZ|ÐaӜ6^|5,2a3}12</YIӞ׬.!!eN)Flκjtp3sBL*,;y%v2}cy>ӃHx\PKn/2ն֣dΩPkzyUv{9]Ft<]P#4Wu]{谡\){y%%(I 4&6we:; &{(R!_^Jżx~7w:s' ]b58mkزg:C-.A9CK޻|I6D*7NӋsE (}ԤO#KVϡ(ZcLXs|9zsQ" +>dl+jM:y"6-յ"Mk.\fCڶa𹶂 nm Ruˑgk aU"9]{5d=L0\c8UG==$@M^B+*X]Dne@yU: vrB5cC>e&%Ihv9eYvH6*Hgœ` lw[1 HAq*(n:GXDm2=6S=xZ::1S1C3ѕtH gQ}@cH]#/7v*#/R'*#/CuC#Ƭ`)`4l:ZAA@{vُ8bPb#Rc4׭#4$CT478;Es˾M#4Tke{k^2h\2#4zL(QA#H7@V8fib6d"]Y#4@rP\)AaPACF*RG,}gw0D_Phͧ5GhLHVCPq8q~Ћx]aO#=#=A(hs#/T:1#/Y(<@}*<'Px#=tiI$v~=}-S&w93~0zX??BR/պL|v:lYNB]hT긷'F٥0:ރ¤њ⣌+ a3Dy]&|\e;Xglg#d <Ď+@f9'ygNTuV#=-P']QpEi4n،-;#4~\s2 Nbi0*kFCFf7ܨkGYi#=d#4R![h snf1aBpmtڭ%'S.Z*0\%H"úK}u3fE^~/}d 8Car[(;  "3wW~vD0nRdGn/BҨLy `ScmC<E* TLiH#tY#= a6n(V@..X:C#Iu#=bH0Rh1#4I]0Fv!b '}aHb^8cxYq<2b1G:QV1ʊ"4%nENHc}\qa暔>3<a2-q7:YGhg:d_PYxv㼷\r_N0ds0jCˈ#My]7g>RiмQ\=Q 8A`N͡>H5e[KdӘMQv2`=m,!4s/0ط*.u孓#=w"QT#n jrK18SNP95ur1D߼=`k?'B1P3#ݩШB&ñH:7$Oʠ>QC;^Z;\(҉0 0#/xʯ$R PI:`0Xgࣄ*h^d1sa(ly7ۼN#4<-)pt#= ÐcIA#/}\1ՂFkA>#4zsbrI0hm#hh{WyFnS2$@GBzˮٔ 2C5If1GSl#&tŖ4ꩂAJSC :%DQN+ptOy*b#/vJ#/)l qCW0O6]?Q/t??޸^0#/2QIKQDDEJH5LB#0 C.F2? Td|GQ2,J`j+3"?8OIz -0[RC#/8~h qي!na#4QC8xA?fw̬V8t/Ru1)#4pd}צ5T>[?5x>akZAYC#= s#/hKd\BP_"#/B)PFdx"*Kx 9<@FF~ ̜{SEe8.#=eHGb⃨SKl@Np "c \:i=l Idc9ҀL#/a5AӆyXqhҠzń(#mf6|PII )/w'LRPb9B4fXv\ p]$"e'6q5TT%-=Q0E#=ѨUF6JLP@("[0!MD}6SҙW{pC#=51)$abi~ϳc)4r]ʣ-d(#=PaՅo*\LAÜčn {i@!~tmHވ(3#/M3Gv* h^|dd OFuACIAE#$JJL1!$tM#4"EE쀘Z#/ I~78HEtAzuHGA v ؐHW$.|dLJ,P44PD4$#*J`hR$#= ) uPSSUU#4$ HD@$PRL$DDR A5@E1-I3KI0LU$QL4BİBDD1IPDĄQMRP#4L4ADA C24AHDP$S"R T0TM#4D0DA1L@C(RHR#=J2LDP*C#/D%$D #/T a"8HXT!)FePCH<`F#/B"@(J]Dx͇7=3r"|]\hL=~ yur3`эg Nˬ(k#/Hߧ0dIϕ?<v#V7%ʉ8щ5HQbhfha6Zb*v24-UT)UEEUj#=Bj>E^&X AV0?JPfJTQދ_({$I{ ` };;X~*UF#/"fe;bX%&|R5.2G#=g볍D ,;td^'wS>9#4܎s:*Hp13%I)$/ #4)A\ y2D@e+a2E<ƚx(ػטygM84&BPR-,/d*Z(d-%hsb";Q)SYkuaK)ɆTkDm|;6Q1sB\7@c] cDpl0w#=I@GWv Y-1VؓBgGzFK#yPJfؘd R@4Bpa#4C܁ZNTqSҚFݾo{,Cd:!I03d TaMxHuPry{ CN8d\&ubJ4}+:aEf t` ԼԮ9URt$$sDiqMJJOA5QCCp9d`TgPѡ۱;lV#4], :u$#4պ5MqwSNղ,8toQzdnPi~"#=hg( w2L,<(*r1Djx&a~OWMa#=c"PH Ctܭ%wyb#=dZ",#/Xb5ЍGx̓ rN<{}x{X=(y}{Cv2_dcd@j ?bSs-(DChvMHؐd7BIuf`Y!](]wJ*mkeKWNbdB%zW7&9X;Hk@۫yNGVSSUcNJ8=lv`13;j Fg|>>~r؞ڛ>ǜwT@f#91 F4 ANA>1C"޾򫲡FHʼn+C=W{ez䷪Cv^(eh! !1Lu<9|=K096#2ߥóZN|t]tE ZcImsq&߈&&Ѣa$h*Fclhc#4nKO3݂IFPceO-5hhJ{PDNq!r10dɐ=M(U"948"H (VIJJD4m!KP+'~'l.}ݺׂy?o$x> OEL§F#/p>;EPhAW+cwd9&)BŃ0ҩM?kAه7ń8(K@@ 'Ξ|]d夶M#4Z-/DUXmjO?VG0ECS,'Dseh-hHuΖȋ5GDdimQAs(䇜#4mL-.AL_n}[IY%KO+#=PPE#4TKDHT@h#=` d%)`iL(JJD Dc@PA/`äy!#=s(R;2}8#/";+}]hC1(|g,aW#4ѥ 45dle؇Jm$UQP)B9EHgnE\Cp˵?p@DPMUFp74L?oO%N!ʡy8sn)yȧDNj(a1TMsjjH#=J&f*`V#=h*%uzٹ?Bp9!h@#/`;5TӵWj<#/f#44Hj= #-#2Q#4aD"#4` Dz0X57}Bgs_!5bQ⽾%t* doغsKQ/:jHPɇ؇3 l~z|4}g!gfpX]{ j7@p*]ѻ[v1PnKBt%'FI>l=6vPdI#4#/Ł!_9{aLECLü ya򧴀SMifH~\H+H T#4  CQrTV @f@# >3QrPJ@"PTv`S@hրZmIo/D.A\CoSOprrRz|E8M! DToNE1bQPyn1W#+c^BWb+aww!|8pO'sj]$H!!GPy""4ĕ~8xz$F,Ž~l>5B5ZjN5DXS?4hMuIP@upAHwL,t|b DwLO0Z#/}AՁ#4ȃ3Azz~Kouz=7~sA3(}#/R=x)FG֤aXC;~X8[{')d%Q%q زBt =ȟ'EGy5i55V#x+4&0R(Ӑ,tE<^>B_-s}1nV#=f<`+'=Ip,4,b#40Wp#AĀg!G_?d':\MQ5(59cg[#/1lsoBnaO 9=F51#J0]ZX0GHcY<,bGqS4E;pK 6pDV]^i ZL:G|m!(i+8chk0vN G}F4zK$"rGr֢#{%y#%pPF{;Ɗ#=Ye.z8MD^7Wۼŷ̥s݊bhNm6rO%+`(i#=";&zuRWsӆ'"!b(T=ɡ#=lˇσ4plm5N97 dFUK<;̿)|:O5avkݙM{]vH<~c㫺f("[@2 rWaUrA!Im_ x:˔I*"mD D 0Q2#/D(=qeK&޽#/qzʃ@E_ !,`'!ͳ>4?,Qk~?/eI Gg`\P e qC$9'C`C;KR&1IpzƖozq;yI)/=>li5z)NA5u7B@)~:`P*$V!J!BdaD40+@-(#=U߀% i]`SLcBWTִ0$KB4^B#/bR`p}NlXR?5Ad3#/J\HGl u.KD)B4#mlkNp-:J R-MJfu{<#4TXB;N?+#/V衁9ϼP #=%U~~Tt ;'Ui #/U#= CPvkχn~<un{F{,rJ!5z%ؚQ&Y-Hbb %B=ro9ğ5[MN:4S2'D:6~7=]h<\©u@{L26>76$[P9<@E8*j& R}ZblI@$BAshhh$'9{F2b"* `-*fN׉6 RcpRԀ _!yktkB|J#/mfk#4x'@$O#C /h_<8,mJW &a0[o 3/YRgPcWr'TmL>4aQ~v#4w2\ '-ɇqN#=|G(`t2[AarNu3:##4#=#4#p˷;#=fn;9$x_41A(!Ec,f =(&s؂4kW#;hx+Izn<3\*\L▕栧WPG3v#4.xwsnv)X[>RqS.k<uIg᜜Lw(y!"N)U!D+FHowltv*iAN@U! RP|iʋ'b`aUT~yrv4: (8ȊD A3!^ޱp]1lÐij YyHOt30Ya^b~ueyyG?qLo~^PۻG#4jgB?=ni0:>3!= pd88b8:-N*4E%dz6,LA 5ء!"YlR$D'3Т)Ð13ȡ¦tv9`bڄƂ^C(@"OVonL%ttaD}r#/ iUфA;a!*9sICCjjn #4˚z uals,̞H/~y]L J%#4(&|}r< 3: _H/R @RDMHSM-PLQ)RP@R!44#/ATE4#UDKKSM#4 DLDHU K #44S2R4+BRUP!@SIKE4-%2TADTPRJM$|DQM T RBB@IT@UU DT2$A$P4RD$-EB%CJ!(B,"%E$LQ-SP Q0#4E13AT2RI4 RUC#=DQAD5R$*@HP@? ӕM1+.Dc?<;sߔkp#/y(=ЊR_, S#/Ah@1*Bv8Pv~; uWL)HPxyJ&!H>?VD{{}#=kI$EiMR)0AizQ-DħL "#=#=h!imĥ!4AECJU/#JQ"/q85)T2ELMA%{6E+IHIyp ߋ&~v/&hfOvyCAcagŲ"R#G #fpsN0Ljt#=,LsH>#=HB#=r'x/YΆ;#4"/`^߽hFFe)( "#=)"#=)JQ#=#/"M GP 9+9:C' R~I-G4珵kCa:C v9;Ԛg5OĜזoj̛3 L]8iTxYG #=N6 8;"K$- tC,7ٔuv$hUd8R 1&>֊Թ%caJ0Ău֒Cs8&jR#=HD6#/ɰJ#/=-`H5EP_/1ʘ$yiIȎd % pGP@=^i1>9@,U>y|=fJ}r)b1pT#=s>(#/[1i _c-M|<ȃi,1p*z:4~3~D)GL`m4eA(ybp9<hvDEL--e\0H2dG%0<򞟠?a53j10H1PJf柧\Xq%mPTAk8UQE!BUVaic4YĠTq"zCOC)AE5(B& 4JHBE(DAT2A!BLSUTHTJDOu"}cMܲli#E4TG\`Q(-AV$dˌlf#=cURw:g&_›j*j%$_}K2CmzM/gGŒh-wf%յ!Jzƃf<!eR#oaqeDr{.XoZ#MK{Z˭SC%#=pܳI$#4Q`hZu4q!4:urp'#)(ox]LK~%Pqh,1T[( M ]8,L8C#=Tq@YuNO^=Z&<| ihiIOڛySrji ?>yb !}*ŝ׌oB]Д(A7RD.r= ny?>9f#4l~ȥ'!9'uDgE{!t9R9v#=FǪnzz|#B(ѪMR2-R& 1/|!ɤ9#/P,fy̟LX'ĎrnLA3Mp15t0tɢq10CSN!$}ىJ"0 ]`g [X,a6ɂɧq vsuo+SW"h;'qpxqE8#=r6+S6'>#/;\D#47HcMG=k Nc%4!*\'\);ܠY5qbnWn]XGōqFbUA#=# hT.5#ۉq-45dEv*ű$jԏ|gGۤ;O峝?}m8b/fGq{1FcJ.W{e(2n 1Ct\Rhly|諡j[\4Ŏ*&8Ц3g^l%2 T#4 c<[6|pp;C4ˤŪ$A!4A'4i35@+`!1%Q< *fnF6~LWiy&uASUj~H/q#=#/w V x]0z. K!Ƞ%0 $b]""$qA1/_:A!N L~,p;JII #&({CDZ"$xiM=TJS8UNHi|>69pzס{Sĕ]Auy>T(J"$J, ñݞ=; ÔѣDzj.Ζ+sp7BZ `#=F  tȚ"z}Хr>J}WHvJY{,OiwAAIOv=k:SI>(g < H6Jn:A,7 Z#4#/R!;. {滜#/ P4]K *[%TEH$#/>L8-%%DH)JT`!h#/"Q"Vj$&@#/faX4s{J*UL?É 4P@xBZ%M#=iJ?w<3Ӧ~-E߽#R b$Ֆҍ \XM!VF#P!XTR%F _6N^BѶ6ڎg&+6a =+F#4t9`keZNpZ!ps3L8`Ď;4pvq+do h1U7.fLccYbM-%ミ0䨝30xp߇s1l{m9\cKQ͐Dc$)@ĿI.r]Pn1v#=ǒ5+h"]s!ذ%3%#/kk|]`vz.(F+#=GIuv9v;\B)`G9#=֪4%9!L 3A#=x2> WY=3gso$D?%a;#=w<0=ϱ3S_bTL.-}EPO#4͎k E6,+ _ǿ-6}#4ˇH;Q,NM1C|IԁIY؀;h@]xBއPCn=ʺPog#/l"~8hG{Cip2COӌg`uHTAA3ٷ1"83 q>~+o8?PX~gfuӒso-C%hld^ w* DSwVط#=0KqUi[Sbu_Dxi㙉t NpPh0`;'H׹!} */`*`OQqo-)ǐ $0zj,8_yf IO9g#4eɸ!>^Uaebz8 |0z_|\]ʨ؁GEt䉝1)L:6O%#=:Nl!jB9%G_Džx?ƚ8#/" <~}ƣuR`;ℒĩ|GCPz2衊0LKCsSj%lᓁ3$#dMЫ') fAb(J00-,ll 2` 9OTȦq'VE 想K#lmuyTV"X'6" 2"#>zZNӿhw}eZL7jj~\T8d1 򯕄#4IܡTy:wl:WϝRppK0?`lqTܔm>)=X@#=#= 0#/9.'| {9'L(_ȦhJI\ASh&pP`>Ivy( 6Ӑxꟊ8!u0O! 1뱈O#4jlԭc@7g?<-40W,@U7#4^CZ)<cEj$Nupa"p\aCU&St`̈8'U?J"&BƛbO{oJpq o\J>nz&WɃڞK&~ϟz7#/$D ;U : @#=vނu8k%j|z;qad%wټI!E'0s1D#=Srۓ3Ί };G+Hk3*3gdNAl;_dt2EPoikxL{Vyw#4D)aWPbUUh_ Nv8~( 2bw` AҔ iO+2Z"#4X z@E'Qޘ?O-h2͂La5$\QAͩQ d#=W5JI*r G{?#=+ @bގq_#4$>B3@#yrQRy%&#=4 JDAz᝟UT̺۩d‘SU#/6,w?oƿ1~L)#fH:X)\#4Y=R`4$^\yjrQTD MN0tg]X$аeX>347ĻV-Mjz#/٬P!Ō!ӂk#/]ssLATOu0`sYȱ6@8r/|rpBhCbl |tGRz#=uNfh ǯP;*X1h^A &0#=p3Ǐ{ًZY0~긓*wv9w?en.z6La=#4##ZǀpTan?EIMi&@O'af!/]H>N g$z~HP)HQ;+>h &:x`t)¢i\\#4vx;n;znwln#/u :HsKL>h+Ьhy7¡5:eEH~~8h@pHY+T[L'ǧ~kNRW{(C#/ ~d=} dDĠ~i J]Ί#4<7t"quj- @4(P:#4(ʓN#6"#4nKHi)3W)]4"M AJ(P Z@Ҡͦ#= ZV iV0 TP1'4B[\7#4NJthJcM/5E"e-+`#4w>HuXܳǔ4P[9Ah#/MPmzgAF@ ) h6!ȟ(s`םAbW]ͳ!Y$݁(Ԝh)#4A#!風늏M4$B%(Dp)AE8NudBj}FnRYPQx4BI!fBJ#=#4@+'"cfx#47#4kHZDEj!P|Cg?O}53ėKq_#F9mݰ3O!׼v4. 쓞(~ Lɡh9ßkԥ 9qRhM(Xn~ŷ_ 3ɆSLD·Jwbgc˚6DntO0;2 S#=dU^r#/笢iNZ|^#=~Xk_~zЀ>Yߗp/),"} ۻ@=ۜB^h`S9clbט:{ SN+yw#=hi]ߵ20msc:KDmޘXwKF`IX1e$T4ڠe((ilm#=)W=nʢ.?qg:A-0˃Ud! K3A(F(hSDlFy.R0l-%iM0x{)X"H1LK:0dt9!GԦIp)jR2ZKf bG3IH +ͬT}f=#45%Ũ˲G#4?4(Gs#w(N܇^#40mQoVaN=)F<%VZRZ{H>:s8ƙ@驈N١d($ǰo$PLAV0ĭ!$ʨƚ@9Y d ^J#=qc6zM 0IטThPUw;eHA0mn%G"0^sc=d;Sv7*4v"`Wj#pqŁ.TZ3nHP_#=4qm7JU#=D=xMD(DY啙5}j`_f#4FtEI䆣NŔlBW9!zSOhI{;DA!yDŽ#=Wk.c$00:2dec"66Q(jbN,H8,Hކ$uz@&dp9NJj@#48{0p<f,X;B#4dK+1PfW@ 1eh&` V *`""RZ&()R,<:$Sz):CM45Hs2 #4ƬK`"qD69k,6g㎘c[JQӘyp]Tp+ 1' TMYqsF'TijsuT,SvGv[!q*HY "|"q͢ h*ۛ']}%+tpj8\9!Q`9ktmCr&]ߺaGl|XdhǶ܏>2jgG~h<di8[8le΋*Q:KWLw*b5Á,q#4+rlU!Fzⶌ#=D#Oc4:]ULV7sÀ`Üa +u8yxIT3T#=d#/EB#3z_iG3@%#4pO9;*hSD3wA"'"8~mHOgCf)]>(f8ȸ~SV_<=Q{jFcm_-WLgLXTְmPm=8(l [4zy]?IDtaBvT[º4**m#{\a쾡4!wMA[b5%9zUߗdBog e8 8 BB1 BAp0D2&&E?A,GOά{n9QAjZҧJv*BzN;em_FŤ#4i ˄Ѣ" hYOiQP4j~lP@ŵË)f{^tQ~r(etgM+713gKhcKza#/i֮r~xEրzx8yMsþҽ +ʃ#=K4*΢vZHR%ޱ\o#4Gޓ2a%QonAoz̷fǫr&` ]\)\G5o>q9!Im#4ej*szN` U]96͌XFǓ{Q`k#=E*WwtiVvj*,bW# bcoqm9Co ¬o~z@Ɣ"Xw49$w`y@'R|#ʀ* )*vW>xhj4MF66#=K c 9ޗKb(#/bX3N'NlRCn=T-QtT#4 BJ(4}7ЪޠVHyM@#/1ɣ+SLN<6QFJxhHvZDlSS$I#46-$,qᱹ͹8CCˌ h0#/2S9!@qV-[*9<$s#/Pt:F)#Fh1*Ib&0O,*Z:HU LKIC3KlB0$NJ%JBhC#/`|\R (M*#=XnO5nT8i@Y#"#D RZ#Fc#/R&vŸYe :}Ÿp&#=EZDhafCD$8~tJ=#=!RCH&mc񈦁$)bTb.?lhWӴ_,\:NuOP`3L]HAR_ #/냁"@A3ONt#_*- J IA%1#/CMQ)DĀDуPqewLJ4iQ!#=#49 #Ryj B:T7q\v=/#Kw{[|f4msh[\t#dRtC{4fT02`~XHA$#=&Or%5ñ'˜9@1Op Ayk*I^J`J`-hmV:+Sh2(:Ctf:0|BՓl%"V ϹUDE#4L&Zr/1\5&hh2ixRɆ.-#=E9EIOMu@Ol(zzZٍm:FH۾Wkۭtc8zԆhcr6٣cXr#4pHiظ5{A#4c27 HRdfr#4JF"uZ+U4jYH&TQGzP244=9#=4^VbJ&#%گ rm2]{zh7rD+?<'#=HT}z9 (+p3#4il*ŅshQ9IC:BtQLEC "hB$#/)&@6O*;)U?W"Phh$EQ#4-4zù#4i>m@6Xbx'cَQҩ}qO }M#4+V,QDkqAŒ0Re0d/9KBatݚPdN+4DIlMY4m[va1hm286Lf [I*` y dIQ#/%A FiQ(JGgxZIAEiM&ձtsr%۰pns%& A1!4)L2s';$5ځ#=r78#/R !!{2:ͮ{KE!X#J҃Ҡ;sƪ4 :J&(a*GC w4D }R*%Ѕ#=iӧ#=2s#/A/$CApWߌQv~6`#=a+#/(AEGCɟq~ހ?h8W#/xc!9DX44ҥ&Yd7Oz8Bjq#=4[v1K8na=}+AP;HPXJ(fj ZwSED70]\-u}ߤ1(1MZ|n,olB*3U#/%3YOx()Y7O)lH(4TdRՁգVj>Gl#4'$:]#4IdO*uV dR@՚)mӱX#/ߙgz:Dtҧ%) |Ȼ jP")7zPD-Sc_w QTQK͍Gat"@d0$il#4[7kl 垞U@@4#@4UpyX0Miܰ( #=:8oTdt v#4vɭZQ QJYZE;ȼBwuT:nmֻ0P6-1v^Ra# w]X"!%Ou6[c#/Iyc_#4t`'Ln{B4#4#DQa!j4INT.6VIT1YRX4é?Dǁr#4U &g~ .Bk#4dXhXxwb$UdI+!eH껪_s{|_ݜ6}ksq?ΆH`7,YV':%;N)LYJ:6%Qi1*<QC @ N{~ei@"#^`*д21{t.%B쯬80#4pw IODF!#=AiQJQ:Ud$(*i $H("FF(% f hYQQ9f ,y꯯bfs  ~]gpa~f[jsNP*b)LJDl(xՁ#/ 0ҊL#=DE0n#/pTԗM;y_&^z{A)Ti聨ޭA(ߎ2B!:# yü.`2vX(rzFf!`~Dh*!"#4cG@Ԧ@<.{;tj$#/ִPd ti,BE#ЩetzCfc#=#/Љ@>$z]Λ1ɓ.zJ)C ZD"( P]>(UM YYhQTZ2qL" I@ e8zT"q4eh;0P}YY4@|Ԙ uf˟#=DY{.T!#=f9TL̇,NTRcY44?򶟝ۘVZ-eKbO0JN1IO?/<ʔq=$ @dNhL)$i6!n,t;=/R*EQ!Oˊ)L#2T,#/o!ABWFID>4UO @JD '@rC !&^&Tyb+EM$wk>:eIUM"Jp:CRFZ*I.#/F*#F0H(ѪXj JHdzZTܜ$ĚCGƸ6DҜ(~ϓXP!0 M4!Mmއ0%&QW:iY}XkI6{ Ȕ|s%)Rީm95YYƸ¨ȤD&6ڢ,:xVh=#=d0 Ad(T}EP=E }y.P`?dB ƻ\%lj#4t!jnY,n4h@P뗉Ȓh1pChr1!@5@l4&8IPw:CLY&Q1 P5 .ς#ٙSNiZbEa#44>к"}i0@sƊ8xebmSє@@z|Ƌ=1"5Jw/ό,Q0,qO~11rI3#4ms` ^sC=XFғ2)2.6ǦɖtXJ߫6X83SZSV@%A4ʊhUW[ƮTIa}#/9Yͩp)Ke8"XpᓗӉ=Ý&dlL Ҏ50h_-tEQ7|ͬ`v{7hnNF9rQ- j#4mZciiDR'j^G Y /3Pp#e7EcLoy3z2E#%?XC7v\J#4`h`'ѻ{8|:#/aQQT;#==54,3ƕG>YHDڮg%qG~RNݑ,7=J0#Ϧ_c>/#4ƨ;4P?!3"#4V$ϳ`Ã+iyȌiݣ<(Қy+o9_c2z۔[J|^3kzf7Y~I/)4R3E[NzِW#49ɠVR9)(-3BUaÏ;/z *dH37)(N{c*I#=ABH"$D+AV7g]efkGv|QXI}1a I;F#4m#xJ`IXwZ/"f3'of6\5`.Y5*կ[1e֭ڡYS'Y#/Tcr?-a\@#ѐ]RHL$i P=B,}J{:c#QӅ~XA5R2ABRC `R"NXVz[e]7=<[O\^uONaA&3rM@.JpwxF38'˖B4k>#4WzCOl}@G ;R67KOw}Jx|C5@PQ3$&ll( $Acԝ<g/aAqmz"49)pRSz~&pJ#40 E"`hSH4"*e)jO_+ϻɦGğjB@GC%||gk}!?^(ux:Oz')JHy"BH20!T~H4!'kdBPۏZ4j 5@#%{?)C? ] ;O)PC`;|=}L倕Pq%[(0Te`#15SfX[ݑ`TbM?(ƧyAȜMLB HeHdA{#42>@i< /s-Z__(ŗ4Z`1M>j#/2sp?g881Es|M|hPX8rH Be*uDpw,%d#/&qTDn+j#/W=K+f.&Dٜls|U2RN#4h4r Ќ Kw :laBO)ld2cE1 lN-XQv9^u`Gr;5ЩdƄ󴌗}Oh 丞R)rBua@!AF K)#VOJ؀DnJ@dAT\>7rAזIVwՐÑHstXXPQ({zUR<_wmBH!(4`;V-4cb- m2d%BLqjfuA>?&&#=w}>ҰÝPFߍ* YƸֿ =̬tRuCfE|`6Hrc4#/u4 +0qSٷݥp!"g W\rO$ZDv #/`s&J!#?!أta@pє3|d,;Br_-]7pi5D]%0Si4t 4nI͐)U%aI%%!B`<#4PzFU-O4$8s]A}_1y0хrIR}lvރCR%kA`}3a'&?\'laݩT:ѦU>`U;=Yi Lń{dL4kL1qHc-ezZF`q0 fF#4{p8t1yj#4]$.fFMvX)T@#=2J2ӝăɪ1[bt,ю+ M,#)R2јAAC@oUbMAk ! m GFE8XD&ȵAAa7eLFCW(4DAFC!6>ff˓uT:`pg [p`A;ӎ; #=HVI$#=O4ƭLX<(xз dbkytpPt~QnBPR0(pbB7cV.l BAw[:smX։y4ٌhl+y/#=Ƽ I4#/Qn@bU>#ٜǐyr{ALF4v]9jSU #=TBB9BZGICEϳ9!8E E8q5T<0㸍fΪC?O|^SMr#/S&REUB;ci'͏ɪ@=F}Ni%H 9#=Fj95ˊMQAOv`((*HQ#4HIQA`*f(`>$5QߖA1#4vܺsC»:=II$ a'@Ќκk;5bn!#/VicIr'+Gλcj*/#4ͺE1 積hveH#<70c7ahІ'7FAMgmh/MGIJCAЦzz:py]4%0ZS'$h")'U"|<\3T\VL6?8rrWO:b'e6B =ρNJiTX( bƱs)!372Em%)#VX9y<8+Ucg gE/--X,%wC(V#=j:URL#4/ :xOmInٽ#31d(ȚԘ#4"iJ>,cf]75#4;1Q٢^f,';x5mgMć`o)UiEbnr1!&.#=7cm ܽ9hWMGN\=!/12zkILJf+<\"똰#!Ʈ#4-;BWe3qϞبpcI #=GxH2#e#&k`QHQɁXh@\GtR3 'DXdj#4bcb[@dEdU#=L64$`F͏3zFM1P&j<~ 6Pk0#4q0kHJVo[!hzN.B|-KT'|ʖ˃'[({it3'y9#8c d1 {'YC)=[$MjcfO]\>?>Jp. .NLȫTGX2#/:I"lh65BT1NpLhD(SFR>[Ȇ5r=D=LywʋSCH2  FDD"8xd=`8N*8zB u[ 55Vt 26"e=;ApSjM@tT~OTXCA[TE.n%7pbƢ颶m+{z{#/bQRJZH #=#/(Z@`eX#= "dd"#/{:R4B@UHAG$?F)O,4;:)"Q0/5~ok2whz?n@CXB#=Z hh6Ƃ` B|RLT¥L$Jn#d@]]+ 'MM_ʲ{ (p¾_Z#`DRi&D"TJT#=$f@$#=8֐ճN[h?ez3b[\L> .pSnFe* j/2j$`2#=(-]iG.t` neFA=@ h(k XDK3TunCFhM@=~{?߯ U\ATQ'#/HvWGcY0'wVh31##/qb!oqןCEL7hgѢPd='L^IL;|:']#=RO0Zb(yW|}64 FEYNBP! q3}7#/ʜ:#T$؂1TqU!8Bq4W!dSHum5W2h+T(4,G_jwZD:ok0@u.kkr5}H7t=]˒!o)'ʥ#4z8%*o'`{wmHP-HX}4%ͪ!L}~:#/쮐i.B1)@M4A|Cs#H:{W.mQ A6E."rivҺ#/:@p8/#s*%9RikI1)CBbґ#=iXF3 whM|{L!B(g!.yG/QIrO{0A#4-#/J!:|OHh`=!̗59'H1) A@, !Tu8##/)%Ӄ:dE1M<}Vf}9G,D^6@U墴$SIM!4^5q#/ޢ™JJ`8/f~ou"D%銶vUf6h}oq) XPH%0̼5,VԿ[ #/P.hs$'ݹ#4'pV#4@NאG="V!nP"R&A#/#=H rQM#=ҠR&Z$`h"tGdu N;#=I4R$z#=I4H{DF)IiDZB!HQPbV&#/hhFQFQx"lQznZT(y}_b[?0|ϭe7g~}v0? ,~XoT8|=D2 #/x/o68pQ #=Д, Mm/eTH#423w>}}F֓#/` %6]rq0e "hHbHJHJ"#=P &"#/ @hZ#/J ij HB" F#=^O71n89mjRÍ#4r8Fy#NG%MUP:$ ݳ''wh#=9vLM cErqIjNMYH8QֈB8R9F_>g^rW鹌ry袙-^'I #=faI@ir"q6k ByB(2RH'#4l-hJy1,LۅᗐoBZ)8?FLfvIp8I& K䆱+LSc $lö֊vtpp$>xSڣARԐEADmpVw6 6wcEm9$"J8sus&5ΎhL= P5L\,E1LQ3DCBRR!S$F)cxK;!TK%ߩ%: }|s2Y2n?9eYR 3!yv޷"=?A5iw&*1}Q",tpkI̚y!!&êxj:WNLg&P=#2~9ZSӔ:8I2m=pY]:Ր"i3aDHKSШUw{f*rL?FDmm.M8y5.#r$uE5cn˜E5-dQqEid޾7QO#={#4VJy2J_U?ұ ]q1rPAwUXԃu[Q5B_vLfZR=N n>]mbRz&;MG=y2BǂV_LqɌvQEˇH5)W:l(#=XB{I(N1V;:8nz9JOw3?=~祮saB{Tʫ?̳Y)8s)q1\#=F}7-8 0=iו$cYeWF" ggwn,̦-N) "Eݽ/❎(;rZ~۸SYzds򙲯F>[)v*{QqnI#=AwF!5־-GU 1_qciw:YC)[ s14e!R*75S{;UGZ#&s#>z0 },$Ҋ#/9_vj_kgHzqm"N.-xQ2Nb9g&6)}3.p%wD] r&ݛ΄BVm&ڠn\ۘæ܀Y4ebf=j]6.T.C2TbԨx 1{ՉT88;JXxfnHkSscpקS%ҁ&T:xCWs8Qs <7KKCW}aT#{D1o0;s߇ !AC#0{zMw4vE˽-t=h})VQJ]cRDmwo'mR6?ZMzH_䱦{:*2\bŎ14bI[!#8~R;5Nq2srMs\I<$7YW1(H}#{14,kUKl2w]6dˁ7]M)}%ju9L+.Jx3ӻ׻ԋIW*$/! s&PhBNbbTNw#=Zp]38S#ʭyq1)ӹ$:Bhh#}øeBb}1A"l~2udu-I5s5~޸}"P/i[{7MC[x̨K!xgV0a ˤ4)vTLmda6ӯ 6%x~ޣVvQ|'iҧJQiB#qOL1J#4c?h'mJpxMAgD$xH$q2|.5:sa3Y<&^#=M&l=5F7][(OCx\&{&;8i·&T=û>N+^ix3a)S QC&%?/=YVtx ҕ5VrvєY<㷬3*%Tdʋ-DŽ?pՄ{_V(#=LPef6!B.}-Lu`~&JxP52q<-=]&U+1T?zRW(}L<pD_$^FY5#fdjY]e4RQ=xiQsWtKFwdkWoOpW4H|8S#=+Bn㊊qIb26[]]Rn^;+8xekM"D@)G};2&b1,q:n(%oL{lɻ#Dq֎dZDnolm8UJiΙuqf?zW^S7o3}asVq>Vlߒ;M]moee#iSr'JcNptw;ZCIӶ}_oKep<%AM㍞xǯQAALޙ#cS;& afPi.f#4\q:mZrЂGHGAvr^KvUG3k/BlvUJ:n5aqljr/ <&`;b{HOiu˲MXoc2$O类T򍾷#br#$AfbI/;UmpCsp.{Q={ADyRX֖;%"OIFA5yĞ5,vÃ[bi- 3l~:QTvvfͷ͖Q&ٌ*kh4GYr :nY7˳e7>ҚP!B5#4H%̘uVJ%ODLo=;Sf(>Ǯ&;D$΅Nvîm'9gc{axUW'sR9^#L~L:_:u7Zn,PA"3Fu㥼,nBFp`.-6HˡJ1ZWx6s~So8, e,×(t,ן{t!s?b91lsCK%ץTgϯێyJcem ۄ,U5Wލa3dZ^n@-(6av4؏e1I'I:k݄oWʘ|ruD0S0RNY` ^^r%ED|Vn'Yr}&ʂ7'hϋuM#=)bTVU>#=‚A1:<_k%[PߥFsө-);yvd?C3wT"kڹ9 BdV|irXZ$K/eJ#4Wg6b:U>S?#4)͐8vdh8#Pui*9*p_-賀uy,cmRz=]UuְGR>g!IsgE{#/ 8aHP%UTQՎZJ" 0߮pWƼXYV+$$PI^N)9yBwmRF^fD\{D䩡B4R#JtM(l"#4A*Nxc"\^ q8G! A`dw_.&d-dd4:_|ۧ/`wCűcKNgFޓd#=5Q6TT#4 Dt4PQ-**R#=P*%#/rtvI|aܞsC\ icT7l=ն0.ƒyArjX=G!b#1ә"%J;%\5Q!NP}5Q1c#*O)lIvM8tQMDӻM?"#4 ̣#41DO@y~fEAKW2q$CsBa')]R"pt((p9!A$(D cn#/w`H `:3LѢ'cnB~]`6ykA9}gr7,ƍ͹F!h6J_ܼz+#/ۆxpi>X#4%pEQ#=.ޤYdF؛fUJ r= чc@"MI[QF=s[NAIX_i)Hh'{cGa=Ww-Wϊ< yc=ts`tz _:_%ԥUQIVt(]P@T&&{[o@QJBE !%SP]9q7#=6۲.%0[a"i#=j.H&uD\LѦ,ES #4B)|:E'?g?]#=&f?0gKKzJDESE!LSPEAQD $@B"3(ЀЕUU$SDT! 5*I,- T$T"$2#A!AM50QMQ1A-$4RIUM%ERJQKEE4HULE@C4CԂ;2<Q_?F!/?B>H? 7h9>d9I2mN&s*{1owֶ$C RNػ#4P < *q'&I8Gkw2 P?;>>MDAc=u*ԚP4Ӧu@a|1 ,1 Q Š)cw=5oYl@zğ}8x0Jb^Q3Y$(\_\`EmPjf񟆩C|!˥0Y2L5z}g =BS&A;켃`b"(4>|.5#=1t!y>7"?[)OL>Ag*H=60(^ϸPPL)0E $Hģl,dڈ)%#/"ԘؕLT&5Б*PS#JT4LAM4P4ВE1!IAMZ)))0*iD?xa*4C14DT#t׾hڙ*b#=[#8 󂰰hf(}&Nj)-lu+4&7y;{ǥNM#KDRcM|"WLsv#4A{tOmnv#=E`ŴTG&XjyXOY i0ƾ!Us7/W(OޯbitO%#D0Vh~88E}#=% #=T(.lxŗiW>o‚3 r0,#46l`iK[Q+r,ߜ> g/19k=xa8 ^mJ<,;t#4B'b#4LH=OUG[Ƣ)\{.cDkDQPDǗ9E"!V4p_|ۯ短>5OG#=5K#4(_jGi~xyJsبo>*cz{beU"&C_IN:I?N{w#4Y>yE8 ?ߨbu#4;#4'KDFA{#=Wlbf#4^Ʉ:6q@P=#/y:϶+q#=P 9U%S *WxSWb\#=LCWy:^@۟HԔ+%Tp8s;Mx5t]d&?tc꟣@N9;U{& opu]TAuNMf:vGXŠ=ҠB019Kçӿ؞Vߖ}?Hz^&S'CBT )2dU6I't9,M~kkswɹ6lÏq.4+q#yk*EO tþvR;O=LkWc5{!lw FieYWY^%xivЯ,m+w_ɞ2#I/k|6 yыr΢V5ΦyU#4! VNMbA4p8Դqp#=`9}mITrC_9/amRiH8Т;szlܴF*ܷjcQN2ʸ$jP gP$ɌS~<>A,Cp&".L 1L;zEf-8~o:#29u0}MO99pL7G"'*k'`$DjYq̐bN=*C۲\ÔԅYjӔekI:RywOZDM;Pe#4@CsgTZU'4#2f Ԁ"Tr^jKh#/#4 Ӷ/T#=xf+BD\gQk0Nxm,{.ݠPZtLCi׬ylP>3uX~Sr LfK0Vs,69Ϝ``.ָ9̖^Tl։M@Qk)ᣘ#= i-PNWYH]d[`5Qkkp -Le"PgƸU="жkYv֟Bдyuo-,=I(łOS ꪝޱNR#4U1?52M" b/DACq)_'*#=u,1.暦ʙqh%h-e1ńۯf*4!3>YJUjcShke0E6 u02;duks-NLӘ M &/(bk*Ydf=r e͹<`=O4p&噞d$t #4vsC,'˚3( S!`q* u5x1MI'2|K2ܹvi09:MccNۆJJW,NvFzC/ e zՊ /t`K`ypzƤEU2$Pۓb2Tu00QTP{%n:#=FC  2A)/Ǽq< ;BFDTMvAG$95&)7^C$3ItGJCdqc]G#`h9ELWQǛ8#42fܙ{Х꼓,ヤ0)<紑й+aLa%pВ<Аp`Q#=ժWݓ&S9#=E1l%,RC?'Kwʒ7Ш7u5kZ|/,r@j"@d1>+ >ڝ|ͽx+ܪ+r@#/A\J:tV$SK68B#/#/#=æH8B3zd_SO\\0v6qP܇|!Qi %E)#4¢܋zZJ#/6Hsa)c&#/HS{y/LgDqײ#4SVhu8twʈ{>dtiؗ[3[Y?.'>W^2#/WNNHSI,/5rvs$h!a}(zjR0#xt$cnLSs(1UBF0]aa[m?e{1s׸Yc'B) @Q*PB- YdO>}~9@e#/:"zHIvt1 IB)1u9T5<< ~2xBP=ElNul#4R`Qˉ6p >_Ϩ\ݐa2]8#N0n4^pG6""1Z*v;P4sbls *@䮏<"5]QqZ#=-ग़1puLr&+9ΤQ( UDvv!TS mCc9Lm*F0ʙd!=WK@Jpx8˙8L*!}p |>rS!N|p֛cLٜBkxk q܃ʟXF|5s>%vF*ֲL/[wׄap1+36ZV`o3]hduFl4Wfі%& !<ᆁX KG}q_Or#=f1ӂ@> ~WSE"YWa>LM{Ϣu!9R+Ô4hh#=ђb86ѽ9q[pqj34r)(Xjd`~=akoSL -#/Un\36o2$SU64mcmG9$u&䮑9 #/qT#4{s&I']M;շN2ZhrR sgV<`|<`#=#=hP)d%#= {c0P&m#+Ƿ*۱Մ?5LɖQd!k}v©^-7:ꪜItϯ`陯)`<~C/ ob#h^"}'КuQN|/V4YTU.`ڼ]N3"#46fb ]o5Z\nΒrÖn'Ktd"#42;\lNhTiJlvu£aEQQ!MM/Pc6N.--,4UD Q90'9 9S]ۖ j @Je0Kk "aXF!23',HK( 16c`&!9ӱwF/v"6xnsu1bzICСɉ{08B]`RSU )M]łxs[Q3bIIӆ[:ն,] [sN M0QJhhhx' '!@;ۧ#=,,ezt;Ú(2V2S/hVBdE:rU.1䩠]6qHӁk2f'T[_ya,~GMa6rT27aԐ<=#Lr}f:xwBOG'SCm5NLNܼb鷪_9n>OK+_Je8yQoi)9ot\M8VOhTBUN:Pqii71ҝ\B(XN,weJ,C#=gIf"%LG9AmKA(|\V(Z*%s9 T%2˄!"8heYg\욢ò:eO-燣nb"tۉ7H6ݔǹyP%A4I(‘J̎#=a|,X'02dַΦp;b|wI#=1& 3 :4yR68:iTRT>.;:Mݯ8::C>e&x9I(o|>ΒβzBlA4023١$N,]b< .iTdàFPf,_|#/FA@AW=;x#4+2JK4/vP7ef&PZ%fM#=$<ȴ>ZfD(CxO%U6 5v0[ CLQ@AJ! |CM1%@D("D#=#/ t04Gw/0*EBLb#=J(8UuJA1&H)v #7"DL#4K `{@v]Wy 2D*D'7O=qghb7ET)MtL:?ٿ]}?w}8rBJ:#4`,@'xҞN~#/q;`̔ G#4C|3Ss8!?Z&#,31V&iֲЕHxCR@#=:-#/B)#=d)(JE(B$B`"%RM5UNW= |E#4-#="3l{Qh#=J("#=J*ZB!`$*iDJ=DD|@8#="#= b)Z!#=!dD~H$@UI#4$G:0RHrB!@Ne6/ ZCd{툪PrHBOœs+^QClMRTIG CTDPRKJ# R%0DL)I%Du9"#=5I~SXP`;]SUUcШQ/_}ϋc sB!zQ 785~Rr(mD#/gDH1anrUْW9i7t̠-#'%sӼPvwy6+Ȟ*C>8 `Ga,f!`F)+c < BFgZ=0ij^HJ@& w'=>@EDC h?-% QB A()@ Q#/Ӳ(5JAL0OF 8d%&6*Z̑J!#/ RC‘d#=Ih@r Y%El n4#/ĂvuDP^;%πQrJ0@I晭h=i$#Dag>+MNͶi J_>9@e#=IN\#/Ԯ1}$hWi*v>&.:u嵫b%>O>>dPB{KBWXq书KAZhl{dcTr!4.d/T)0b$2Lu0pD~(("$[:<i(Pi#=X#4U:r`:3NJHc[m궚{(k$F4IJDI)EA KIE%PR-!bU%)*2 @ȅ1kgH}"vMvC0 )T! #B"jK4ҏ2((Z*#/!QIHuzǶr'd'͑Ur2Os8>D:hQbi+&=XKF6#=S> mgHS5@?$2b&!5\@ёږ>`@|v^^p,Ny|XC#4O;iTΔ?& b1h )k_ფ@}G`-*t48*i`!r*$0\d`#4$L#4) )Nqg30#49B#4Q D#=6R#=6DH ($`1#"HF1'ԱP! .`a3 %M- 0L+vL #40,bLDC>Q>0vxl#/DY؎E"$%!;&6njL#/"O#/aT ML># ɤ:yQ5< XR0 VA'8na4%c{"xit" U3~ERL3D1u;Gy~CRJQA1$QHF?OԎCO(] {%ܿ̕hXN!! q#4^EU0^sa#/)m Q9aQgtGs^ml^ELV㩲<4 gIQg2RuYu߬ɃyMJЏ#/t@7OO59sHIHD#4=Hų_hGl1b*H䄑 KJfIdkpO-ݦH(d9(`\bq2^s]QbfS̽@|`>~?8nN&&JX/ǃua S۞SxeU1J$:ÓA.̈soA#=:3GQRS#4)Ć()d!N4}Q1\[ -{]ŸsEgV,x[|e'ךPv2P(XWI(Hj3ȎXYt)#=pMh%"}dPe6l&D˰ xw ߇-Qt)'43@ʑ>k\:G=q(u?a!~IrDE,(•0r,NA2TXа" Ilǰ輴ȢG+f9cF3膆Z$$SILh&#=?ќFpČ}"M$#=(@@QJLHt!#l! mU)i9fN/ɘACiA?ϑt&s I$WIFA$#4MS@MNaU,Jʄ(3w|J/`HS`Kd8۠ D$IA15$Ad䉪#=")JV(,R"M5ӠX kF3FaZ.# )ZΠNNj%2}9 'Aht} @}}rC/[*H( #4FH~( &@Gf]#=g DINeDDQ7p:ub#L#/`kkM,lp#45!զ@y N8ڞzi{#4GyQ%J:HvhxxNY~XP8Dڳ.ބ )a;㴻|@#4 #L<0)#/bM$XAS"! \OԮ ThJ}Yg囬2#mǂ~'qfiplLvL4| NEj֯X8#=c[1w6;agŲ< 9<,΅c9j:X#=2V6PwvDqyד#4-unL[O[2C!cdJFmYۿoTW@5$_N(պQNV&tс+#D")V,M?U*)t|9$酓mhj7L&֤[D&'GsM1 d+nma6ͦ&\l1퐔eԄFpf2iS7$:t)W)O._#47D\Өt8#ْk!!g\6XqQiǶ`8s~7XHF#Dlm#4،^>L(qɒ"QHS#=֪O#4I:i39C;LS#/)*`0yofwuI<,|=gKMOZXSJI|IݟCE[&QфAGNKbIC:~ݓRtm%G^1!l_.V1нcfٙHPwAGTjqGE#/ڥTDbj&BVX `u~MzE'w5ӈ '$Y7z=x1h#xG~YοPm4^l8{7v|l d`@B)0AO6@tww\@L4E1#4AUL)!@CT#/$USCQTL @B 2@ 4J!Ae *'yP5!d#/d?,Hu!с W죨,11P_+q x[&#/F Hɠk?kW!D,zR3Y#=6<\N7SS>h&T557EHSf#=1Ah ʹ|[Og~ǪaμC_3#4acz?+w6`k|'^!t2#4I0Ze&kAhm4܌Zp`LisT8v,9k]!㸎u5dcu牜m_a:#=;"3 vx;r+61SޛtL ̞i˓ ȸׄ]<z1#fM&]l̨dhjK2JW:lڝt94OHZJ8dx8'21 zX#4^% )F$f É$P;[G82P| یx:Yɡy|XC#={Y:F~dM]Jaa#/19RaHKe:N̛Z0$.JUhKjBo,ݱ"!hHNv|l#4*bF+mz60RE%S b8"cc#="l>]mF9μSi E 2MЩ%'$~4r@Э#׼k7nlxCX>_yQ$=5#4:܀v\@%{pi` (@M&C>ZqY89j0x '˲vBtHBkʂ#=jrfr#4?WU۔h$xD=` @ Bu=x#= P!JC (Pa9Nҕm+PILÚD3/E)%$W}d/Ϥ/SDu42DDQ#4!Q!CQ!_*4PDMl}n?t#4UzOq6!|Akmӏ_O^QgLs#=#4ּo=#5|3! L>NN1p:Ru8|FV9J;#/!-M-6t_):mKWF.7h8P^agTP 3hkʗ$DmGG⨊gU,#4L;qD 3BJ3% X5YB*9(:Y7#4C<9Uy_~ӫNqA܈zBAQM ĭʠ2:ݕ6O*@?HN?u(/!Q fBLL ,A;7ޗ_vCPO3CN#=EܑN$#^ +#BZh91AY&SYjR"?h&_$m~V#Xc~z݉@#X#X#X#X#X#X#X#X#X#X#X#X#X#X #X(#X#X#X#X#X#X#X#X#X#X#X#X#X#X#Xo}_Oﯫc[ٻvvlqVڧYF{=J޾{}fKnncw<ͧwp;jl{}>-}qǧ7׸>usbBMڱUpvx]aJ{[f{olz#X ;kJD3N۷(#Yn8}#X%T#X\vR(6hCCZd 6tE9QUZ˵uoCǗ֤#nv}h0+J-c,{2)kɬy껮%#X=x)iR"s0;a^Wd.Vi#n#n()#XTUBo#n;:NîQu'Eo64G,'﷞L@ҩEu#X#X#X#X#X#Xj=B#n9#XªQh#nkzѠրk:vf۸Ik@Bm#Xnc#X*c(PT#X#XR#X;(4#ndR{Ev^n5GM+&}D}+X(4&s'#SR>ݏ-}w}}y_Tyswz=G}ݛy&zj=>n| vu8PjUH.nmE;]kKhaSBx瞶F=upyϽWmGzط_o.}{|;q}bκ.ޞwu b=_]}:wy2+.^ϝom{]So7tko=t6v}J]oN"@#X\mj׸j[vz;X'_1Is}^ם՝}v쮝3y(wg%תv:EJ=>{;Z![5tm={ֆ͝-Չ]-\{n]JPU^w^P9qkxy]Xwjn]nݕSlH=+B95rvunּ>vNN#X0l#X$D.Iwe[r궪!ج%vҶI^L>|u6ϝ}^o8km;nfwEسP^P#X#X=)/mt&]d:;ywMsSU]s#Xn6ʵ#X(#X#n6GQܰ:=;_n0Ş{xƎ#n#YT\]wr@#XWk}U(-פo'jM>[#XT#XNήĀ͕ÍaTtklw\Ӳ@)zD-8KlOR67nal l{B{t@tJ"L Xܮ#XW3m[o޾oMVyiOy:{k햴+goX|;:B#X@M#X4#X&M#X#XhhFzAj4fdP=M#Y4ڞQ@ d44dʟ=I䇤Ҟ#X#X#X#X#X#X#X#X#X 4h4iMS)OQy)=L4z=h#X#X#XH@#Fؚd{zI?IhP#YPA#X#X#X#X#X#XR2#X & `=&mM2TDF#Y#Y#X#X#X#X5#XL h#X `4ʦ= )zO҇H#X#X#X#X@T*t?SC©ES#YZ"#nfB$l @#XH$GE~ H5X|`qcU)sD`x˨tCKDMԼAPqfA$fqV_"r$="ziACPv#X2&Șbv2Qnp8#n%#n#X(*)#Y- Шb(E&t*B"!߾n o " @L#nBA"RĐ1Dʙ (V%$^#n"3*$GQx@MD444S+lGS#nab"GSBAUr"#n% RP#XP8#nV E"("*b(#nb "&*I"hH"&&"#nf#nJ*jfb$*jf"*h#n)`(Id(bh" $(DB)RPPfXRBI`("XaEJUdA"j bX(#n&* #n"Y#n))#nb&B*H Z)j"ibHJ*f)I(Ia)H*h* !hjY` `R BV) R*"Jj"#n#nbBJ)"jRh*i%(I "`Q&R*&* hh! I(R *f B fh*h"I#n (#n(ZXHR*d)(#n*(#nh*Hbd *#n)**X#na"B!(%*b" jf*("BffJhb abB&(b"!"d("bIf*#nf&ib #nJ"(hf"e"*" "* h&H&ZH#n&#n"$J)!""(!(#nJH( *#n()*()"( b(Z)`& &H j*&"hh""((f"#n%bb)h* $""bARSICTDC4SDE4Q4Pı4% Q5QD$QE),ITKDAM)CQQQ)S0U4PI5E+30T %H0TK4TTK1A$I2%RDTTL$DTR0EQTQT0QTIQDTTMQK0Q,A0ҥ4DTQ!$MSPEM0SA!!EUQ,MQPEKMLTK%A@TERPSDIITDDLHDPI IL35QDE2MD-STSALL30E!Q,S@PQM0EMCE HR%$RARM,UQ-DL$)T0U0EDTLA4REDT-EEQA4M!,E@PS@čDDESD@DPM1U,S@14 QQ,HD4 1DIM$AUDHRTT1DQP4ML1E4T0STUA5QRCEPH)#X2PTL$MA%DLDAS5%RB 2EDIDP )04MTPAAELI ')Ȫ4ԬMD441PDEDEM(L 2PDA%LA1 CESKMDDPU$1%LTRQKRU-SATUE-U4LQDU$UM CIRDDDE-4ME%ML4LQR44MH0YV*j^8MDD 25(PJLQAAII#4LA#XAD4 $UHD L$QKCUI35AE@IAL4C#XPCDJCMI,AIAQ4T1EE$ṮEP$0A!T%EE DTD 4RUUJR$H@K K1UT1QRPU#Y RDPJD(@Hi)h(h&(iJ#nV* ifjJh`#n$҄²E3RULU1IEP%TEDTQS@PM%3L̥#YH#Y(55LDC4 EQSADI254S251IEḎU2TULM%T0ԴPCE15HDUE0AUL)1LRQ$T05DDMBEJPKQHDHQA4BQKE5UD43TM4 I1LC T%!4DQJЅ#n 4-S4BPRS4T%1$Q!)M,#YAUBJ D!@R  D%+%#B@$1,C$PQ-#X4Q@$M0 @0DHD5D LT45MKIL,RQ0TBPMU!$M#AED0IDP!H4-RQ#CADBBRPҔ%+CU0 U-U LIL4JU)3UAKE%%Dą1Q1MT QT%)4HЄE- JHPMQDQEDL+CU T M$2HL3@*1DHD,%T#3M-1$Q#XD, EBERE4EPUHLDM!UIE#YIUMDQTD%DS-T@SDDPİEPQ1P1IAAPPMTE#Y,Q$ 30HTQU1S EQBPUԤISDIPULMMU1#PI3EMPQTU#YKRQELBĴRQ45M DE#ACDA1I4 3UPЕUTIK5@A,ED LTUU4QKK0DM#YTM4@PMCJDR#YIHAKLRJ5PQQPSRPELRPI0THEPCBQSHE@%2QJLU%TE1PLSD3DD,EUAHA$1SLDT,H!$C,KC@MQDE1)12#DSPE5C0!$S@Q@D1RAUED%R5%#Y4#LԕEKLDK0#Y45HD#YUTM!AKUPPSIC,@AR!BQER#D@RSTC REEDBUP#YS3DUID35Q54! ELQ @IE%$U4DDD%4SJ@QB*HAU +K2QE IUC3@%5UU@DILAE 2 HQH5D)1@sf!)& hZHV*DhX"%("VFHh#n( i &ihHh(V $"&f*(J@#nH$&RhHjHBb#n)R@a"JiRTJZbP""!J(h"j&(&"f)I bF$J*@)#n`BedJB&h !J(Y #n#nHJi(j&JX"#Xd"@@ &@*#nI &)iiU#XF &("覚*#nZI$JVh(*"IhZU&AJi *abT$%d"(`#nJJBB`&f&Xjh"&"b)#n)Ba(J.PqrAS?!/T?7mDST?ITWvx}í3r,?kzI'T3[!Ltj#n}z#`|'4ז?mǩ{Bb#niTꢴZ㍔̈́C~&< AfhIOag:grgTrr#Y]?50q;)%\FwU_֫.9Nf4kRgГ,Ou}I< N>:`U-?˥Wʛ%1>to3@y#QLWU4 9-M3"T)N؊) &*ۗț$DGY- `2%P((kT'E?Ə[9k>uVYvmthJW*0nr#naf}zfұ@q$;|6bSNmn8ΰ7U`!85yϛh٘{wLkAf} >-9fz}F Ą*^9DELEl0P;8#YǸF9ӻF( [L|vCZumoGZҖ #rOuC2o(dC+&B(xu6C }!jowmP䆈^(X#nL4l_f.~AQ/J(0Ϋ鬳=!P4tK:sŇ=%gk'>#niB $ C{]:Ƞ̙ HC=*(;QC4U$D#nڦx'#X6RE=dPu4xse`8F֚;YLJw`[[G*>Ïgrz隅SL=&ҡ|Rpx]tA;P;ߏupd3T%(vhUR uJ^l>]KYE S$G[Z#nEi)$+CK;s˲9;6~5:`D98樷xXù1J30՜snRcuFo6yQ9nߛz\.T+˒cf-֢yǶ\-7;IMQaU%ʚmg_w6ikf_ g"G|Bs#YYF7˔<"D9t_l\hkqsbX<9ݓ,8ANoy>/bPAeݜoׄGPA(!ܷFPF]*">CT، nSq$:2K:3V>h]LX#Y·YсT(Bٖ+B7+]aXDa!2n\t%+u=KF^r_&!Ҕf[DNK#nzՂ@*4L<&۠qtWX*N+("|ز"0S.pR6pQ_3a'z4`#n?],xpw>@||!.QI#Y=P4w~{Gq)>y=bua#n};s:2^j"?#n951?֏O{:vζ+5_lFa7;Ao]zo"Բ/* /_,!de*P|ou.hF#n4TтMn,Teg2Ye+jc6k#nVt;D zMp#np,u?sDM&YTFJsRbљ](&&lKC,0î%/}|(_'ư~>vzmBFn*Ǭ#Y6 3놗M1(ʰP^{2_=ϓ&2I_n1h0 /xu?(d$yq8(+ Dݙe0;xFfuc6#YmUeа'!Y#Y.Z:dU`CBuBEJ| iaRQ֪fe7Ϙ8,De c90"2V$_ً0C#\yPů]~(xC{2zDgI'~ex}U/9`>%xHae5!8N=aB(ƤŽ$J4'L}+?Is/ yD$lߏ=N/O\l=k JA#n7*_{`ӷo>sC>J|rPod&8Nªpޕ<'EP3ɼ2lV1nS"-<SqբA~*4!3:Iϖk K8;BK9R ٓdF0X\.5МK*pF"tqbzp~g?K;\J$Bxx%G'?;oV/SU.Ιozrf!HS*cS#Y/ 9#n_^PçOyQinPB.D x=FfC5s_7|H>Ugi:ec6qQ32tJw$cv4$#n^׷,g- W3v[ci`XMbPV"zzrIoZYUTdu0u38̉YKy`&1m!#Yq|V#XAȡ2_tKz|}.-lyo{[P\.ƺŒĕT(8íM%[Xg,Xn#YG~m4+\YӦLˉܚѩ_)AqBP&=X7mH`x\w} {R2tb]L*ԦD`OYOƳ,n]'#YdvԐ݋=/ۦl,ȵ)gokn^\$HÜ޾{7rr_\"ȡ HT$͏io_:[ܦа@\Ҿ%XG\,Ngu=qp3FV#Xp'XoMH.|08)ʥKzAՠ h a?ߨ{ߗ:2;E7ˆ/#nPzMޒow 8y.#Y|z5vN”|*Wg5~~`ʝ!]ʰ2#Yج">dXvoBY똎ޜe;a,n"&i#Y{!lZ2GTU#X$D( 0¡9]UQŝ[q6QuquH1~#XSh1Tfvw8GCY ,Y^ONȽϬFQOiӬ'jxmpAC!N\7a@CzKF H$*-.jL2"Ky?D_愿y"EH6X>H6~sO=IaFREFPxGlc(-Yo'{2#XwR3#XْcaX)l-zFi}8vKݾ "ld`)xS$b$ k_Zl2ɔsI<9p +UNV\ 4^(+΅e\]A#Xo}ly s;2%&URL} \QGunR®e/̸d.heE"Htۚx i7a|PxGFf஡F|D{(g@5#n+[C, oГID'H:(2 "#n蒑QOcP֨$(%0vO'}0wNMКzMY2#X;WNr9n m>mX$c}RAIl$ϥvd2zlH+E#n7T*Z&ƫ$I&p}:& Ż@J{EJXYXǽhV,0'maKm\:}ڕeno'|yv8߇&}ClvMϊFc7FNp.YCE;䀖KKթOڍsѢ_6&hOOdX U~|U^$BcX퐀,A:bkgd8MjB'>6>8dwU;R248dUĞ2>w?/~ͼjOWM aICذi8QMIP$DiiR+y/Rjbnsq%~`u#X5|ɖkTkySJk+0μ(:kWypx"]TV!MSr5i!~W_Bxsog&61\vAX?cKBq܏ fd2sE%rR!AïJAWTX/n{)e:wsofF2.7FN4(@7>7B]P;5D#Yqkt®W榲t~623Fqۊ8b* THBpt/#nt]:ϙ9mz0!cQÜiP8ko ;:yõp7![qryxrEwPL++E[̯ ;2~Gh;,7V#YՓI%JI痮6[v~"`9=P B(am0C#YZ[j1O‰)"6puhrSarŹVSUngO0(D|j>F5ax0q;q#66d2E?YnOJε+4yC#Yh3OL:gLє\ s#n!d:;#nB`Po)ɸf@;%%0ӠdU#NBLk%V#9ؠDB^haYN'$r|S%h0T$Կ%99цf|SQ6FPSCĶUiɆd{S6:öW/Vpg_r8IQq6yeDP"`p\̬@(xh?bndpeN|Mj/%{NsX+qTHmTK0"DJ宕P0Ņ/}aTdq i6 #mvޞ36QvˈO`2Lto&Eđl)F(;>R}K33h6,PgEK7o)›M+G ;\bxv˷Bnf;W'(GG,ɮ&k|e1bCh1R*f"$'Tme% 4qY9wM:C:(3(ɵmCשU~g'N?}bTȘi o/SF܊2*Ņj5wG*BC(bFqaj/_m®S7\VJ6ֻШϠ:vl?̇f #EVpii͹d德w>׺,PT}Hb2_F0/Ay~ 2iwnPE#nKF6,#X~X0q43PU=pf[R,G=*̀QS#Y%$b.PH0;OHkGX4E4diͫ׭5Zs{oDcA.K(.Z\>jP_^~8Ebz*`Q9M椺_WP^MA#XI;{e%` '[kUMDz (0tW#nvgaC5}-9v_H:uDLJ#02}҈j/ێrW: P#-S#so w>kqL$9vf2t[!kbaoш|`~99zwi|2qyw?9M'qXʑJgJjwF#Y/Jg%Av: J[) G3Ӓ#nxPXpLH#ngeqr>ټ1ޅ86#Y$jK}Uq59;b+neUZp]:˜K>mTBԨ#n?cs߈.jܷ2#YMr,:haӱm0>h^Y6uy RCr}8{qB݀h+>j@%-;AHf7!G嬘 Mn*#n2!DlX2T[4~m+C燉<y vFM?#hzhuq,ɿpL#X9Om Qd`hgP$c`;{gŋ !9~q?Oz%ד)<(ŌA` #n|O傹 ѓ|(x%"v!H30ŧ֋{{]~C֞IɧչAhʃ m,XX,/:~ƿC(=#C(y:^ϧhj$@9 Z8cs]Ai6hxQx Glh((BK#n=,2hr9}^L4m2@ERrB-261SO@h6 cHVvs(\hk.Z!2zXBùdq-Ddør("c DATq ny?On/->%9m-#n55JIk]iȤtsZ-[,V#Y4۹_o(nqmi|#Y>UHS`rB `n,dʨ#j1ݺûF62ab;u*GHV #n#YI Hz*:K#XHHqs*V&vn3Q~/e&[umXyHv{h4yfk,[Y B*9T2UI*{/GOAplNQQ#XM#X~xuU(~+2$!NtEOR_R$1oǻ1XQ~6"锯LF:A{}#Y1?4A[]߆7?'Bjq|l{lϷCG'nRhj}S}p3L] a鸂J^{lv^X1O6#n9O?* u#n$}#493_>B՟q zPOsSa85)-#VR_ #{c>.<Oz`'ah#YC?7ģ%#nS:0ap%A 1#X#qNrJq)2q% *<`aF΍Y#n~Kl]/1#XbҨ35ҽsǓs\^jO6`]#Y9.:8Hg}#vYx#XuoIsa͕r,"h?X#Ye(#nZeHV:"a#LeJ|ܖj}6ut7aXvd%jL'U-coOwb? >}_2,fq rHmGuLeQg$V} WhQުgAzIC"@ ~ {5?aӦԑ6(>ͻNb^-\pWD`kTII,J`=ّ\g[ێpii*9I C)a!$HyH`u#Y'DДBQ!9R!u۴ATJV*#nd#Y`)5Nwf=h@s)X̫E\pA9ijPݹfK>#Y[^JĿa(XmpyGNi#Y8$Cs~%,2˃Ì%$l#X8卓<7|#YL^#_Dž3EdnNz >Ğ;g tf Hǯcf`TVN:C"Ph60:]0X(m6)ɭ'VnɩS:)(ly4$y`#tl"A]o6?~5[#Y4ch>/F1b0<#Y İ*mw&ҵR z%"b$X٩V!7tfݖ(G:80v,iފH3bEiQpOH46D"ΛFYEY@)2:iu5jQvaBdvgjg6tu1{f#noG#YD##YRA1\D&j;4!5i2蜱#n87LR !! p`HDǫ%z#YwXݲy¾N\<8Ҭƻ2rΔ/?AQ9'W_0t^p`.u"5 * tahV(Ɏiu\o^Dǥh҄q!d BE^ x_9#Xl?-O=:Xxv0,iv+r܎3U<8/hln{ׇ>Bi.KԡjȵCt\XD,TmrqI<nlZ\#nQ#Y0vND퍠ݵZ0ŧj#綃 GUEA"ES(p^lfTsMc3#*U0<%$YPUϟ#XQFAT&JwoQ{H~#X~>\􍞞o7֋w|ZOjkf*r^Ӿ(7M~a6ZyS&;t.Trj<=.>p-#YSvFɈv/S`5=?*jLI%XA)H*.Knf.[F ?Zt*6@?6>jžҟ4aD(85]m~@o~8I 0wѫ?Ll~QPt>#nv1osؕX .Jh>$ɱɅ/ğ&>=#XDz8S*{@З4j,ӯ0xm)ǘ{J#Y: :N[hx+!#XNL<'HdALcBvŴ]F`G@nK"4ZԘ~b=eezܠ![s"nOvIe݀h_ɿI mV5ԃh}](mcI6Kd?õ#X?%IH U#n*#Y) H. <$p9.^U 8Tbq2,d#YkU}auF*&7hW,FP#X>RD[->h?{fYF#nF+2~x]Bd~Y~wZe,sł$:ں;YC.0rĘQCͩJB]17u@(P ѡWc>wR!hH7#n]$'qi~vO#X1H3ƈ`zuA1)+/4ijp3|8) @WP s 76Ō xK9;#Yo+VY-GNtvsKN\20ΰ3MTLoTkwPPIΕ7"/) ' <6p~4GT$dmf]!% o4poʛEsv=BM-}L}lhaD'V=3ׯN3W#YّJj ^G1)0F23U1#Y8on_aG_ Lrͳ򾣩c{^$$ r7܄^c93'wE  2_Me˱= ,a(mf˦+et<3Xj3XkMkci$C5:n7ê¢go1ַ˔jؕ'x,1\>M\c֊"Io7̻ͷ&3p̎,* p/5=^%d%#YeQ=#nol̢;X޴Aj$CK3lG^J2#YA*m9#Y>>0@FR[\0s}]嬎qڶFZ(xlOiU뿣#wyw)> (#X T[\gFB]ꘀR)f5EY35#e`\`k8ˈC8 Ʀ@sTC{ᅩӛ5._]iں*xCd13:iR3 gU.! ;vF86e<.$ cb;;-הnq (1𐔧J#YtWLW~M:<3B2ojmE_L`l)(N<}h\6**5=K}ԫ9η9 tθ}u$E&F8c a#Xi|e'GK.yɜ{U|H0f/O;2ZvUFM#nF+}3R0K($Xx$ &#Y~Qf~ʩ+~[fZ;,$&\dN'diƑ<'1O9~*0x;2Z1vdku߇--9̩;KAA7'iyDa4k.Rfq~}ax!Te.Q"QbvJoe{&1bxʠ]JĊ模t^圄fv4lӘJ2ن_Ӑ.ϋah @r H%05.tSeevGp{#X.ey,Q E_}:BTLSN3]*nH-uq&h Гq`G pk"fec!sNMLJk"Za٣xP"^?I0^ExY~zBy_|G=3O_|I\hA72'l0<#n%mD`Ju%#nQ=y(|2E5t۴~Fq'QԵ끸&cH,3m`/ {`Kwj:.>Hq[ŇJ#XCqUsUC}Og=~f6Q-LHl?!N}5aASBs'#X3Xd#YNO]ut)1Qw6.j>c/H.Em(Y(΂ tUyzEaL ML^of'9GFh5[,PE7'Wo;DcUFUaAώ!!b(( Fk9ʖ#X}5#Y , .ڀ&)9}m{\r<0HLQ?}Gl5 ,ө֡hfF2%@P78!N|,]ȅʒf&xJ"On;oW]7;0 f>(pwR0 ~/ka<,0 Y5"'b$Q [s$}>*F#!^Z& Gu=#n+(I;?i #X. )ΉF PnɍESZ|6/G)tg^*U#Y-ozŽ _H  $rbZ@(^?wW?ZN>Hn[vot89ޢ_F( ,xDfMj!RD/wH#n.#Xbn'A3)vA0>c=㐽ÊHu#YYkw&b{誘#QV+ eLILY\zCpb{C2#`Ez/#YJ#X / 7/;]gHR(Z(*Jq%z'/@9r2o^fDP~,#Y=#X*LwJH"$Һ:Ă^c.ϡ1-+HiPϋ󿐉WӟqfTn]L3#Ym #XMx1h lLE|}_6k19!g$-tHZ~",Q__&}6cJ0B#X';}~?ֵ_|tf?#XG\#XāDڋAQ#0`%C1';UMtb&l]m~_TRsF[RG x_#X}BW=2WN_ߧA"S$\c32(9As^k9EPBilm<9h#X8~#n";DN􈢘(y|"FbļM[Y4'uL>;,HiTQ"~#X|#XT1h7SU QqI/&B#+e0:- ꩘A~>n)G1ҍFnJQJs @LnqÆu" 4&pͱ^A "f.RA r^ʟcj"]k#Ywiͳ\m9#XB'O Dng@@Mh(&vj;>Y;sb^nqo%l4Ɔ̱"0PrI"7S|s8G?S=_u3@vz Ե2r1,Hރ~~/`+4.HZo.pse92ܷM+<$zI*Ѷa rє*]r^a2~^*Ҽľ>Xh5}uXu;"QJy&r<!N`{s>Gh |g4lGT`@tX6n;4$Q܎tҫyU&-o]*#nFqUJ9^WMqShkBo g)\B#s5R&9V#Y[58U,䦔fRS;8[ Fljm6%G D޲fjssNqTT5h!S,tAΡ𕹭P>k0w  ݷЩUǗW#nܣ9>vPp<<#XlO;SSN1w׌EۀzyX}c/.R\oHmd?qNub\}31N*Qo\#-Ǯ>'rk)pL'ξ]{xy/. X!C u"G1>|ÐЎ_'f2\/#X7O(_,ЇͻA0.BZ[ޘs ۇ&E#qvGY\jNzp10D#ne: |鍥P_l[CO ճCbb7(?GΡ>|ec?a{~LƱ֨Ҭ]UTWY5ui:mMc#Yt@?BtcBD JrL+6fLF:ϝ<#nMzhM$~SםP"*oƟǖiӤ#n>az:-N:'nrDzy]?L! _}#s=ɛ  R/("i3(Sg6 ~S4Ӌ<NX07&qYgrs~VOb#XQ#X9n#IPngy~qz>3%1C!O7Px&zZ\V]MK28ӯOP3{b…s#ĩl0vLhm2<4<=i[VBF8jiֵV*k5k$ŸpMf}K ri˟Z*MRF=٫&$Na|> QFAh >X~Qk0=aǢ?gt#Xq#Yߵf7梥-Lߢ<χ@*+HKMbz$:C`r f¢vfZxqI֞KМFĜ/bhDAL2:/w]d$EOBUwf'Y9 wWQjRșa#yИmAcx.2#Y21(MbWy#X#YH*$^\fB#XLuzA{xLhޫ}b22i0PU؄OE56k51oϧ-OxcFonE vgl  aFOܴx̚,֜Lr#XmrjF$)%#n[z#nf}:9Hi3tQ]? ZD.:;<hx#ng >˖X*HzUtj^#ܰtyFsIZufo*Yv#nI.`Z.2$Cڿrp>PCߠLm}F6RB\z [;=,zU1|_ۊ"FK T-.A:YvkVO7SJ.]NϐyT/0te'2oEtz)?i!2;K${eh+LY59 T;2+Q]҅Ba[ࠇPX% N :}8O>l#pU*:L}exS#YVĴesc2o:q#nJK JuV+gc"2m晨 )A: JLxrɾSF@vi>GAvD >C yC^xK#Ysf$`, :0kU0QĝB/)f:`0D!k;0RNgI73 i͸E)l#Y$C-_ .1@%pD oJ=);JݷC%R ),n#wN!/5*Ya& cMA󇏅G}j>3_i&ewT@bUQ~?kco H0ތU@wE0=v$IT8]˲QHF'=PgѕHq^T/:3|[JRgl@Zucc.cܿzܢu6q%gYگ|b#XٍaQYD)5;pyka0<t`+ƍ?Z9qGoVkYپR\۫diI(Ty4lp7#n 'ݴ/x0~܌}x]!|up\hdV:h"6QdQŷ(gePYǓT=}{`F.Qa{\h+Q8X>9Ks$.&LDOs\6cһez:r#Yna3$4$Y80;JkFY P4#YΗ_?E.AzKygF#nCV%!rx4Eh"%yx)yAu-~2u&t닯9g޴7n80Z!"%c1kXHV#Y~ Fnٍ΄1N(M{Lc<@s*]RȌ/UUUs^]_IWw1 #YB% rT^P.\f0<6ǚF@I-D* bu2BҠ#nI8n1IDů=#X04okEƚs)S{B1pB#nγTU_oeԝiJ$!r7Zl9P-T#X!n'69m#YT!ժ7rʘ}N`,*rAskp5iZ#AA3!,I淔~s 횋#n5UsaQeEwJ#XUe.f2XYW "b퉽ݶ†G5HFJ?)ۍoqSJ2b6eA+jvzCN ދ= -H'&J-V* P{<a!o) 1JHJ [XgH~#=h#q>T@8mL)\#Y:櫃^a|#X=p`'QBwOu;'3#Y:VD^JBE(#YvA-FT%RAFlV'd]"'XUVLW<﷝{]բ䞤;qAh!}]֫Y{sB,P2e$Z)+ xY8u>?b֫BxO PKoЪgg5F<2 v'('EpHⶱU1K`/[x!k #Y`*M-&QM`u"LU@H׶y+7(8#X{Mf-#X` t>{lP0V_W "'(l1Ԗz$(s-ٖQ*e }C.u ְ"?+j!H(έU"]1Q)n#Y@#R|B<n=FVbkg#n"H'sPm(DGzNEKê u'"^Bʣ.7nT4ԁU8WuSjR,A-=uP$"S8j0g#w#Y6^<0Ro:I̖N)+|_4r?^f 㗕OtsB#Y8.EZ8NFGMcYRt+f%<|97 TA='] HKesB'7}>qfEvץ>_-䀡Tq-fAIN|_G/X<{wÓ{ 9SGnw]BkF80mE+aC'Ob{duk*gG Ź\WRj7PsQM#YXiip=ӝŚrj#Y A#YHf ^x}81s#Y={_,2yF3uģ'+qPcx  C` d/j;8#a{`}nql-#Yy>)xx+`e2Ԕ@MYc:9>5BVߊJ־cig;0WIЙ!$(~}qWʝPzRI`2)h/}j{Jm0 ) xN|.8["ݮz96t#Gb+u.BϤz(vY6YE5;#YMg hp`E'?r-%Ta k#7=[})|}(o{; .gӒ #Yy)j<#YA ʂ`5&;"bʬ#n0v)Ncg1xS6'_>ۖbueQd"ݯ0ok1y?fJϺSNXP0EՀGo =VX0YNk lq7Ѱ/ӦhOu3Qp y 5O.رMBHKyt<4#@e#Y.#n̨IMi:8(F({1i ڀۇ~rCBeWN=BuSҴa,'أjl"~$#r$ Nc2aYm#YES5#nL_tT׫o7Ή¯<&FV9azbeYJNǹ0]0y9EΞ#na۲ШJ:":r9V#7x9yu3a|=#yM/UjW18d0ˢZ2;(UU5a']fKTyvp0e(ݹGN7:D@^.eTl 3qq0m]MȇϚu/J Raљ[}HnL?muF09`8x*Bp3Gdk82?io 8!xT,-uc jp@5 X%A&WׂO,%p5tܿ#nBXJzYaiQw(y6j/m#Xb )#XCXވGW@YTT[FV>||e\Lz}feWѢ*Iԃo^(ɖGЅ¨F*4SgGiԼDw#Y@{x 27 G]f.wFWN#nF>KRETP&tM3:sw9^^ocF8$@mCg< [wY$w#YC.ԏ#JdD7(iA#Y PKQltk넔g4&eCy晜iC)(J^lӔ-#XB1eI, ]맿663\7y/,01݅1i)"ϴ&Bقp3;Lώ%>#YQgLn5"=ݷ`t3g;g$LZ#U9l7>4\BUvɝ"-BB3ӻ8|erΡ\4p5bQoQcSɴf06!7(FO'}~}#K*[%gC4-mXfZ2'QAi9[Ń2\ ZA69 U*v~㡰Ё!to:-I&xCٜLCKryU16!9vdոbh .لǥ-9n]VF6LpL´˓c9w#Y&pw9*dm7. є2 H&# HuʙrҟΌwM'/Geٲsݘ^"aջzA^:~УǿZΆ8yGZ,X`]HL#XigqdN@rR6'~WwCʓHh:wAFDn [i]hV#c,֭#+Wqtm8x;JOyKQR#KnAsL@]m4ar<åP&GWM&Kl#XoJј$1CiLs) Jr޴<P-GɄL|wiô,+1IvX=z;W_UU]]#Y(vj@FPTKM3 鷣@/Imr>EK*iMB]Y %VX1:ܤw]IXr[s|0z/Lwy |PQ;:<0h'&sBIv),#GA?-\۵"7q1b"1#XtV0@D?pYn8BCq7p1S{#nΫg #Y#n-^12D{(b )TNx -X>\% n_xZz0$#Y~O~FƟ#n#nf hݜ7pjpc02(Ў?H#X .ۄL2V5RLǧEQ9Pdz-ⶠW&~sݏO3Ca@yԗe)B}]"ؾq[S|#nۢP[ʸK# Íc-(~798>mm&&;=qKoa*)z0G&9L L [Ag>DOwpI.3.@k B(k_R^kULR?hvB-:ǾpGE=@g>CU)C,?ݛ[LerSUE7,m-|,t3| vBU#XVTx;:-;?9e}-53;z}x -xd _cp:F* d:1AP{#X7[Jڵ/T9i4}aaI|b^;qMs4O7! iL%ɒt`pl~׌qFlqT`+{QV`wN">YofSe'~ZF8|=_I#n1Gn~RzrBMg*^IH]#n1B8w3= "qܪ[{{ qB艊<;:#Y(M+oextLw#Y y;V-̧ѧ8ehzE*XX,1nҲ&,C8"+6e5fq D]lXLlc6nX{Nb9eiвpELj#t^YuTQHT麧6aÚjMĵ{`^0Ⴥ돔bV5[/=s(>uׂ#nx-xIЦ}TLңԹ4U#XDJ~,3 dӾ G}p!ziĴpoΔOx0)_M_}H[vt}1=C42wuMͿ!.A~-`-g7Ǒn'#XqOi:'z|5S~>ν U-/k2fJH%$8xq G"~C5.>g K{5~ߩO8jl8@#Y2o80OinG<Fvx2n4C7F.d#X`M1'\85"]*;M0/`x$vDF*32%6q77<\s)#YyYt:P6&uy.I^zv&{D+k[OQťeQ:}ϝB(O#nFWlJ('/imK#Y,$D*񅶔 TV)7#n#YqQ)#!Kz+wej8,JqwkOz?SFz#m,#YCFhVckYMo႒0陽by)gK96Us:x5((hp/{ahS5"@0"[ 3a r$5y2wC`a sPj eFo #EIIiC(ǔKcJcqBbw@#Xɔ.6䟣#7> 47{3y|gBK{ތ#v{Q-\jԩpi)8D}RNd+ fS>(TbVn vZͤU+l#Y-w*)a\w`0(8HwidTsGQv7?V!71Wibi 7ÚY51*qȆ n?)8%Fvl5 ߘ彅~Bsp9O#n>ɿ~|(ri5Vt@c_7xK!Qrv,;c1iS/xu 8;u 0ߊ L%948P\Qߪ⒈nAiVUX-ջNXe'8#XbLHˏ&_qh3%#ysFBŠ؟8w;U.Ptr߇ ,w5PRR#G9&Vo.։q-pc201l6xn?#YN"5xxp@p)Fqϟo^j#Y/nd>7oeG|1_k|pݒHAB:}Z&Tc1 AIKM)q۱VTN?DV#Y9-&2\AdվKp)qL_ؘ0(7R2~P%٧T]i]׫;-TXݖK !6Z'4ULP%(4{`-ZT%%VH]A#Y$y**O;``Q6KX^_T\Z72#Yœ,ePZ#na,RjȠ#XelPVt0#n$ޒx7XN4WDs.]>n$=6)؁!z<@d#n&ޒՄ6NHs_#nQVb!D*z0л#n ]Ô*6Q̰fYܢkQvJy7",,MYJLG@`r$&bq<^Ng y|4Lb9np.P#Y@ 1W_jo-M_ǐy=clS_ByA)\iL6Oy\~pQV軩V4`po ,;o@f+aIψf;A<|is$s\ 6*#X-NA>T߫~ MQIR|PYnvNO)3/^FHNjjJ%'J?=ԨQ=gwNgoNͯV`fG& Qx,wL9chfC#nn*FU(;ch[{w~gW$!F3dGh} ڻN+cATȝ3t}Ld6"oɹSu$j.`F6@m6MCb/#X#XYdd R00LJ#nEyJ\4D]%@#XaY᫼JQc48u۟х05s? = 9i`š8$SQ ޲#D2=4toxg钎kXZ|b7]}LW7y"b-d˕0qCƺ!ai|}ZkhK9ԙ1/[un/#X$Zk,D?%b[sĘNZBq#nZ&]/Nx;#L2uMUJr(: }V3viS90'EqY臾cHܪ%~V`zuY)q5Z֧8z ͹w q9_-mqҡnRsdAx \1Z+yi_q|n؞G7<kD,0qWkIA]Epf>19GrtCܧ'HBZZj-K'+WJrSzf55 꺇̜#.t;k7#({#~o9Mm'Ax|ӌu\G3diu/NY#0sػiY9(7x=ດLM˝~eL*UZb.Nq#nSՍu^@>7ʹ9v?꣕9ߜZ5VqYU¬aBGnۜ}0Y ( gF:EM$h*/eZ] !l/YZ ^,W+NpW-)ӭ "R1gqqLF1#Yk|uzPs~2t>#Yx٥x9>ߕی̈֯&1hHt0zZm•T?ҟdLl|6PaRnr\F/)\9=eai4ZHgԘΑJ6uW^ۇ5qo3{˧#9ŒbG͏懏ɬ^=oF<ׇ'.yC^&0a9YF> 1P#nF*F4+ž];w)uG?(i!tE7tF"0xHByXҾ?3)4l.$9CM/"Ui@CZ#n^$1Rk`JNBvB$#k%״^@H5ܘi1H 8wf+~kj1,A#YL#nH&!ĝqQ\,4BF *8tQe.S,ي3hJu7+z%gK.1')hD@1ߍ/_>汏O8 0epIcue3Xd#nY(BS,Xa#YImq$[/s'# /)V.{]ڭҠTkMD<ͰC\3)+fNA^ruD sB;dLq.ML ߍ%o,IJ[K'&9ud=e#XnpPr]\,4 g_E#Y'3Q\.2'v¿j?f|&>/Cx7Gڭ༚^vhyhg 9i;UYm|'6 ZTH"\m&f!x]zVMC I `#X}b#(r4& xl?#Yo{Uű板ÇZ5:. AR]D@."1$?( ݩ,#XWba%*Nwt%4Ofy;Rh՘_v(_^|zK5EqN\o3g |k7[YO1EF V|5"HU|#Y]csCx7뻩C{OT7JG{.#Yf;WuM#n?$yW<97o`:Lg4}H]ױG 6YXg)C4DE&RWܛbAL$-Oanf] f@NnWtT%3H/ϖIHs߷_qRF s_2  7x[e'q{V9 &d6sR+XwRoas^\bXJ@2qu}g[X`#n:$Ta#Ys{/BiF2ei+ILRpSO?f8,k38ZMJ4lqhȒ50xV6ZqF] vEI#fqW#n5!O}2kB+("~wně zeBiS-39'NX/Ҕ#Y!4ZF&AMq?N(a#nH?q) 6s9d@ȵh4 na㋽<1 6SїلH-Uso}W Qpx-d44kE\*辑-Q9>(/MM#n?Xb128ڕYtV*˴iR*R;hmz`ܵAAZo&cfX#ۘVriHF9Z[ԇ-X1vVlrⅻD4I#nї*#Y(׫G>ܨNO\Oqaŵ_TCu+z'=;8F?F 3H|bk˧oN;@qƭڵc=)#X#|( uB#}G_^,_:@eNZ"}xXB%"J"hR4 Ȃe$`=|cqp4;3<˰1AϦu{#Y^vi{T$6I=I#X퐊|XU9wnOaM5Rt@%2QtKGߧGpQn(E AJU#Tb"ć!/ T<|#Fs|;<+XU،NANZ!;z|5(߸FR:*ْB1sKSp#nu}Ɵ еQ&K3~%/R%XvQeqq]N!1P!S#F1oX5܎y,-=! 0b] Z ņ>AU?UqxH8/1%tv"'Vp%f@ƛ:VJ>]LT,9sPG5C,#>]?[w#oӯV?֙k=;A7-kь`.*viQ֕$syM=_Pe8{?~]6UN{4>1HP,7Etxv1qgN‰ 7k"o`ݺj9Svſ#kƟO';!3n*O#B#Yc9mUHgPQPB[c?/20"Zڏ>S{xyaJ>}i4a"[[$5uż{:z]A"0)BK(#X\0Z#X}ΐ6rTР(!H@U}#Yl4 x2w@t/x_<-HDԧ}:Jx4@!׭?H0/`#X]tz{mQX7_:v"No\g25S‚꟟r%--#nڵHXePMzP JQ/"XmNˡv(0xoWY/xoA|&B`_6*ĀRa޻5pi?`dS>6MQe|_NǁN##Jq_KIdRT9>#Y'Yܳ=P }H2Obw'u'4Jm̆+J4՗#X)0 胣hrOQχ8z~/Ug~Ξhm0_Wn;fM>wRhkߍ0.Q> w4M/Lf;zJ=1":kWg5>ve/:zGH HS^ru3:9Yash !0jB"[&MjJMI#dvNdF#Xݡ̆Bx,N MG+E TD4U@A5Tb F,W~gG'yI?pd:=,?ށ9)IJG?͜Il_&"P=w'yG;:Y$}O;#nN#XP jW0;~vOw\5oĚ\vO 4װ}~mk|yyy~X/u×>CG3r#ْ*S^װxO-$_?|[OiRó}X#n"F|qQt-{qq}J+B_HOTߩ[^=Ow+aˆyڋXퟟQ˜y>nݗѬ|yaxj>DQJ#՗ɖ'7u'\8wm:mdYSd*@~iD>]v>]ث0’(\4w݂omqy{:ȇ~:#Y)D0:DzS?6~M:4Qޜ~j.-]OFݹa)~L]ϧ~|&Rr:#Yݟo|q/-8ѮPO!/F}6\kvp9, ]ƣpǗ,Z0o&l1o.Z?wmכ~>kFӴy䨰v;ۏѶ#X^/Kt`z9]}Ki!dZO1.b#2͂S7])l5[.0Ɂwwv{&HI[ }C]0wp)ց̅q._vf͙{ݿ_bTn}_tk!t7x?Zizu8 q??3H~?u>#Oi|rHWzna:Ud/WH`a40= <8[DPxR>B}~A]PZ@mc͌o8,_Mkm~άD|_S#nxW~X3|x1tHhWCO&%^|>|#Y?=f NaGll*;^0n BsauWlGo5Ѷw2cg#Yp3=7长Z<߷K)ՄJm,!~m'?w7>L3B4f))#Y4w0B8?#ݳ!/?Us/h[׵g>#'e;dR'p϶fZ<>D(hmx`AQ-ӈA?]z>|?#Y{n#Ytf"4=.~̻"/l2<z.bQѳ GP8TFOG~O@##nHO7.~Њ#Xp$?mB|I?mȗ'X|rS}Gy=+2_h|7~F{N۱Ͻ)뚝#XK5D1R}nnyg!Yj1aaa`L ut(2=cq s +p#XNRbaTʋݳ6G 8#YwffgxLvsjߢiSp])qW~ 3E- "pslKoNq>HGH{_[P/XEM3©7oT׭\i\t>ah-3?G<S]" a\ciHz9=z1w2]?c|:śp/@6ɿaL,n:%*ShosE=.^HR -*Y8a8ݭoRu`|7 oPFѧ'r(ܩ8 1;jUξ]3l>c2BSgjk0=#X0翄*:xGY9GBAI$usp5 V\a>ƈm5:x0^YGDGJΰy9MX͹yn_y>>ȍ٪s5nܧjxB݈}xK#nRze!MuCi0aA +ğa[C#|Ox9f8awvNp8Ps޸wIM;U#nb6󟟣o\F<|s=a)V]g{A`o=*RØ\@[|&ݒ^/֓ HN*9"ϙ|cA}eUd:s16h؜w<6 D\ٖ(bITє&#ni1\9p1΀8.VҘ*$I8Xb64Lij<uqޞt 'h#Y1E#_HWM,l|F.-r?"%U QjV VBçC.}Y t&?!"iJ{2]~c'( ӅE^7$N@AHI0eq/`#X4BC@Fp4@( (A#XL}zw5q5t^{>ח'ָ)Id >9n8wq_ʽxKW0x~q'VH-!EԧDJ6&UTZD*kGЎDU%t+hchPh;#n8qWidADPbw3D'tSHչ׉Ew̜2bKFޖ!!\,`ʮ3#nmbƆWY ,w1Zƈj38D#n>lYF&g[d LN,C("\>6J8pQfI!s7B8g#T^q0$C٣]n׎~>vs3;87/O/7Ňe8c%;rQ;ڽG.JRp* #n! pȰnҐqdqX\.D/z=EE '2:L]QͶ%C"=~\y`x2#nֽC0{#YݳsK^u焁keN@^HOA5:0pQ#͹?G7\ԏ$Gng6!珤qI%I*m`$8u'0J'9&s?z1vm_ѹGa-oDZ_L[rÅxjg?W-1P?\llj@j6Aa6J6s݌W7ѸGk!HDEz^'\Μ7bbIMØmp5 jSũ*#nA$4-K7?_Gvb4$^a?,M8#-Sq"n:@ghKtM !5pNruSp5Z= *LnEȼJ=}=E5$C٦N } OSz{b4RU6 VS:yzu^\#nRF9*qr\^+탱N)Jq '^iH>C djvﲠ}VQCj"KAL3m z6p#Eh6#FqƠ4BZecBXkFA64DQh|V1vpmB2&Ru'G?^b{)O`"쵵-mwX`IdƅU#X1빂l&Bf#D9atb#Y'0=i:<؂]LIEݶ1'o|lfuxXIN#n=(,iK48#Vy"60@s0TAS\EhMjcY6TcN>K6 PmZ<>fc;;7l Tl0+&(zrpqڎ-m;j-۳ELT~LSɶX2DfQ9HP֢#Ybbj2S?:#nʱΉ[;85آ =U’;rV؍d6lr11'?YW'P#Y)QGNCv҇pO-5K1c )\cGa1#nTzь:~&EױywJ=R$?_O@!!E߅1:&%1o{ϑ{9犍w5֦H1J0Ce`FDp3ӷnOҙYF,34Fsgbw'wa̰[m0a1c'ݎ#&d>m̅v&h}XqrDlCMQj)Igf8Fnd,*]=fc$܍hG0.nlv1*8<s(:h&h׿vYaO9"D#q4 aẹIPviAbȓBzjuz8?m a88 99@eONSHmXqkY6 fsFC†V,@MD^#Y鱶3u9!F#nhD7}4RJZoT$΢"ʜCs9m'N7A") kbcON(c&vv̥jՅrhr 61paYMx{[l3(iG%475n [#Y{uӝiX.>ZƼ8g/~tIeɇEE=ݡ5*\J"N';Fx$grQ{-Sgy참sb&fyr\.>Y]3n?=gprtVy]U,RYTfnD%51'L/Q+V3C!fBWFM4:1\kF bӅ/cgm;KKC|N-cNb&lN`LLF)1 )3;Q-_D!QB{ob,c ˬ׈,Q1iuT1,k=шwroҾr֏ub}*̣{hMgO8Wtm݄ljʼnz /_5t2o ͠MQᾪΪXجA\Zda#Y4RٙTz%e%!.l 읩TRWpZN: Lz{/xmj4HnȤJy[) we7l(Qbgp0#.'lF*A dV#Y43m!5vڝb^Q  $^p jޑe]ޝ7#AO`yX TSto0~JAf[/W҄Wʣr~G>ep=p#D#n,{E#Y6"q@R _2&a3HYc_*Ǹeb(OhW@Az#Xj 1pT7u홚Qo݉LϓZēԹQ#nXG`V,~V4Æ򈤣TZ%"H;+g둨;qѥȑ'z#Yvhx1b|jfc*dH&>Ia[jpꔜ5|dV7G6v-rs8dZtmC烆ʚljd]fJNvzܴ7oLfYU=d+Y|DiSKC`EdzA+&TՕb~n-Cfu8x{CRuH ֆ2sD$%L0y&rd(t"#nh0@JzT|S[@ei}<+${#t'w3q,og o'x;b;' ҠIv! S]٣gCK>fξ]q)/Y琦_41kȒ4[X1Ƙ8[0|mii;ۜꖹ>s4Z;b#YeAk}y>ϫ+LJ|2vNv6I|F3qϧ$a(*\ * A}c/e7P>2H",oKI٪P7CtzԽ,ԅcZ>ߢzgGKLP?jluI6fv4[Ki{(!;/"=PøpOv9B$M#nb L#O"]S~6|M;q#7$nq}Sύ+j^ɡL#9֠#ΈNcfFIo@(Uz5,!hp\&q71nNN212Bn1B&'Ԗ[OTUc[.$:<(vXl]#otHǜDDei0Z0y9>~ٿtpB]#;,a0*/ᑂk#Yb)D2G+j9k918aABNɡE5ߔY@UǨ%| Ai ;/Ey*jC^2,ީK!(Qאee=$Qa7v7':QgM0?: ?XU^Kbwc&\Yi7{jB [PɖUQ'#X嵳ƶ*eE+sRmTN5wa<$f!κ]8E˾yH˕]!,<`CĶgR}QMJ57e ;KOQ3#\Af2|\c9t4៏=w8]#XFmeAU"IР\죿O M׾-^#Mأ1H֟}Qhw/.O#Ym&{- >p/fe<i#Y2-i#YҎQjG]ԷeÜ>˻E#hP;a-w z~5#44pCÔK|x(4䤰oR7_ʣOMБNrFk˜&d ?5@žX^^"Z_ďdlx(SǩݳËgSA/a=5>KdG:ƳXAX36u+g4Y.4 ZCӋL{)e?fn=.g8M:mSbMo:ۛѿtx:FZD%0VlWx<ӽHiaiᝄ*2l&A4˫RE ܆K24f^@&SkB4rsn:n4(J&almj,;E ;0GJ!dbh[\ƽg[e1c9ٮj4jȸ}Y52}z{'^/w^MF02؟n>0 |bJIqe3p*xrqόos?X[Zg yVpC?P~9@90x12݈$|;e9!o &gCG'H&#Y)ϸSn2ӋsiaAs[iVq %3g  D ta^}j)-#97(- -R: q8VY4=y鷏ҝܲ6h|\ zȺ!Wm b-|]}<xx^.ՆJ)tɁ^QWF3مberv]60;†,5ܸV>ofWm0VDGWFjnq9=*vcob,F;{h.F7 MU-]1@QTD z IsR_?/&soMrz}^F]R!ܤ^QΦZa.~O Sn|cg(pnot7Y} + \~xOo]xּr6LE-b `6[@s΂ux˄!E}+YU6#VKJanlfK!dg*vsZ d_ϝhcO<fҍ@7Q0Ung:s<[,Hֳ/#nqcJZdQY3ӓ"dE#YҗYk;u1|b;J2DhQ 4^sʎb!$H?:0P?.b:!Vﰑ4m3WZ M50x0ͧqqUePR(B<:6_8nkiRd,ctq倍ĨeL7SzQ3a-5ƪ(5®楃Z o`w+y; h)=Fs"|LE EX]8sJ'&#YʘPG=ZV.[ЙwU[|GrOCL80tjm,B17 \>aQi4IPWJXc#X\f!,^>2#T*%д,SO0[ Jm`t>pa"h-3EpWOTb0x.״9>`i| qƯ|eVѝhΡViOVZdϱ›ﭣHV0t%|zNG°g^b#6yT-i+9\q6Ҵq#n#XL/`<1`u9OgX w%?7FPƋ7V(Cm*UD t_#Ybr5؊2@e=yZ̨j۾;UUSq6qZle銛֦޶#Ya҂l1DDR`#Yv-}˔[l[YV:/j;Υ(lZ)Y4oK5m6Y2sW<x!ݗ.xDGj"|%bxQJDoü]z\WʛIц #\^ :;ۆ炃U 2l#nJ_9WcݔOJhK8=_&3!ςr.5'$$6f`@"s GzCw>!x:BlN5Oar/ K^#X7GC:k& uR"_U~g$rVSqF&NY`}4$^SZM tJH#n[kaԃ0<^.}{:b'7Q)` ]`b3A#X{#njc 3+z(db䜖5 Nj%l GPn=@,d4G34F>w hDϳ/QK"fX'x]*q&lW_.lP(Đ_|Tw|B!sOuɿd&od*ԳP?(xW18ΎS)b_O2Z}Z,Q+-X}ݴ[[wzǺC>0z~G̍9vm*>_"KΣ1j)7(q;`z׮]D(wϖ]pJ9nM?xsQ''w gK^ek*v#n 9sUaJvGsЏ-q#YXI俣=Bqv?xwq5ߍVuQտSьj\ >X31[O Ew0-==GHᝊ2/!CC,t ? ٳ9tJO#Xenv5dz#Xpe/MKS{lcW"i4ل!ozҐ%SPܝF6f=ac+Jtyے+擞/Q1)U;{sR0GU7K:czȷYL.^ tV~!@|= ]+'lc*gO]E%MT3(PR98z$y%DbZþ4#X㒀0U32=he6Kڷ|bO)eRY>{k-v$?7,S#X!/5Rh9V~5y59r͈.>,7.xUo]`ޑ񘘝#t'\k﹨txg?wvXb#j*t ~=5xiupnFtlPE=sJ.utu|}K&!O0#X\֒TSk)3#X,f7*ƭC7cVV6+AT@9a^_hDVWly)12.=³g#Y .x$\Go}Տϡ=ϓ;!#z36w_*FRuMuVl.vح[_F&pBJ`Omnt ‹vc[Ye[暻0* L?)uz٪ QS1s"jB) >hFcŋ\*mBJ6$ m֣9jLF[z^у^;(#4G,G03EoA,?DIx=vo0{K|/<2lCъ.rd"k?'D:sd#]J#{TDi(&(";7RONA%DSj5{ql!֐D$O6_Ch:L5v׍*5}{"CHz.尤JIO=z9{㛼(񓽱#Y_w{9o#Y"0r$.ObLv87OJ@$)XX),pK@=vgo.ywFg3=,J{t'77#R; uCfj#X+`DytR h ƃݺ/0o6K߻a;zG}W?^F,̶@ad>'G*pwߕ{{3ï.#YJ.ʷ'1I/6Adp9[.F{Ձ$R~B?.?0 @}^&#XȒ"G'+]=~e4N>N7 Db2>7B,Fzf{*\zHvݏuqj:[[6^d1$@Rp7 j%bE!{yZ;qst7^;<70}=y(|aBNNYsXL'؂B#n3}w.+Uo:٠Aځͩ%ymDs (?C&rL,H CI@-(4gCjc@XH>{'!dpM(bCAK]Vʌ#19VI!:Tq_חExjt҈񧂈@|~(RQƒܾ+b q׍VDkX|^Ϸͳ݄#7mU?=#nT`bUI~tȴ,&>#Yt:kN.t:>%nW8<#Yˑď#XI4*SUE;5L_%l]#n,֖߭d&,drf$Ld!}uqqی @Û*\TC^#n 2q;p 4Qy( ǎ/l HJmkxJ@"?#n<%݁ d<~:kJ@5d!lA7Jw hA^i/W̓ߪϧ'mP;5TOp=p`BF !t?]SWKZOvX%nrKyZ0cHr\7dMV5Nt8'gW~S*ohM|Hs#Y0 zKes}]a_zoxtǩL!&oPPtAŠ\H!R~z#X}APJ#X`T]r#X |z!w W`IU4H IwzZx.H?))?nش%O':_o/~8;#mT#RS15rы$4#YidnCx_{k$:~(ZqvBtBLUuP Q}䲐muáǀI^Q, ;@{ rjj1 f|+Ob;$ mb˗JXX,x 3(҃g(xOXWArnyO;u0 #X#n#X'#,o>Q\0;B#YG RzQ}NulŠ$5}@DO7Dzq|a@}1:cŠ<\Zb}3E!6#n0VTUj/>n]E03cv<#nS"ќ[GX7S>ţ&TH#Y]86CՂAzaDEYD5ޘ !Kw:br"9Q?(~6z7ڝJeAW}a7+Nχ"T<9ȡV^%|@ ~+Fˆ8MT&Z~| #Y$LR+ĄpXla~K?o0߁mK"8d~A2̅B# Nu1T`"v8__RjPxVy6԰ HEzgFOf䊮<*Վt#YJv*\lFw*Wn N>!I{:7ê$y[<|#n=hTy`0A]v56S(Lpß; &j˵8q\\h4|y}jZ.#X4Ub%};̺8}jòÃh :*ؕ\(Ĝ]#X [rU#nUq?Y|j]gV"Dَ#YݨȒad_N"G/r MHASREMtH"=!&dfu]%-!!Y#Yîq՘OC'Ifh,9G㯇k{؊%OqކDc¸︡% b*Bu8yg3ﱭrV3Ê_B%Glys0dG`яVM SSQ⣓+x`GWoXI\ctuG7[m 0a3h#Yn LJ]Wƻ`>O~a2lm#(6IO\F^xJyG.^H#Vsc U&7#Y(aCSl#YIB! (a+4C{N"f_54W&İփÅ459!Zu8T m7LY*^c|`E#nx2wCi&dz{DAx!}IQ#Ydc:i>,I0בT#X}D)vA?MWN'#Y|!L .HI8zqF#MIܟ/0Bp~#X1ˑLqgg4o1ݭRH--g @w,߲[F]g66Cc5Z*#3sҞb)%]qW8{qp1on&[w!s_dIЗn YPĩ2%l}X#n7m:lʧRf'Y\ǒ>IV-\:Nz57oc^Gbq:uz)X3.ev;Vpfы/.KcR<_J#nfL,؄1DlbF&׆!0wmA%@A巶w'LagMՙ50`!b8PD UXn3֩ g.|Ekkv#{uڒ[WHepvN6%xYﹼ.j‡ 1ޫM⫄4 ?9ռ&RvdВIf~ܝ.zF_ůt #Xz E0 #nk?iq 'A'5^|O/$OA>{D;&'_?_Mg?gWO:ofu{h>/sŗdZ-;& ~Ծn#i0VphGz% <e7EfJWg#n#n7~RlGΎm *]ăUL)0bɠend߼4MxX IYYW*{цxm +|c0nب Gh|No-- s@zŞᳲ!y?@NE*R ^A4dM>2vY)=z;a~G4QAԚ}a {D3#XBPleb fH&#;m6?|*#.ө9e#K'J^xqN}`sGE$%c'q#X5`o͒bBm/ˆXC~ CC!E. `yBz&,Qw<;f#X"J9GaEJ5!2Ed;^#ʇgvޏ gQ8EdDE`d0!fvvx'C:bA[bzrn@&%}H`7qrSzz#Y8e g۸5C{݃i)#XU|3̻NɲFq0d{7g u:vI ԁGŸmMP:Xf:S Kizއa|ԝڞP|AI5[uυ @5Y{b\yALl>axԊ[z,tԄ|nb<3!.y-˘T@vЦ-:A4 ː/`;pehJxs`^!9Ăi1W! 6=JUIMPhPDLGσ:`gK(;$p4`C6hr;AY2{<Z˻7f*ckฐrz6ǿ:ے 2#>Cѝ%Ĭzjt>$\<\;@m 3 Q8u&f@J2yܟN`*Pyf8H)Ǟa0S "B#nBZBT8@HΕ$@U"C]Q8gKI Ab׎L@%d5&_M7Hva;y`_[rhlQnEbQ,00LeM[H`:ao.w%(PXT#nډ9`oDAHv#FE!JwdV+$.vQ7b6T[VYv̈́D#X #nΧ@~A/I3ȝPĹ2q M^JwiFCP3$güF #nM$0$axs#Y7' [(<:UO0d}.^#XL7f x#X{J9xogɾ'nխ3^YP8+1;I _t68Wk!N9ƫnc0؂"RZ,*s;uzC^a3a3RPpӕnۿD3Wrlӄ5TNF~<)wiܻv9&- #nهwu0ue%k#YC^2DFM榓1#X!F"6iH |M@^ׂ)6R,.O'`h|FC* -Q.W{YD.;/}:9.5O5[J0}J5'L4~kw5?8C"TuN4BZr#Xj)Nq87jqmU v 1C\5u8?2`\#Yp2xKژ#Z/(6@lX8DD0ɱR 2?}J jJRiiSzye}q؇ĆZB) 1O**5z1Q`iYM~|tUd>{oO#nr]t}TY#Xhal6^3s3b0෠pC(|Ow2;t`={,k!ω A lxCMΝ60,t\¹G!ށW|_DJ"_#'YxM%UVO*JMgWg~}#YƺQh]ҋ6#toMg連uU`\chFg}r^>U#az3QwcϧԣGE|q\=oRp#,LYȪj|i{E8@r{0vȏ2ƀ&pHΣJ^M`ʸS~OOI?N]Gx )̓D1i bDTCQ4MBlDYETJݔL'puJ1c~(['h0#W I+,`dvY>d#X>j&3k-" 97y396IHpeXxEc(zd H} El@'iпLC7]̹c~Pxo3d;ܣqpqGO_}H&DTAjbPxhh8ფ?a&OIZ~o2h[hUܵD-2zv' GSzʹw´V<<+3;w.OSws;9o%;,JQG(SߘAJXzslve5IA9(#Y93X`xf'c%!fu)SR])"iRcKmdw\)+6lR{|yHôn'@}P#YhPߧjmlHJHyM#Yo_+8h|u'* {O`uzv(;/A~,7a^W<@v_)wYL#nw*Ӊ~,)ӚM;;,XzX{˿&"b}z8, DU-&3(MdJ&8>+mPy}.2XQ@V 6uKVh~׋@݂%~M2aW A@XExu{k1J^#Y?oV#Y~df=, #YXl?q>Mc:\0fzaВT W7S#X,*?|`̈́!PHHz=Û/ϩη#BxC͍F"jp6ƶug;; aCpۺ@qQTTPF&ч""#n-n'a7X> 6m#XJ]yR_];z ^ܪIqI4r196ޗG|3ʸr"@ޜS7a:\F?$$U"rOh x>|ઞ:#Y}sU>"~~^mc 0Յ&% ,!l-iE;f2@w]ٹPv8waM잭]4P]ΌeHJ^x z?˂>P{᭏I8.My#nNEj $)0HBwZv*̀1˜o~ ՕZŝ#YLY4{B#Y?r;|97X:QM3 rM~f.^d'{j|}v8yw&I ?34 l_Gw5ۿvIu^ҭ0=d)Y?4i<`Ju|5?_TZf 8[#n#>¢lDg/cU!bbrSG<Rn|t3z7cLnr#n",XN?C9pz naHMg}^ (|6#Y4k51n; PWZ2COd;&G_ꚾUP8/X2D@[SHCuOwEOwf#6D#nvkNs`@kXa]{\B#X@jrhH\̰?)>Lb߀eGNG[D#ff?Mk?ys6IL-9ȒA7#EV(<}{deF,vN:r|~p ""`:11?{:#X #n#Y\_#ooX k^2tzJ诿?I~(C͐qhNҹkWqqC)_ZYʿ{:mi&I䝞] {?ZGxRV6 #Y{HȋҬd*AޡG>rýWe7G_\j!lZF"Y>8#Y T(;Lzrwd#X$:B'=A>G W ; Tq0),;*GG2k^o$$dvdفlH?g3nûCwW#Xv,~+lEvL5 #\)%'8h_6Xޫ/a oT@oݩr3IZK/&@#n- 8@ކ&ڟNH)O@£(5^?%P>4@\~NO#ƾL#(c =ØwJ''=zr+# __|ʷ7t]c$I /O1H DNt!:y]gA4}hD#nG[^ʁ0&Х`#XcU+ӟU˲_krg`\_u^tKy1"J_`r{Ac30}S##n8|0HPJw}1:o,a)0K#Xxsbm#3e\&:`;Dž0T)FrgUM([6Yh@u'˞9d 8l*1g??r!WAD]|,͍qռ'żjS !AKW`薓i첛 `oKra[UG尯*lQj4yӧ/ŜgbI \l,xi2#X=_!sHd+ A!Y%Ġh:&9n? EA@j7S0eHN)ͺ#X" 髡}d1E]KjW8_#Y #Y18QEra} VcQ=Ag”hY\cc,S0[>#n#Y}of‹Q?g}^~}6@#nR2#X 7 #z@!Iq>nqO|)9 8A$nCa/>ɧl D`.8B$nˉ?)lt#Mg"F;Dɼ۱sRp&Hgp+@}ӡXuCnoq̠%G %~lĨA |J>_{[Kf#Ky89#X2? FYD|x=%jR #YXfP r @4.6UDXpa!mZ:v (UM؟3Y(X5pUrl5B.Ԋg~.j^a@4!#X#Q Hڟ#NmeJ z-&"܄ϣ!&S")HfB$ԚKuDs־od:lG8UmGό53B;K9F#E/ޒJln7cy6W\hB8.*#Y_zt3Y^r_q_$ 972ή(Ϧ{l 4uH )҇DޢQ墫qf_|y]w'%9S.[1)>răm{Sܶ":eNoIV]W&]W#dv|N;#ŶN|jЄ{;x?ǔ )rG3vŰ []uT}]<õif\Ah.W˘\Pc߱JWi]9w|q{1%|f98u~LNQpbA;cB*p*Ii1S|Bc]c6ΖhŠ. `/)X-׵Q<F7!+a֫nQ.񓃎><~]pڸb^KK}G4ԓ(5_^*^x"5?k#Y1蝈ޮa>X8=b;ju;rfhON8_s]k.ĝxHgI!#Y_)ݻVk ANnR1B-TԐl>63|0fBqZpo}yǞ4Eɐ0/;5?WEvJ݂ZY2zo^28L9䠎wTd}As0e6?"D^4B {^ӕx%8{T!LJd/+CZ7<6IFX1Ö0#׹z(+g;/*lV"QĚhq)CTX5걝Cȑ6iEȱ{3ʔ78{xFK`׺s;6;r#TÜoɕ|sI+]ZեO.X=-[Tft4J(v' ٗ eItNfv#Y/F`yNQ3_&nZ-E]C~ۯ}}qT*D3`#XnG w{z- dɕ;mLj?n"Et3z]3 *3R!f+:̠v}np`QbH Vi!4 n^m>YLo`\l_&'9k9yb>BG3w"EY^#[3{y mj[GOK4coY)@+cSAωT$rEr^\Mx#XD=#HA;';֥,8EDc.vLJfj|nFqc#"wn67_׭}5Cpձ6n!|Vad7c ҘΝ-xaєb%~La0ⰊlyZA?t{ZA:˂F#Y~V\)3u3 ~~|ٳ#Y?M_6@vOX2\R" $K;Yd<@G!5%5) ׾6_'qH(Jy3{dU9?O:3EK|p21'D1z z6Y-TOR~#Xmya>BB?dBWl26i5`G! Fm}|&|\dY]zp$ҟۋM #nH.ia&˸`tڿ(}2Q$3GCH~"&_TVz#YvѣӯӇ#nfO8_f.Q#Y#nG (`I%b #nUҡzYbރEb珫u^LdCȃC#XTB I G1HjC#Xޟ`4o=uni!\{gu>0|0LjG'э<87ڐ$G밇݊ 2~qۀz/KeBʽkU E3j&3S|QbB m.4 #Y2 T#nx1L`2HAyRBr"LUsۅ#fRŁ q Q.IvBߛ.'"?p 2i-߁y?eesS7I?=7M#YLU$OSrRXw⪚t"g .#Y۹#XOAvy IJb{\#Y/AȈr9w9I7F }8G#YEݚwW?[#X#nQK@'圕#XrJ9 iBhSA#na&B#n?=)ʃ^797N{D" \((5tpMh'< C #L!~#X|2~2u{?#}?~=vm`ȈkT,$_OF4}>LyQnPTBcC>)HLxzU嗋Z:khO14(%@#Yʒ((`š>#n0DIfHNbMfy"#Y tЖ,AzHr QG<# Ez`ȡv#XFJbX$\[ײxd%iE`vCK,{OVr>{ !0 46Yr LQlE˜SfK/z4jCɏVz_o,< +gݚ_v#Y}LADDzw:M[`{ݍXmg'AA茔?wxwF*"4kˣEHv''rK}/2b)_ʡSx#XcbqKK&/Ώu?dD`#LIFTDmFyp lFN#՘a $dNO}!#n#XЇ*>gj>'W̍PA~\yw$rϗ#UOP ꒀ]"8't |;#XhY#X콑ď bPHPSsXC2=YZQa))#X>1)"~T^)~sXh|r"NABԀ@U{#XCc{#X#XxQ Pk#nz?_X5wg7_\ݴG^"2G"iDkzy(|*3 !ۿt?y}ϛUp!7=\ng% ^SmK~Y(|2Vp5g6|x) Gو4vd4?lc.g[%Jtr"4gw6ޔBD]kSׅiWUl1Bo{k D<&*mޡJj?ܨ G4I:ad>,ílJWAL!p.ٮ$1a$]pY$ΉQb1A:X>(PJF#DfKUuv\]xDP$n;q-gx&>@,PeAx@ [\O_}zjf̂?b?2ǏCA?sFy{<(Ω28^:YDAӸE4̌mup4Fxkbzzxyp|v26d'vql)DMCPj#X)'tP^*x5f_C8on#Xˋq P6ٯ#Y?_~?o1p7g)@%臯2=3uR:1}h#n6GK3D@߇DP _&ߠ #YxJ%#YP?oQ5hәot:kY_yt1b+GqotzvcԿܯ M?˪5#X?[C].cgתW>ar:i @Л#X}^GF[ y@eC)  @2"NG#X\!#YgZ^Alm3dso%nf21##n[|7MSg$"but#XSAatBGwws#Xy#XP{.Ngi9>q=48ǒzұhSTCƽIF6(qIcipGb#n#XDȑX(<2t0yM#X*(Y G 3QݭHϘPGWtj@l)#nses)P`bPvdh֧=Fxg &Bvš's&hs't_W_l쁷r>`ȄΙ5>ΖCB}Aa8Tpl?k~s#9Fes_ fQ1=`fK'x0u]`%t^7PF(,a`,2SXZP~+|:9Nê'm:x;C#r**D{f6:o=:'4.b]3Zƫ^ Z{#n=@~_@#X_]5o<Œsߜ'2r02طf2 6x' )Tq5#Y0BJ;撔(c[4m :=栽\S#Y4H>9n' q:*‘c$0pFU4ǼIh.OIN1v5%#n.i%#n<ժJ j5k:.i-ԓ^ =%F#ך2`8}9q_O5 tnCf<" #nPMӇ) z_HJ 6xEik:HVWMDD5_ɳVr~7G02@@u3D]_;sO#ngk/%)+#Y'Gk#Y^J{#Y [Z_HeQ_Rﻴ%q"6%7*{7}_{BrWvCZֶUg0X(>Nͳ}-3qɿن#`8Ra~8N_JPkG#nj2,Lw.{4z@#n'R:ذRNG&c,;?JmD2ml.:D y, IA#nRyZg Si_.ͱGcDxi*U]wTi _T>2y'#c˔j6}E-"p$EL%A4eξGsmo#Ym#E7I 8;x"0-}|c9 tJ,#n'E~Ѣchwp`d7p/#STI}Lدb=$( Uߗ_V'Ɵìx15kl~PVj`Xa$#??E-#Y2 AN?q˗n]kC=.n -=L<Ncop4O=afr"'$K9Rl_( )0>?/ç3z,a - g#X Clp54d`v/Z/ 殍0T U<]#nlɲG^I3tZk˭FmIUkUK[V`LUɸd%z ְ͔240c5K2=wS4yT>^u}5R#XL_J64C[431K||8GCM$)#X2;5tYYJlbs(ה&2׌$8{| 4lM`CG?=~(vIGA &?W3O3$ J/-(NH=#l11^/d#Y|~@5#Y0#X8O$!}#X>>?BU9n>>Z^J)D@j8W8c$m57d;ƺWEAx>f+WB#X*˾l}_hXlo:^p;D HhG䚩4!"K~ñ#B9a?bNW`?\JeMƺ:yi|78\#nA#Yh'~3CY{GOtT&ә|IeSP?JHz9Ǟgw8z4%OO&Sm#X1z?Uo-H7 'g3>MSH#Y EAD\Ϝv#Y:#X#Y^esۜzaM̍ YCc KÒ$ #X֙~-&ED(ݛ0T S.44#nXzd,e蠗Ygy'gs#I_ˡ2Jx! ji +!rE*0z83iH}N7`aKF'I]'Ȱ:43NO_@>sm>i!~ /JXO_$ѦD֧#Y,sT^Rk![`r+ql\p0A8zx% #gκ>_G>#n]>9]וԝ_Po& 9Lx'U8zQ%c/D&]܇aMo 8XdĜ|q7.֏RkT+#3i괆#YM@lBŽ#nUSQ #XӜU;TN[; L̰Lِ""{r;]ci#XQ#&<: \#YC64UQo4B/ӿY !\#n-19@}Mb aWrv#YĴxxt)dO@~r|HzH^b>3Ծܙ{@u"g~1ź'#oZ{~Nx[ @3qMN`67`}hLCH704nu+8r-c*[8i$j>#Yk94Mh񥦍2<؍MjXpO :aq!-p#nw~*UԦKv4UBXnn*~ú"w#Y0#n(<[?Ԩ^ u@#n?Hh0Ai o,Ѝ;uU{3+#YzG$-z?fvc"h,&4h2@;! cWOÿeO_wIA&c,W"08BdzW#X$^r辒ϣL݃xYW ||}]6$_Yf$ 9BwV\ƑuHA1!i﹏V琤dzICTDR2$Ai2#XAz#n#:CxO'W/`VJy0g^5:NϤ:T7a9wGCMI>c%؃ٱ:8jzy$:'éϬ#YYvGUGo:fROrKAX(8AԱ#ޙJ-6p{1I cYgJ Gٙ &I1C!8t#n?Ӱ.'49ubilzXBCqt\#X^KsҜc]HeCG领ͧ{AfGS=#X7r*zP#n$۬;#X:O?W &&y#Yہz ȃiw=C0U]4Ƿ:!6ɬ#X)d?aHb $R. o ;vʽ;=#{ԴP***X~~*X{_/50ԲƲ?B܊#n&Ilk^.0a$% GπѾ:4cM,F[c!TM>?5`|zHf Yag#n5nl,]s?)T:lt8zGhTE9pCÌ'`y Opξ=?yA¿W7?z]y#Wx!yYoF{tOH_zӏ(LgrK>(ɦ=rW @HH`3јKL# e*t,DCEdWgs/6m-#Y?E̅YB$tӗu?\€(au9#XMzH7+h9DDrC0I(#X=#X>K;,vZ_N*8_2fu!,g!(Bw|#Yu5|f'|xtHj4U[Yڬբ?ҊϣAHaM$# 7߆F~RNVV9rnAgٕ)Lʁm&SFA{y;yws$''WA~@w96#YJ(fNFUT 66D,CHAx:D88A2Cg=IݧSuOΛt2/9^cO5#X`]T>~?rxo7{CМ^{{ڗLd-*@#Y`WvaR`6yn;4+jId˸zrrs@0۹aK*N#XzP9WQK!TWr2xZ_RWƣ#ag:^kNU'Aj~!F]3x嚰wd)`8TGDz8w\rrUֿ_NlJCt b^=/#XA(q1DwHӭaDD3mU*6gdƍF OdPD.#Yx!h#YZX**vuUQt*͗P 9"R`V9%.=‹1o<6A%_3ٶ֟s/{`_HRCHv!97$N~ϏwoS$#nS#Ymԥ n6;$&=ej5FCz/?f倈'`8m_ ,8>T?IWIGU?<Ĕ,`D W bw~z_=ch(Oa׉p$tAӀ9Jۂ#*=#x$6(h<}&uX|EǗR:cH~8l`ԝƠxs#[Q.l:gf_ Dȹ~tFx?v٤:~9oҷ+|@,Ku^(MHzR 6|~x#Xh&&C,{Ba&8n05#Y d,D%j蟣3]@ &?/EL-!<*DI"BdO?A}l >ň{_|Wǐ>'Ψn(B!Eb/C.&^4;?]Xs'8p ΁̎9#nY@k Ќ9}sr[gÏmR+&;#H_׺seS 6|OF:!2'8M#nsr^*2 n3 S#n!}H9VM-!=Ng 'U#~f #Y1:~n=_HIF 4c#XC=3!pW> 0+g$$9:g@ C}@5Wq^}vI2 Ֆjp;OB(J$0ÿWT/HtLlOb|$#Yw>E?BJ`e+YI$QVY$/k/(<ΖuC2/ذ#YHc&΂iA0T1ez*96ev|X+f>A8Hd'#YWMA7Q$hTGHm?eHKH9mDqqac'?~?W4>Plr+~*,#X`!5=S:^֒bu`@߸55k#n;"WryӰ<=P#YBo.lXڀ<"/MwaZ˦G1*poFhm0X Ї#Yab2!?XT?ro5m%&<~t.L6($!E#XLQ^?"("6#nkv~W'R QzV Lӓ#XgWʸi#">HA "ʠLC$߾|1I|:$_ΗF%#XR#)Ez#Y*la`#n}QGJ.iP3Cw _@%H#YሸoPWgn[JمQFx`;ߧ>!){.ab*P;&ҠD kXFğDcQTX#nE#Yz}_g. XC~hOׯ,4ߩa?)Q'~C!ݴwC9/)w :}xE#}k80)HŅe2=" I\Rz{.mV}-bh䘂RS NQF4@J1b^Ļ:Ppk*(ɪIOsױZƲ#Yue z6 Z#X*^9dQTdP'@QoRDRҊ  /~0Þ2}M~'P#@?n٧n3 ~#Yb?_.^l/v|'䖞HqoBwT\rĂE`6#YeD".[2)H]>m=v%rRb#noLE[x26xa^ѭ7";Sj08[xc0 8d#n&s&If)Q7N?u-٭l01`!0u7 aցtP8}Z?=ӊoǶA~)#T 'C#n.*6AØo#2~PpAL BtVl#X^#Y :C#Yc-0q¢,3z5N8QH+ľHTQ>-E,㮚kק"H>6I2#R~"=}t흺_b268L@AI,@R e%krE8'R"4glq8({Ƌ >'".f :W>qym5Oc(]#nJi"8sEɭE3t(Lzpг2RNּﭛ tG5|gb#Yʖe#XcW3[#H0V`dP)s22tWl4Zxr#n@ 07A*)Z+tZ2|խ,j@d뛸TdpDH|7b#q++=ı{"-ښ*:{g9̑.#n61JIByƫ*f ~l"K!bn+j>9'ז#no>Q_|sIEiza/5 BjM ;RI}jܲ|&58M=#Y]2^4x1tCKbcƼyw,KL4a%0jNK#Y U:cw1,S2f }}tUTVjQFs&%:$r΋꬙hɌUElwZP2Kc.P2t> @%V>'l8pC*!__y~Jdzzyi#nI;:燞l%yʆ!> G*z}ß;D9Ӈ"&p^"lX 'P O9'(@xDExK#4S CO;UDRAS򦁑h>?y'{чTU.<Lg#}*z>IdDd8dk#X[7!ANETEX+3*&X`N͙ X4#YJBޞ)m[A( }}I@l*w"b:Qmk!uPsYvlC!SܑF8ۜ[m i`|#Xh*XxFBWh<0O3O0cyMvxma .a//Dƛ(KI S~d0hcl7&a<8I#Y:aٓ#MYņ+L4Q׾62 m B`li6]FE+rm;nk^dw5ɮ\a͜-F5Dq/$I(ۅY$6Ί&ShM#n 5FXb#Y*C_s^%گq\Q0pǰ:`vwy2"io$cN'@l'j&{Y C̳O8K:ϟd,%#Hb#YߒI#n{B0ǿ6Z׶/d&Oc<GHbd榏csr]ͪN Q*/{]PF5k2xb1(uAR.eS":iZTJlj7MIН_!R:O=%׸-3 _ E&ˋ)8ۮ<8նl8# eK'Ap+'/l4HzN`tmBCr;f\4)4yDg}e.{xoA=LۓIw_N4Æ>5>%ed8_yzRl"#YG~^=TPͫ_8y[v-D2yC8=@csT㪃E?=Uͮ#X 5=$-qI{aϣK w gBE.P<$YĔbYfg#YJ"vfu_qM1[N3P=dž/Ԑ<@Eב?Lj Նb鬠IpG/ѧ;GPMpq5@ Rh8̠+P)qRy#Xh8wpﳯB*i>>Ww vOȽ#AcS0՝#Y;e^1{4iH<DǣS6NG^f`X4PRQ1UPI>EwᛋKM˜6½=TȪ*-%eyr,YnaAb{1ӣ}Ky,D`0a#oOv ;fi (^W;:֯wXr'#&lF}׵v\=^iBu]:8v$#nBi{R#Y鳢P8-eKFnF8gd.;)jGZphǼgGݶ1oGg `j0#0r'{h xqϳ+#YArnqwdW"NTv;'@aޒM7}ɻ3Ok2rCjėF/%}/AĈeE#nykZ#YE8o䏘1!#7/7bH^~_O92B#YyECy!굅w']hDe4:FDߴ=)j|S !lJ59*!`:a!|uBܜV_#XDX~OӡU<(+Yr@ A<42p2p,*,/݅M-b2|{֌]vY;Lk&=kA x$lyKHLa9y&OU4Z g"16SˆY@`LT@?/j|vM9r(Sz8#YGӄ<ĉG/nF:we{T=#Y=sosO鎳c}-tk[^kJB(?_OOc^}Uڳ#X-/2Lyf:I,iOx@$#{Nu@/t\8Bp=4kߌ̃h*&#YY.16?oehU؃އ!C A_Fdo Y܆xEn'S1όx܌`v){e@|N#n< buд_ϬݮD"wsDۗO/Jj7*cQEg:+$ y*cx1xcmIc녌)!r-;#YJ!*I8G\冎Aa zRy)c7F0cHԌ,ŀԩMFqlCr+'R r?֯4+(qsJ/R]A`Hp7eGI:k`ٟX0&lbqFY#n§B^>ϛއ{#np~ļu4w%N9}a j<ˈtN{9?DDLE%P$ʖI)#X&)eB!eO%6EKd#XtćF7iɑSe,H(**ߵ#X#n@UoA%PWDU{5ڣ@TqP-I5$tWWo*}Z)ة9o,E чDG??WLD,T E @0k'b?#X#Xs͚5#YVx䮲z1u|ɶČ?L+<5: {!(_\A?ZL#Y[Olh4"$q&9M|7e$2f`JQlM vT:H ||F)`w*RBNqF*~2r$kN!#Y5#YJXPeE&2J>@!gAW{GO!x"?`vXsց˿,Lصj n|gNř,Q9&tݭwTh5#YIPG 2ۧ2CQDV{|DoӧVZ2#DDۏP#XH#XPJBPߞA`!D)A;#n#Xh@F4%*BL2*߬#Y>NTW%**#XJ1DD &tPDvPРЊ#X"C#n/ IP}pch.;*= JֆVa>V[{>dEt#n1]Q0ĩ#XUb<{2$R ڂQ֬`?)'i,S1ҙL6M2^` Bd3Isą "$B"t8&qѹMAОR-0L)#nZy4I0P4iLHb$t#XQ%(fRh(HsWj#Yn!0 bqNZ7"$!OÈz(8=]}>4D;Fx߬b@(b=ćb`kc%d>!/<"W-^ (#YF7<Sˎ&IIК#n|RtEwm;R J4Q9IP#Xg].r, <{Λ0EЈwq17bb#n-A$Bt`b#X(U:z=uW̾8O7"&i@QѥsyS?OupZm\4QY9M8Z¡Izfjv6 N:qU7pU=~zQ&#ne^&LqacҘ(M:k&LB:naFJ$׮eW2z32ux#X8!@?C8}j~Y#ni( H Iy!#XP0#X W/كloXs&IqpI:MkMrgwbq*" tzs$A5>od 'X/mB9#@0 j4{5Q,Z69N@,Lu "~l+AfTpUA$ߞu^,i1J6IzDecf%1$#Yxf?vZb4]T8CLtEQ7䭹#D2& -4#Y֙Rd|']%\.(X[2W8ۗP" 5ZC͓l{ʡxxB#XBcU]眺`Q=p!l#nH#;^'9̐JP*d{y@=s܉7IJQXࠞ0 Ǘjg|DB%$Q"])#YTP5B@#UK[b$ڣQ ?\#Xn=-&LMLT44PIU!H4Rn@hǕNH>CqpQ5(@ki@>">0Rvd p~#Xzd(h҈Pw35uaHwy<DDShJ/U#7M~/%ij'._Ou|{ʩ*X.gqDzky2E)/tX+;ᮅ@ļ!>`6#Y #X@U)uڅGm2L^ CG LI$ m9:(݉XX iL N d?/}ZF&ԅw=Op=\slĜANـ[CUnwOb}l!֕/cyQ:J>*u8#YG[AO.{~CGUΩPgRe43EbR#n&؋v@-L`4E?0%5NC|+;S>GO ;!; Cx!&i#n4 $Qg^' I C=tXO& pӋϩz\O\Jb-3G=),ρ2aӤ;.e csfcDI3u6>I #YlU:y̕AϏf0fAAaMy؆Gg[C#*#X 0/#n5ʄ7 J]/lP-(_}!ʙi,E>< s#nL#Xޤ.ĨmDEC] |>p^-'H(\UeL";+DP3!#n;/XF # T݄}z_ݭ BlW N^ԋ"v狡aD;!ϣ9=_Lw݈Psz8ϋ`l:#c뮝0F UDio.-S-#c)h=z$'ow;džzU T0Ԇcm,^=|yi[iª*R,UݤΛz5U#9% c~UU֕&́Y/t0T( IV&Ou'YG9$'rOnP#Y}3rP"DO*ϦZY孇)#;s H9dt}ٹ6ŋ":ҧY˝GgN/{tqipFY|7:edTq2AŘ۵F)?˚,`-jkG\yOA SlM8)xxz-}"ƫ+2r6Yay}GpA@{v@2#n0H65v;0g<9|1@)otFʆhQt]OhcV8l<9Au7M6*Q"T}v=>z[E3ŠkCc|+j,|CZ$H0}?sYHܵ%E2"*]ԉpM5ܥ`Q%Mq/n.8w3A<802ˋxZ>Ғ##C^.Z9#nX@Cwm{'ɥ<<`@uX%8dLj)5R\nQωpk×RÚʈu7Dn#nUTC!ǿM۶mɶ{D`]D1 Q7s$#n˔0U(﫹^=6z88(5=xk&= Tn:|or@8`v<.FG0SH;g=ECi#^%P$*Rto鸾z.X'GG˰}yI@ vUM2#C?^vѺZgS^l}vTѓ kHj#Y#YSuTRDn8q'kb#q24Ziڅ)h&#n&B%%SVWB!Vr}XS5v0ݍ @p?D5u='Ԟ|tG#nx ӘYQcV*-*¶O5)F̎UbyHr]#b#X@$2Fy@bTCc7='8=7#h>ǒ}bIzNʳ#Xl)BF~3C5ZH<1#Yف#X(Tal:T*[J5[u42i(#YkTtC::q+}P 5 :Nôf:2y@?=WN^[E$a0G0zϟh|PmE!~-]ynuz2u3* *Z1QA#+1 Lэ:$09ejd"B#n0"Ex q!AF6T~sMrmg-WHѴsp \$(R׷nnaZd;-'0@t I8W%6HHs!:J(QVC#7x8 qO@}wfR{jKL81G郔=hgOnehd$>D0L:'m, ' {".f ax$v#nWo8櫧}GJRi)b@)F"@6t 1PpҖ2tTTE*iQ.k˓f 4fX#=G4Ө~[1ֆ@&gjE+(|>o'}܉3ɠ}¨>ҏ4J Yhn$>5̷KM,X dwHCn--"& T]0l>X #Xa4ԙC:VS؅ 0w*6iKĨC0kv;a֬E!RE/V|8Pr= ´+#Y4 [QF* l~qy")Ɂ;؏[Sbl?Q@FUXOX{1'#}.Cj(l&(1-Dó!) kU#n#Y1lQj hc].C0>׬1c6 n!!CP FLt L0 gj 7@ۙS uav`=Ω?)6!F#`81#& dxi8s_#Y۸DdHl4/"D's8<4f#n4B3(.L=D]=y9@]g!Z,J_Xc=9A(UApn=3|_'׳Wi#Y&Q$sJ\Zyp< pXX1 !%\$T|ȩY0`iP!ihD?V7h`NsAs;ױ`XiL%KjoaJ; 6n8聊p{9yUH/{f,܆9s> 磓 ዏd`hvk#Y["HuD?[):.TBW`H׃JyB-_$P%MMgEth CۄSM6B`OCOSD~M,'p ?2Jz[[u:xM RJCyXtprkR3_Pzt4n6֌>ߨL F!'80IQLRvF=7D'T" #XxD{Lݬ/ICZgpUIOMa#.%4!=@Hؙ#Y#XpQ|@it'ڵ)mj1;_8wJS?CݒBhTQ#nGA-#XLs=ɹHٲyѢil;MAu$G" Y Q#Xs"(O#Y*YBQhsdT䈈h*Bh1R )UJC|5!"i $;)#nD s*( & N_}E)NE9J/g11A]D(P1:z7r_]tĘ^!MQ%.ㄍ)CDgB: "d ֆt7N' d9{MG}|#X<͐:;֘Mjp32C3Io0>CIG\Ǿ2^:rLK&wNX3JAsZ5A#naY$u2Parbi1W {-(HP<ޭ$m<"l'L7Xc\Ӛ24 IN700r#nx #Y&44<,5%c_Ec ܕa5+]ZEzj#nmH8]ܦF#Y4Mi3pn5LK(h< si<Ǽ #(MVƨC]3Q̓VQ,ڥAO,uhAGdXi!+5UG:HVpYCVw{=L$#XP,S4P˪jB*`ԺgMa] >y;Y[>\:u3V܆%{PDm6!*CN|>*qVH+|DViXFqauF [l}69aƗDX<79nAN ԆL5GcqG/6_ N`]#bχlD! '#X&g"j3 8/46L#Yͺ`kPIڢY^B~ ڂ#nTV74uçf1W>C)P1n:`WO˿~މ$דz׻j@]l~@#X4@#X!_5.Z D^ՙ2z-QTl{[zIzYUa&hy4Dj;Y{#vVMo:-NL=eWD7^}Gpv[dæHs1TDuzh8 BN杧@uw$αt9Η|[/f@D )@ Jg@~z7xG#X0?O_?(_;`gj6Լ\cEg>!$7c1mN'J1EK=3GIԋ8"M;u,.881X8#=`3/eP4OAT-+fEJ. a>'Rҥ>nWV|V/&x%.N#--Oljl;opSfv(19}L#YӦeQ)Z\T8~0f<:8E>ɼщnOOu֔jtJ(tf=D<\vF3xw:{1] t݆@ڧEKM/9`#bx3tIEa[fv⸚èC#nLr=ѻr(៧t"QY:u]m&kl^#Yb2$9+4;τǜ9xf+&gkM" %EͲ=U5D[Y_UT\#@H굢NCoҘf2;væf;aMM\0ݧ42}:/3~ciY3ЗA;wh#nY@lIQӶ+ӨQotqAYe(%Ă(g}.^_)w<)Gavž<1}PoakҒtcz㞎Y5:۷sHM4{10֣\3?9xz3A l"/PRrpĮc0$x9Î/9za%<{OtԆBri0gX@ g !bM  R*i<0 *Xv02mqVq?n:<3ƞNR h7#nXʤwn6ա%ByeJCf-ZêٽB0fE?q$IX^^VX.Z-xDhRPOYj! w./)E*];)JPʪ "ޭ۲TPN%ijQR&NA#! Ǡ4 I9l5|B306#Ydiяa6"5(gh`Dc1X5`1\C¿H0#n"Z8{)r*fwb *\-9 E5MF+vkz3oX/P &<%E~2+Yt#+Thumu- BbJʽLSOx xG/adgn7unpS[$g%[-JS&rs#Y# rX9)E6Ef3 U$Rfa dF>sU}U#*8'Ih%ţ6Zvf؇^-2tЅx;iƔh19DL)u­*d"ICQZtmH:a["8;*r923&rfh/@b Ž~p%EŽ<.8f,ΰ8wFDn)Q&0VLW j(;.^ָ=IH[;h[2ptxVNYs\BpuZ;a#nC%; f])6s6HC,ڊ"TB͔9t4ZXmepgXwxyO&m#s/PrO3@sQD%[kqYBI6?t1w`b;:|kȍFTc#YNZ^&&߉#]&*gZ|,c,Tfb$H™֎mnMd3p6#8;!wlVwЌhQFr/w7pET'_bZ}лkMYy^J^ u@#Yd,t$ Nt7D/ro:SG*, ؛2rN ,Hqd:O$<1pWeBd&1̹m0l dL+\uF")g83̱S!MMMyktxda";QHj_XHI6jBPO3Mb$+)"MoF:&tۿJԍ4\ː+,h#Y ږU&L7*#ΚN#nWas=͜Ga3q! v9vV$H8(848̊k]=F}Nm>T8BKMO:fUNf@E;0)3Y 6=l(&#Igol89#Y(t0SWvYÇT{%L#Y``1sյbTMΜ^PZAXN:dvx85>E84 PF)ph.3d( Neƒm66 ##n*)#X}D7G`dY|KԝR"E8M6 p!$⼒9tE$DxG0h4C:K#Y2QX4d 3ث@ѡɆBL01L53#YarXa̘3I,n39DpKp#YYAБa.R 3#YtX6LPqZ6y㐩f֮iwίGMVoa3,*yHYİHJPID*JQfȝAjSh5s䰡#4094 " 0潯2#nNC>fN#X&^ϣ}_I ČI {qȪ`tC&%#n#Xe,WOrG{D!GN0s:OZNݣP$.GM3#Y$y#ny<;c=u<8v iN#Y ^9!;~]#YXdx2#YgxKIBB{#XA#Xy.P#XH6L#X0~.v~6Oqflfni\ӗGGrxhx:م#n4}f ;'wl%-SΥ%K PCZI8r򇓵YB "8rDf3Y]r:Coqרr0 XLs3>2xwlpO?YI B0:vZ4*J]PnL tU΋[\֪BU38{ƢYZ(6rznq)p$Lэ ӳM.X4Kı^NlnOe!Sc+I)qU(q99)9;:|&$Chw̘xj55G;oz:>ap= ,rqJ0gt&}(Ms҈I:EBeuҠ X|O%,5T.tqv߳U֣dΩPjĦK=䧗bi#Y9l;"J0x(v4†)s㬔 |$,ú %ߺ.(/fL(R!_^JżxRZxv$̃ œRIL1#YsT@t9҉d:$4U9unpOY@zZ(j lӚL Gϻ+o8оziѣ-\#Ylr+$N<#X;DoMsT0Q!-IH~80'@D))fiĤO#Xv B@C/W (T71v<@5ub#XI׉z6`SƂCM*nh.i4?j0ERn;M҄QzѲ%}#f8VbuI"qu::R^.I AT@:HugI0V ƜbpHV iՊ# 5`}0z|#XЯ{G©zׁNP}#X<ݲ4usO8>ф+Ϯ%)ǎBiQd)8C̈́6/ 0ߠ pLbC dHțN|(VMOVd}Rd͑(@b,?C#XT @Þs!Se`s]ŷ}7`c[]6st5(‘}E26&mpe}RKumE5:&Z˥Gȧ3v!Տ*("'\pfNR#׳]#4'B$#X&Ƒu/X>#n9e93d7LNF%&#nqr[h:bdሼN!VЛh19p-BEGXza]~uS #n-1O!M~#XL1x N ><"JQH%#nDM!CDKTLLP--\JC: (/u>e5ސ~`b7G x] p#Y5HZvf+\G=oa#Y 2l/ܻb,}çN~k1̘{w):"'Jm2#.ɍ'C,1zrceT성|2 x2sny!Hs֟XD=N< \lC$˶39+u]yis߯Cp`>ÅТ"x%tC T@J VR nzZ-g(PMXIGBhuYV]( oI3!ZYE@p(.crp_JBU#YQNtf0J4;~r GG[*f(fyS.b#J0D E#t#Xب˒ H_2t+1#nA#Y [lPPRݢcF9hJGCwc_-LLhb9R?! ?˳htUkhwgaA {Zg䦔4tn"͎U1qꡱe99wISܞ_f"4w~v3\T0Kb7YŤYYڸ4$nbrxG#XX0m sVXk5g ;+o7G)2c$]Fu-*֏+al#nrѶA#5$¤ca:![uXc ÙÓ xr2 ew2=:KtZ$#Xu(2f}:| @U'W@xBʑ!mC$t4ddX%0fay4 XAM*)T :h6E{|$rj xЬB!w$Гbr,M#XX-E<+f9%wWBPqf؄U`r xsf?ԨRqp#X~\!o]9TLc }F+#YL1jT$:CFcM3##Y}ԴOAV}FCq27S:Ot-} 6HXaéBs@#XBZ$bS#YpL%) KB4n!@MY>F+s,Yg"x#<ib"x]C;ԝӻ Zoxw/FfyÌخ1fRi%Lz[Sܿ#YSi89gIAҤ6O8?n&Պ7t܌OXz֓5E#nHة]nOʬHô7i"|L:>g1u&&jUICd'qm#Crf1zHvFPP^Z0}甥5I'4RoVV1)LKq^]XݽgӉo1Q]D+sE#YUF˷If"$18̏MHg#}:Dm @`BoX;?P*꫙nf- Ϫp_کm %6TLIݥΩSh+䗴BncA8k %ڱ16KshIz9 6.&/.s÷s~` ka`7vÌR`;]7|g>RiлQ\=QC11T Q47jzwװqdӘMQv2`=m,!4s*drX҆u孓#nFĄj#Yw$pL6ա:9M5t" !CG&07Bp!I#n"i|;CrT=J:J,$<#Xiu9ʬ( ̳#X?АURi~ewaXG :UEɳm=UΈ$,&{]Sҗ@0l9#X:%ۄ.R@`\[>d9h#^b י>( "HR v;`Hz8:3!JRDqd,-\멽 :k.)*c!Ď'FoUpy;b!ۛf,m||~zaQKJEA#nA(S%F9 V;Zݷ';8ֈZCYIbbXĹIhI#)WF4f %T"VtxHxx0cξ#XNPJDEHAD$#XХR ˂@# @J ,==Fr#n#n)(P#n$B-=ݙSTU0SH3)C*hsB)cE/2L@P>>Ԛ]`Mm1{"RMYTt?=wM߁H*H"B#XE%-DM4U)"Gk#X|PQ~t:gGSBl Dh<3@pwICBIԉ] EK- {rQAN,Cvq¬P2)U3F%A"L{\kLĸ5Y%u~&$άu!Iv,Io MRsr}@:P=C^_Bv6ybͤ+514TڂO6"b>&)ik;?wƕ"/V2N@p2PBT':%b%d&HdfBy&v@БQE""@LB-#XyfFHdtCX! g"SKHТRo_UN>#n"; #nDЏiT`&hhH#nG T$#n+ 4)#YCK亨)$b" b#nh#n()&""#nZba#n H"&X*b $ab*H&$ hj$h(i#n`#n$b*"B" "ZA#n f&"I"e#nI@!X#nP"b"TR&!) $`dNȩ-4$AEMDB L"3(#nX#nA40 !*$h"Q$!DE\Nz#Yq雑7^c/x5ЙƓwrJ'#Y1(.'<;a6&| ϴ^#Y/+!/2zȁİ(>{#)'Ѱoւٰ:&:O(ō,q&}1y.`se(ݧa9RtZK<׿8 S~.ι#Xb? 'li6R&]ͲRĔ8󺁱 ɀ 2&`ɩ5q## $xI'y:rf(vT&qC!>Ą#Yow#Yԫ  4DDCRSxb#XzBh1& WA w$#Xi5f$ p#^s~ZLv|Ja\u`:X dz& Su˯#X2'`$b%dF̓/<3KMY0x.,YX#Q1IS|**~2#Yehbx8G=qUЦGGɮ§DW׀i"kc|i #C*~ۮT[( *$DKkF2hflAQk GENQ}@@ǣ%"mUUTUT#HRQvC@leW|ɋ=j +lh )Y sr ׁ#YNuTXl*zߙ2'^s!щfe~`&8cژ悜PF'rjw}SLIsoOp91wU>MW}zz;t_(G0d`q_!E'!?Ay †I:'#Y(#Y*k#X{\'ѩPʤGpQG_0#n~$*AQ=v:İKE@M{rRXe.2G#ngYͰb$$f)d.gۣ$ N8s45ytT&b gK2I#ARH^Rxh;e*& 6Væ H"cM#,쇦%,t*%‘Ӽ&UU'mݶKQA鞩Aч#J!pCG0$t"X*h#n@L`;@$E?4'@#Xxp};nMP#YRa``O÷e/E.[̓ƅ0##X(w(xvccX,a#Y,+6XLoG<jQ%W Q#By(kA3n$&#QQc(KX#Yl6:Gm#n"ŒcA!T4EO&3Tu? ^*y9W +텶Zɮ.]\sߜIpuoqzpмbKh\*1O`3A e;1O)FJ0_nU(^oD/@UcbA!LdJ  nY+Ks,|3̽9;ki4AZ2kBŜհybFS6NObd4Sd@j ?RSs-(DChv#YH؄d7B`1Y#XP$>Zk]EǿEMUQml{,A5ЉnzlIn %CQ$ y]], z,ri#XJUbSm0zb!̾Yۭ0iw;Sp8xxq%DLFpjLBii#AIH!o_eOHxPiLf$b!yȫ戲䷪Cv^(e C3I2D #X˯FEMN#YS]{Bb#nT#niG/#nJOi腓@T#YRĴ1w`bU!BSO:ʢMB44#M0T$TEyNf$`/ڠ6X(y۬t28DSU UAT%дG`|E2 w$MiBUL)i0h|%8QDPkLz#X"]/lSڃB4M#Y=|+ m294@ʓӂImzͧ{Ls;_< 4i#n;3p=#X!郱d)ٹ7gMbe2ӚLS2ՃJʃh7+{N!P2 iR~с*wD<7(`}1E#Y պχO 9K`rm6QFeWKզ3fuDz=HaϦ"MSV\ <:BZ(`a{|КjfGA]R,Ovv5bL8xGu_7FʚqE& pM}RP4ҩxsdO%]vz{~|LT?BN؝ P(-)I@WJP4%% R4HB+IT DP S2)B,N44B#Xi#nB4#Y!HIRP5K@,E(#Db:#X,B4PSD4AET@4-#XD4%H(ZB#XJJJi)F()b"B)) N#nD$"m#X©7gOxhJ#YC !﯒0vB^] +֙+E* $UJFh)H ״#n3 >Μs*>~K6Abœ!@<Ay&EQ3YD#YMv H8#XH1gnE\Cp˲ ;1UQ#Y#Y'xtOЩ9T=P[[bb)l6PE ?&LUE& >RSMPS4QMPTAID@LLBJ4AMRp8$Аzչ?Ё?P4#Xΰ5@T64RZva PhLi7&8$8"%#Y2Â#nXF!Gz'?;@6#n#XMQ7mBf)l?{"=F𨠕A/QC=ضuq _^tԐM ()1X799es;7;#X+Q!@wcm롡%z'FIEa 8˲"L)''Q4lDQ449m Oi ^D EZPZhĠM(CH NJ*ҁ }Up6j NB)HJ#nGOp(|ِ&VUooSZ#Ygj47[Dk(-&Y36Зg t0ӗJ2fi(<7O#+dFQOϫ$,;#X^sn|^| ^P#X?׎RN"D#Y|;aU,J4J4#XbJ,0 ДjHx?ÎQI5ZjN5B4]_uU$;O$2(DT::]\Rn#n~E"ZJHi7͆}Iy`p@r %5iuW>/{([_E4TOH`4]Y"zhRɝ֤ƹ D=d8&Clc2^MŒ`ܹLK%^Y*(%()+Fŗ*)98'#nf@$NΨ,?SfSLR̵~\]Qόtvt%+),; QJi#Y#qm!(i+8chk0vNG}IF4{K$"rGr֢#{%yDvy+x@mdLh 5vX7 IM21;v)]9Ay<܁`(i#nD";&zuRWsӆ'"!b(#YDmtEQ6栊VHHr ãP}kFr1ƴ3@Em#,K^l.V5rc}dd"b3TLG#X_y%0TEd| P#n Tu~eG+rA!Im_ x:KIDډQe2Δe(@"82Ƀ8 -.4P?"TkB᪈k 6XT5'C9;HGU0 {NlEdC#XAD*$@Ҕ#nz xR#nh#ntRb46A/B<^Y"4p K D&C %UĀP.@i ($)#n6&bW,JfI@H YMPR Rs}BN $() M#XBL 6 ϢS@ss"RJ_e3D@Hf\(ai]A?.Õy}%@pY3%9@=~uQ#n {\0>WtΑ0C ?!vA'5=D? DNJbhvMgo2gPpz^z!g``0a18 !!0hc!WRQGB4Q2lvv%.$##XH& k&i.)B4ٺG]@qE8t@ZMY o7Gdp\0IZq_npN]jp}-VOHWne N 1pLoXCUcq oc^^>{(lЯc!R.f("\9 x44#YXTuÑS{Wnhs_JhRp 5Ѣ,|A8!}ҿuupre}$TǢ0Ao6$[P9<@E8*j& R_2xI$IRCpA44׽1@PDPS5P RN=fd폯V&e8B}Meʖ*1{o(9.O)]:I&#C K#Yd&t g&S[K,[]Gf]䤿ųXڧgPcWr'TmL>4aQ}vSLG.lgRi=&yn&L;v3S#Xd w'r4ftG~G\~o*{v9$x_41A(!Ec,f =(ēk9 "#Y.ŃƼE!nuM3#5*?5p-+ANWPG3d6pT뻾;۝E+ gݒU:*egюv,:cjL$gz$RtNbcVr*z˜f$.>rQ(]nX1aGrҷuvkXЈ+Z1 =0̠c2"N"Q) !LiPQFx-U#g˧[SL2#Yvc2wx'ICO{7q#XUI'`Oա֡ &T#n)-̀/oX xpPa U/#nk<_#X;VXpz:yyG?ǺqLo~^ۻG#YjgB?auJ{Bۀ{ 1@Z΃1ƑlqQ/bPtʼn7Fwe;ODgDS^ !CNPS:M:po1 ́ڃY+ԋE#XmS'}k77okbkf*9`i<\ Uta!`HlC*jn#nHxr4w:d#%ThΠ?y˒tFfu#X>N)F^3*'b>MIDԅ4R -E% !HR#LC@LTSB5TD(1%4@Е2Q1BRM4̔#nДDTPRAM,KIE$Q#(@ԅ13I h*BB)!! $* *U T  DMA "D2EIU$HIEB%CH)!(,"%E$LQ-PC,%DT5TS#4LI$PHLMU )EJLQ$JP%5PpzrI&!c`ٍb1"F3D2̝NaP7N@;?UtCr#X#XJt"PY;@hE0Z@ J2]N3TDqD)#X" DB` [!M"%":{#X(td96Z"w2| "`AT~?ߚ~x P"z׌J4ܿ8ЍP'RQ04@DSHD1BR#XD4>J^ #XA8@8`:@/8oYL@6ؠѤ0@`;Ԛ'[N+7Χj̛3 ]#YѓP9:ğ$'(g#X$kI!˽֊Թ$#a%DmbApbK:W}0uϖ8Gl#XB'D6#XaDy]*xWJX|.{Q#X>H4(oʘ$yioȓ J3LA (X}i1=>2Y9}f@59 (Rb(F@9#X.V?=Ny"O#$f"@w`;dRR*L`m4Dd9q^B "$KeQda(q1i4)JT`ZhljY,9O/{?z}Ip-`H1 ;0#cͫ?Fi⮠qݠ& >ϳ͵$#nBŕp5 Owg,1(/\HoHi{z#n(\9EEJQ0ITRPĥRB4UQEAQP Ü*(dB*#YyOQߝۦeMnHHpa'$3h%*N)',<9}@V1"t/Lh# Ԇ˼´^Ӎc|IZԴ- όbLu1 w.#Yi>1q#g2ΝL$ٚHMmf>(wSE=}'|g#$gpA-4W)?\hB&,J>E(*ė {GRA/} ^ƛ;u C~.$ʣd PwqDB-RK$jBw#3BXƌYR/DŽzn(#n]'֠]j-B#X(Sۀx-U]qG\1boNM#Y,(Ր=lB!!u0#E-@/`<')r}BרFsR; SJD$,޾*^9An+ͧMsI?\ C0䎃#nHb"&!&eN)!H(8|1CX#YMwQ#YŦPAE ;jMqѵOrvy#nTq@Ys`1L6ƷZihiIi@h59H&#nv!Wk?)C`8H_x!P {˦_(A# $'y#Y 2`Ϸ^r2}gTL1vzQ; ݇ GIS!QÞGjjRR!͈i 'Ѵ3N?<,F+"!E!J`#XDL 4F@i(n3^v]Am([?I ;>V9S6':bۥQF/©.F*8A ;X^*pS,\ ٥!R<=#Ys+jYKV{&0RvcN9##YXGōq&bUA#n# hT.5#ۉq-45dEvX ؒDH5jCf=#YVRU2΃qq82yx 2/? $$Ew\҃!#nj.)46F58Z1hYm;i^=:Kg'h;GC^$[J'J oߍ#F#Yx=URxLꂦ^,MdH`Ox^wcς"I4P$mf(8XYn#X4Bv]"A#X?7#|$ wi\ZPy!QWjH"*D ah((Ah )-r"AJP-$H @P1$46#n@4_⢪YH^~QAkh4)'}11L Wu(Kr5enH/+ Q4ɲTc1duT%lミ0䨝308.FԊ( 8O0dnפ-1͖B,kiVA/}G6CAx)HR#!~#] 1>8cm۱=$.A 7@Ł-1`(R=8896qc҄1`Vy!QZ.nѻLe%ݘR'O(TVT١,̈́q "`4E@=)N2*q;{I'%|l!{#8)HN#XOm֕/6Kd~9TSac4dY//?,>#Y`vY8N-1C,0IY׻ҁ#XY7 }#X]xBXC3^Br"Q(+KӍhնk>(1o\̴RçTds4Rϯؚˀ$ yzpI'_Ç0-OWr8=#Y$_ #Y#n3~9U#YHsr=pǧL!Q(e&Őy7ϸӗN)ɾx 8}r@ fS5v^E9Lv´ܦſʰW[fE%:^ocMK9u4rjThcSdbq'VE #K#lmuyVkq+Jq,RZˆ?ThxHϖ\N]#Y_#Y&S5LT82s ܡTq2 ʴ"gV썱R KgRp8,w$m:.*['#XP$3w!Ģ#X9C˴4$(6DIS% SSP4%$O.BS j#nm{ 206#n#XǴ.€O_UFڙBvGD;~&kLS}lvzbCvCZ/:sǓ4E3f#n倨#ns xBEAh[sIνN $\n˃qr(jDpD#n*,rhP#n(iM@= p#Y@| ~fJWq}Ǟdzl=_k}+| agj'XB) #n#XgǤ82Gå:U{i18/ݷ{Llw{X7\l,Ӥ}$w\ʤ!f/V,LgF0\1FѸnzkt`V4%Py I}<n0xǸ۴$Bi;zTۼВ\bƆSiv ÄĤ 8`@$"J# #Xp#nR$HDQ%(,BP#n$8&ǐyAD^X\0ulsAHjhHf,PVsQrR4aGJB%Vgv0&cuRq#n#c*.A6AN"ArC=MB8ASM#@D@$Y:_tyFN{BX"Vk#YE}:N|7:31B; q ˉ=y95$$fcծn-#鑶~^cJSs58g0llŪJ)]9p k10ӫW&:x^SJ(XHL#Y><'Ğ!pfc$pK#n(-`_i$|h^q,4\g .EE1)`B DA#XiJN;h˽0~DBZ xd 'N3kckyӞ|/Bzw@R3)^Q)$˔3ynln 9ʃC#04#Xxb<%U'R`NsH ĤHhp+C 2E.>>N)qʪ#X#n@?_` 1GjƳJz? hHy||_&C$@s-N0tg̺Ia6ʰ}ffhowhZ 4MHk&`&رW"h3E1c7t@58W 6@$ak֊>%-B ?:^NNLi1^bMk`-DP:'{ 8#n:'#4^Vhŏj.#XX `šx.F(sP={^ypB8Kj]sy1 D=ݧo1@gvOoc'#Y2BJ##!J!c85U4#X @.ln u$=}Dvkq);."*BwDXEͲ?Iy#YL60700+8 SENw:ݽrSO{3+ tϺơ:'9UmyC==σĞ=6#Ci-Y"Ho՜Ih<]+*Tè!ېū)d8aHz(C@@u>B~M"bP<1g"q;∻|K`񖄠#nZ(RF#XiA[~<9RiqbAQ9i#Y#&"JaTB wK jه׸sV"8v2i#c*IL7#X۾th,>|)C>(9j*6G22^N䈝!Hj `)TJ#X#bMU Ga8$4C89GFI;#)c/J}f59Jxð1~T0,);0/4}|z~>U^3@ m#Y%8)!IEc#Y(|XX#X% P>Gۛ&Kf#SFc]!Bp2D CO0?#XyHcAP DOs90#nH{nslHl2p2ʓX@tC0?:<͂*>LM4 B\2@?úQ8 4*ȴ&FRhn#Y^ Go~f\hQ@hC Z,NVN,E.'#YmzF~-Ym ""G>;!̅6zPpAIz| ~7v]02ƛ]BO_;yvI(`I’Eݗƶ[)BWu\ #nM?Ţض&_?:4fl3Ҟ|̹w}dFHlg4 @0@5\E陇)99:nQ`pY4-I>#n|om/ iˣC_yf>j}nE:'Ը(y@wss\#n9ց&}ΟVC875?(f3Y q#YŻl44>TH횽MPьE1B[\"4H<NZņ#nF)%,AACM,cfssTҰSALյQ1r5OC> ŗ|c`xG#DT#Y4X)-9Q8\ AA@1jj`w<C.$!#!~$pyͮУVS)] 6SQ d"V*PbfhގfѾ7o|~ѭf"Kn$"\#Ln k6˲G#YXsp/qBban5%Iс#Yj>\j DœyҌy8KZ>\3kT4{0瓂q2$7SCɪbPI.#Yai-(H1kA# JBHaLi7pnkkq;9yDt"7#X14z=& LLRf#Y1X*4(cyBw;ewhE"@ ojޱ̼-1iY:nݍʍ=2Dqڄ-,0v_ϛW` >F6-B#nHއL`{DƵ㕙5}50Ed gQ2QRx#Y]u,cbfJ 6#r I$@hO<}xGN+<%Q׬,x@qJ2A3/FV2#ce1&7a Je#n*[o~)=IFg՘#m``#YjXh 66LԸe8$b1L@xB^ $xY )*bBUBJ%)H%%a!^BCnjffHM#Y49#91uY!"`E`{\8)d?t6,zR ,tpU4$pqv c=4iuF91UI7m]wcKec! Mi#,, Ì&-Syr*48^Z0c@p]׭[] K|iPm6 Lm#YZ 5+#n9Њ ct\QaO1+Mclxeec5,S5ce4#CSk(ֱ61ŭi6be5@E#a1 Ó0LXaD1#nEJ6w.sˇSɖ+xn)|O<bO8'0L( bk6pRD0r)ՠNv;ÎmAT,#YGҹ6**nF:YM54\pFICۑ0nrkݏ,t~#nm{m.ftqM̝!M;' uçm eY*6Hu#yoJeb'Nna:Zi;NSA4sDib{FK\"ʩ±cD( #n(vXBzHm[f2Ŷ2~+9f;eLXzAtWSڞrѾ~8nŘіL!IWgf[fBAeHڪkX6g6fFE-ԄٺѦQ P\s<%pq#nĀK'=NPQXH˸84`3c7QYJˏ0x;iq#XK`Y͊V(`U,|tE 8#n!$A:&7ՂЪP+!o)#XA#X]9#Yj1ŴFk!ssmwuoz;eItMMHKdG@r @)#nܯ`+vh"W=c#X҃4 I3E1gAPM0*mt\Ar)4f;b*(Z#nTaNB NM!!sDM#XRrTŊY@llPR2#]<ո}tUg fDu\%HaGhHXL #n}$/#Xw9Fd#\H(Uio R&)qR@¬#X'.9ʡ3-b2Ch(yP:(#nOw$:M C5(RA#JS4$UAdUT4DEQDxXDEnFA$ECLD4-#XRAKTT4%H4(K@LKQD0E L @PHy11 HRʨ9v#w$ |ȦH8 1y`bop>8G E"A3kF݌E4#Y4!MB"0 @X_V*'Y|Ӆs4Ak >#Y4:E*{!d)E(p pCJ"Izw{#Yd{BJh@L2Д4A#nbQ3O D4+LLBA0U I'A@:i#Xq0A(#XrRbQF(6 ȃ(IR !#nHPJRT(k 0]*8In~U@{o tF?J21HU'rac@4*ГpFS#n&k#Xӷp&"Pfb"Pً@x,[0 &ma:0 H3"wI%^J`J`-P᷁[!^rA@"|T.}6ϿQ}IH*|?Qd"L&Zro\5&haVYxRɆ.t(E#nS!&:'=]R-l{JjFH۾k[wwp#Y]Ir#YmFưN(2pj:\r.ren??O: 7aF"tZ+U4jYH&TQGzP24/Y YTd+d2Պ7We$t?lDTTY'HP't,#'^6 MP"#Y_+s:=#FOtE^@݁(#n5=j\7qy>X:br6Sb¹4W3'p$! ϲ#X&pGp#X(xH$QM U(DRPM#XPy~WLH^INʽ1zEB#n/ $R(}.ah _>]#Xzqؘ#n>ԑd~N#n&_"c$a䆴C;R_[F#X#nPa$/fG^y|h+eVۜ5QMQ1E`qTr8rhg~^ J T!,(WߕOH~8iWER\}! r$?'pɢkXYshHJ(+4C _܀ b9zEMAGd~Fq¸t|a "M?ٽ6qKT5uC~|4^S3q64n7c?$QT%AiE UD+PhF? ^?Anh͔JcჍ|@x\S^e3:OX96f"3YIwq2{+b:}lH(4ddR;վ6*H Vѐt:tD 0DC^TT-Ed4Rc35#XY1t JwD5ҩ`v`I5(s=(qA&6ƿ"/qrxz՚r`F=d@{46}rV:M=@w==thF#X!S\<1#X - +4@dKI(n}~}7j¾ #n\ŠR׽)Ep~{r*4Su(O_v0P66ybu*k*=ԀjripϟLL_0DC6Kq}]u6[c#XIyc_^Fr0]kUҰKl4"iF(VH:u¡qOCYx*MP!vE*aX**#YMU)N 74<4LD,I:8Pd!Ԍ')e>ykz=H:Kg&.j#YUu_b#Xf*t>N(o*cאS&Z:fM$5NX&ODry RCvZH&_# J@z p$<]{RɽnbJy? D2<)()(NL#X!B{E A]>(#Y{\-lb2AP;#X'i}+F 0,bA݉Ȥ#YE5ݦr_N z)N $0y"CbV%ϣ@,T?!\n1cd#n^BRvX ]7>_m8R@#YTQ;A"fh)I)#n$(VB!I#X(!j%۰PӫӈJ|ǬAQBZTRD;#Yî%YI@B$ Z Zb(EfF!DlR,__'@:+0aػ$.TPG *b)LJD|(xՁ#X 0*LDE0nEOItӷepyGd(ӉA{:`Iq`'F(e^_9؊/4gi@~[;"-0?Q0#nHaGyL@8lFtYllȞ6$#Xv9ytq~e<9BrEO& M##Y-G8 H> =dͿ'o":+#tF92v#XHT0wBrQ^w`4BZdPQ?dddHRJ ")}7GP6r050 e"B ʓY^A$AH';{8sv H l9B\+޲m1똖1A#XR1`HJKȨ̚\sw.#n aM(39ДO}-)êYH7ݰRA)$vC#IB-&z>aД% v#YW"#Y"d^Ө!E WH !.NA?i *3>HhAQPG] eU4dfbѠE6$e mT%#X%0L#Xp'dSGrD`c.pOWN#Y #XinU<*BSG2To(!ABWFID>4(UOPJD #Y쓠@ H_`/#YQ俉Z#{bU4zɦCTETR #YW##XX0u#X;#|ь"#n5Xj J7>xIM!8P/LH9@$OAI-`HC!'P2mu x"sLϫcXI[ND/IJM<6ӓU>:JWTEYd0oZh=#nd0 Ad(T}EP=E }x.P!qգi9P!1vb2A/ytQ<@ ''XMZ$XuF#Y󮁵(j~8 )q2VMy2Fm Oiٍ?œ\+/ӌ,Q0,qO}1rI=̨klfsbeN b9JLg,ȸzg-?҃ G;36X83SZSV@%A4JhUW[ƮTIaMbj\g'65h-wDaaÆN_N&g642fA3l?1B2gJ8R#n9d5}_ MB ';6aQ:yqDso괐5 #Y͆ǭb1ǢM)5#Y/셉uLљu,G#Y~"$r11N}Ă߲ai,$@ #=x1jqw0xcN/i~ ɓ{*nH@m6pwpA{Lڢp-yhhK6#YCM^>l!."Qc[FSwۑ#nH<1۷'<"_0!Z1toGT~苑Y.6#XdrB %T#Yȓ ~>r0#XB#XsJ."cXcap ;=PcqO7"#X›&H9A^;׿i?/JR"[.ݚ+cX>X n^+{С[#X(QT>'d$yi읺sj,!+8H}WI3kQ_j#YRNݑrYSw܌yOّg/H1äyЩv^sOה4^F5^J$޵Yypv%q#6Npݣ<(Қy+o9_c26#Y[޸ٍ{{6ɨdS)T"rͭ=,`dAj[c\1W[*dc\`t:z@S$zYaMaBu&#[҈-68I$*N( 2E$D Ill𕡝/S7.bȍ_g\=f/4#fdBu+BrE4:%#YT$LjJaNS&=9 4sQ0x}FIT68%u#~nEAzyYulVs8{*IF@7ܨyB썠5(*:f(B/!P dp4b76A}ҋ%_yh^R?98+PE U"C(AB ?! 漓6-5]5=<[O\^uO=&ÙMg䚀=Ϧ\4<'9Ӣ7~8'OFC{CKA#Y1y5אz<8Pw'z7KOy#nIEJ#n'H[@( c(21 z<r{C*#XWȔ&9)1"!67NVhF!:@[-hǡ_y c ӅfT4o_9+:ԍ3\z@~x?g8qb`]B=d <}:?%@qTDn+#XW-KV Mų9Ov(%e2}#Yh4q|q Ќ v60'ϳ)ld#nƊ!}߽WF7|^ Aغidh`i5C',dP5 l0Vߗcn433q 2zQY.SE|`6rc4#Xu4 +0qSٷݦ l{^^cȖ1ڤ#X(1ɒHOv(ZݖF3a6sʏL>n~fa8zUKjMQWIpMA*$h#Ysd#nUIXReIe He@P" ݈ͪý9/^k?FB@ʂ)`22$#nf& HIPsobLdL`0O|lbk"#Yyvj{~ZT`Zo0rey18!}!t Oq "ArOS휌;15 `q*dؒCHvT=Y1<,&93(Și ֘cJjEƴig Dr2e6M˜.G:ctM6̍/yhh$۷l%JH $#nZ`c$+M9X` dέawIe*VX3Dt~vHypz&mad"x"<eybtScMC 0n3 jecpkt >"|&urr}JgLLKj[lGEFBi:Hhi$#n^"@#I -3yA Q6oe¶)B{:AҚ'etG8=(6s0\+6 j P;pֹkDHY4V6]cޗc^iim 1#X|Z'7q{3.^Or#n`5AR7:8dGHRͪ:J(} )(P!ÎAk6uWǼzr|t Fϋ=P?1yRI>lN75BA$)A' G&qB``#n"()Q@ECBi#n!I"(6q5L_h% Ć;n|uLDlD.pήF#YAWxCXy;pp:Mߓ"0 fo8qMaĜ$/6oiGlcc t0+jchZg3FM36CX.4!9UJ ŴrHvZ ! u4PD5,SXBj(A55QrlpN;թ;o\tDH2zh!QHpwzU4n4tƞ^!r4aN79s ')x|1SA#n^ybV5maQ# 0kxEsV@& n|H7i(nZڱD&i$%8426ߜ~&*c(*[y2ׁ|f󂦈?!C"$J*G*V`(h;t$bPв0 $Wn_",}CTuf8uxixWD|v(BLI#NF>bdHxxRssS%չ#Y 4#Y<q^wW@U#Y$t;m##.$_O3#XYbсiνӧ&{ډ}7{j[h tK컁|M xWSN pT/51FX#>@`w04XEM%#Y(P-@ĸI?qNRvkvnAMArT9*@ɜa9oyi)B&Jy01Q(,~nm&Pdya}#Xm^ }+#Wԉ7pw.KO#*5Dvv{y4{xxHubs#Y(j"i~Ge =._V_{==;+(ZAK #Y4SHA\Ftq [TEW6E.b2rXivҺ#X:@p N4KJNTehZZiLJiPИbit@:V!ѭBSsE_Pw_Y#HE %ՀO().Ixc|6f #X>yRC_&.#XPN2V'H1)"!A@]\DXQx#XcJN )"LD7`nm9GBI/V !p9h 8rS_Ard()F {kIJ@5[XGuKBnҧ L447v#XuΛapVԿo/ @IE̐4< mX5u8CVHY`Δ&D3p:<EhV*h#X)@PL+#X$I E$*؝t5J$)"c:\:(hiWhڀ1-%31@!zzin~&ZZ-dPsZu)PhpR#Y/5$Nv@3#Y,?Gu-_Sc $\ö֊BHH}O`F+L ȩjH"6T[#YG +$X;; CtX#Yk%ERvus&5ΎhL= P5L\,E1LQ3DBRRS$F(BcxK;!^ObT}?GrY2n~O!<ˑŔp#cMf)ʲ!% 2 _YxA:8[|&j^ab$0$ uO{CJɓǘ̠~p_e֔9t&s+_I?$Mc̽&VGN{ABҘf;pPŨ;^^X“Ѝ`v23%3hm.CF1'#nqfVi ICxóՇ;T:Wǿo$_M&)́&`XVN)PZJ:LRXeg.͹YAWP?cR#Yj4%)#Yg+$d7C|us&e ~nM{\b26YI#6iFLwա+/Ŧ]x7>rc8;]|r MJUÎ9(#nXB{I(N 1Vv7=N'^K܏~˿-+.%CFw-8 0=)ו$cYeWF" 3pB};fS]|t{;}Cӱ¢YVze'YO›wk/LY}t>S6Ue8EQc*Ppb)LJТ3;Db5Dr9jL,s{'MWT6NZgSH%JQN̄1I7+At@Χ׊.ýIwtt-7dh:û[N>UReamd3t:hpYڡUĴ׌kL\կvq>l߂;&ڮ׷沲\4zP)91#Yg'f2\--!BK$h:뾷j=_o7#nc.4e~61y}H-^`VٜQ#nb)H{ԫx}Uphkyi-_ewGNviŅ=`+~B4ϧWå_Pqb3-qcrR0#%69qiJF]#nTָŨsk;?"~GCHep8}3cUCXrE1/ΐ|Ś︦^ݜΞä>>ރlY&4#X`QHidU'3j|@%D6EmsK{Fr//gv|0|uiiAbHvD`#YT7 R=y%2FdpB¿.7w |3"# ӵI`}q#m:2w]:&9p~f33BuJ;b#YWI4#Yn&#Y9ۣҟ)_LFo'{b͡ UĄNM*)ʚY@ l(KV)xш}3$B҉ڔt]*k\Hm ^Sb㚀`^d6O=m/Ry|7Aq"egW :yyi#n$4$q#Ν^)ƖX`rmӳvIHZ!0‹ф CU ٟjk#X`PT |'Н@ D9#Xg#Y`~=c4q&oS%q#X^eG0@́$`A2v8MxÔ=!C|% $DX8n#npW4%cTy2PC/":4b<*cm$'_]{0R`0q֠&#nf@]R),!d N\wȨ+7Q,ƹ>eAqY! =Ee7(RZ-V|74[Cw^qq&J.h#nd>$5.w``h\`?~C3wT"kֹ9 BdoM0zyrf:˾=qLa0N38J#YWge ıt|&~&S͐8vdh8#Pui*9*p_x-h^hs d#X64GZLṵJ<;!#X-XdB6:UTQՎX":f@bΞ;5pz'=)+;/mB(IS^NgzQ\Ŗ\B8=qQ-Q m+=MV<^?s9Q:膫dn/mX3=6ܹ&`1PЙX9vVMüQR|я=9?it8#g!MS^6kݯg5!,<#YC000ߜ!d"&.YC=LN3d7#Ydrz1F@`!SQ5ErB(eO)(TM rt6I}c1ѭ:5syECb6twbJF0cbw+6&ٌ}q=%1E"qFA0sd䕠5my`AhNAn$Dǎ=sTkD--qr(`w۹"#nR6>N#2ZB̆&3+=Bgig$Iʂ)x >-B[j% ⎑]AmD)86Mڧüx F( x)<ƪrg@5z<7hBaQ7!i.!B&9b %X8s`h"%w8QSH]%.!T:NVWxdKA[Ca m=kys#XPP(v Fcj+1j,r3i38>y3^#Y:w3A 2K#nElm #Yj$H7pf.d9'C9D6;_8!FBAqsi> EINpj"$F z\?#YWkQbR>pO91BvxcI<ؠ5,#YEAdD] hmmQE TU}<S g#F 5u٦#IKUܲss76%/W+w!,>Ʉ=#X'$(NMP6!`PQ:2PUUD>uzmИ2&] )04}ꂅW-kJ~O.#Y=Ԇzө@]>:M2oPužcߦ0SZ`l#XK-'d%^@JI$cNy^T ;Pˋ^ j:P4AztésSیh`6a`J 9qΫCY< >YT'tJt0%0TL6I)`]o>KF6}5"bϹrT:mRaQ7`0Π#n)R`&"HGXɵ4S KL 1D$%1#Y+lM j!"T*F(#nh(h&h%$bBm%-@S~8R8`T҉`#nPP5G1P)$*Oگ^*jdJ*Il<%(ہliA3r=H4ثrW i϶Lo5Kw}GSH22#nBRg}Hhg0h|{$.$*"cNyC1merҙkѡޤY-86a-c^8oLL$ĝBJ]A[le5aU\`lxQJƶoch+W Y,Ey(#Y1&n]ňܝkWSTt$&QraUH6ˁ;#Xr!9EUl89IA-0IĴ걳wLΜt@Nr=WyIx@=DF21ȄJǣQըm'gIH|ɥnϛp  >DP:2nS⮷} @,)r~#Y?G.r;eת{F+z)T!wI,0 >31(i AIBP;#0H:& 5V&CH9#n%|HЗ ,$-.r/A" !n4%14_B֟O/ɯ5K:HP!"l驖#XxqJrبo}8Z޿>EwU4#X0~oCB0F#n+HPK'ɤ>c>uSծIom\k t4!NP:'uG1@W5ATM'#n-3o<%OoJho_f^U3mz^I)Nq>f2nꪹf+9ƀrS,˙~kkswɹ6lÏNfN )l!8#nwJekXK<-v#iJ^<1ṶSG1w.6()E.Q#Y.$\bafxĖxlE)B> 8)ߑ6xG/k|6 yыr΢V5ΦyU#Y! VNMbA4p8Դqp#n`9}mITrC_s/amRiH8Тr瞛w-8Q-:Z_Ϫ >MϗCEBt&23 !bT#"#÷j`0VG.& '4ŗt{p|6a#hmK; g#Y&Ì9irvaƸqq!#Gbƹz3YF* t9A0\&}o;s1jslzw#X$V5xJv6ZlQcFI˼=Bx)Cpcnc%aAkL7I:Y}TG!2]Tt0McB!QM-3,Z\#ň; N3>r׹#X.#n!sq3s˙-k|٭,v/zR14Mi;]4s#X_t^) _CfW۱YJ4j}GtUVvv޸p;j fmގ8\K}L\ f@4 p3.iPjJE1ڱ́ Zӯ~t"Pu\$b^{;JNGBH5 c{'BD#XQp,cb4mѪeZO2He$x%4ӫwX{w:QU;cq.WT#Y,p pH+8阋DbGi#nq`ʂ]gK hѨoMi-Gﴶ\"|UwcHKZA:,jd| &/(bk*Ydf=b e͹<`=rO{SPbdp&噞d$t #YvsC,'˚3(`CĨ0Awhp#JCf#Y2al&.KvQϖptd#A"I,2ewT{ ^[[_-xRd%Mμu2ːvQFjv4qaM*%55DO4,XW[d{3a#X-"V8N±RD#HMyLU4&GKw \qs_Bb(L#nNP!9 )`3(HyE"Y%Am.G)pָ rWUDj?%Gy$.kz[~nfE!nl>D1MI'k#XA>/yP\4&'1ɧB~ΥMGUѐtCeጣ0A"R|q5by#XA'˹: 0%0]伇F8=[U8pc6(*4fD#nqbXJY9Cf80f#n-A) Ez $ted)81FR_x5\tC;$hRȃb*i6uð>CrF*{3&ѐ|پ>v9)DG#`h9ELWQS;#Y+h:EG` K`g{Х$01wJC0#nhB#ps~{I80M 8]Dtc t2W+}I/8xc= #n \1oF+#V_vLN{hײ\h'" $)bT<.\4\h9lvX:`ޡycQ#XįAC:$Nϯ*0>T19d! :#Yy#YsLQX)H #XIp~TH8B3yd_ڦ&tZ8Hؗ|A4113!4?$RP*)#YȹLGx0m@#BBpH3Z`a/#Xu:G2h(p9Ж0ic&NG8#nн dNNHO8S#nf \y02#n)Bz70ÅC/=JFqdo,mtnv=*Rk,+m[Gd0 vtq>YNyX  +5Zz˱"4 I:ID#Yҵ~\Gߊd$]T))QchZC}IDP .~t~54p3;sxC9iˣ鄢srneYIEkn 9}.>effKT#nҌkJfNxWW%P[DiL#6&(ZM#Yb8f-/DY|kW b;& }$WSEzKB>,M{yυBsm4394W)iѺ9k)1i61#Yn1S9jh5#Y20pCg ^57z+#Xu3|=&`C,"E9SP}'vH((64bmI62ʙhL=l)ϊ4רRFقNc˲("ΔgMS;f ʏ5~gyr*|nFp5!oX}o >#ظHRO_ #)Ű074]L""ag Lzb.*#nIP<;.ف!AchU4d.0)r\+&YƤ#Y cwwy%#Y#vA-qDq_gHT{^QɯQ?& ;֢?vffV1Vr}TZqڦƈ [#(D:䰅ٮ\LhhX)X"'4d.b뿨S#XPA3P?\PHP ]3wn'&`6! #X2DAHMD"}ҙ@4DBN hC NBWaB$IXy#XPC$ )31A)#n@iE5V]#XihD9#XiG#n#n:F B#nY&XOGjt%e%U4=rtaxH?XnA0̰6Dy%#X4%tO@@#nD#STP/]?Ҽw1m {-xҡHR!D#Y#Y3 #_ǰ;?*H{"wCۇDNwh ۱ŎP*#X )9U2<`j3u;F^mrrNo$: :fkz;x{w^iнFD4OiE9x-Ri2b>DȓFrE>h̋L4Ɲ5uִMkurd  VАɴ#YL&#o:\拠$ipibp-DrKJUxCn#Y'#X* LzLTz8%:X-g*krmb7-G6 +RVfLv[s(-#&mٌF!#Y0U+l1!X$mǁG`I`Hnj y!poCTpD<#n:\81/s&hK#nJj%)Okj9lT):pgZŋni6#n)My#Y#X#XZD(2L("K@恩+U?ٯY;gx4_.vnl\`MjcAQw1Y |q i-@3K"(Moa6rT27aHPz<<ܑAYPāK,ibJHjje̡Q/e!SB(R|2@h%N@4*R-H֑)Rh8dz}P_al#X?x%p+#X 01!BC0M4 U#X+HD)HCA@@#nQxpp᠃2ʑSw] MߡD/^X}R4z}^oGeP!.{ 0tGV T P#Y)J4B&W.>YLv{<5@$ #~P"P|#YS׷/5O85>O9.kxTe|*z@f[ZJ[2F?rkw+U)hES;PeΔ1:ZLatW!С1-8#Y%J,C#ngIf"%LG9AmKA(|\V(Z*%s9 T%2K!"8h^p56VmꩪD\+unur^*r^#nYɖ"NZ1x7Y;&r쎡ShyQnb"tۉ7H6ݔɼLP%A4I(‘J̎#na|,X'02d^iwQה@$AQwnic A}KL@#`iRiIP;۔j‚t^ZptH3hPb9tn qC|MdĔK7'MW9BGI<C؂h`eb'gC9 䝊Xy?'A1vsJ&21bo4FOW{f#neSRHI"^O]*-mZRuq72AKZ5pJa%R`mՠX(\s#Xߓ~ '=a ~1W7Q<H4#X>qhJ=APԐN;e:(%B(5uX#Xwj"-o4AITm[&"eby.\5 \^n.d]ifB#nX"Y D&(PIE(ZUTs҃4TQ_#8ǵQzk@RQARR 1P4LR H%4QTPCLKA !LPSB@rEUOWNȠ*I0?ND.p8ᓘ8 ضRsiD *HaR, ÁI-¸;>9%+c늪#Xy#XpbA;:D(DV]d$#Yt$) #X( (:1GP8!B=p#nǫsښa# F& cx$؇OњWs}iSIDB#HU-c$5Tɂ2 9*M"ala[DF6Ӫjm嬑%+I$A--%CIHmVc1"B#nx_^sHI#nQ.DǩWWM#X~:Ԡ qcr(?K J;)2,bd`xBDRx=*4fRv(x`y,z`|N)'v9a(4~Q)LnQ}&4H@ %3傉P*ϱ rd1h2"Tan̈>qk8g9{k(t6~v*gJAu=o>cZǵb6#Y2C_SXqˤ}7囻wE*t|/K."$~ƚ^u`n˶h!B*XPrn#n#n&oNUQжkXA 9\ŸsEgV,tg[{¿{UrN#Yd,4'dD l j-"l[Dc#XnY8s I;M"v馲J(C6E/P#Xut2} H$1ßKQ]nP0rIaI\⥦&#X8P<\9:/\|DDh10q,NNwr!`D(krAPA.FS9ra)ȝv9c?^ha,kJ} đ~R1f1Å.pĝj 9=m#Yq_pH8#Y4*҃SS:br4Nxtϖ*#<H4Q{ՊPʓUR*m(9\!>a$=;5_@$S7sG@#X5K'98 ]t"Y=,Un'"Ib*jI* -ATDM41' ' \ogf+cdMhA<_#Xׂ-G|gPb=@H(>ǭy}о`CCT?=\Jm#Xؐ 7N~AyF щHҋaLK_יfbQ51TM2tV#XY#X5H68'ci1~B㍫w{iӠ E(ꂛ!#E[:vvB#M8zv;:μC;K#X0Q ph?c;iMQWFս-֤pO&yu(X~DNrųJE+?Dzlq_eVcS$wl'(#n!dx^o|:4O"' gJxE,k@ta7R3qTG_6 :욓lE4&HY'>}z>.jGt75/3=#Y!C[*:P%#X@'|ttP#Y@$JF&"d(eYtxC+;g(Z#Ylb$&1O,^!ch:|t?f#?R.UaBV|$5@Q_V?2~>>PUB20 A!ޘyAʧ:u]:.b{i#nhb#n (SB$#n#XH!*)@d&@iBTO~t?l#XiA8~Y0 CC_Gc1%A8T>~Up6L1#W^60RE%RE#n㷎/qk0+35clv#nU-e~`̔bj$K@JeH+TxȚD>#׼k7nlx!;XCxSٸf`N44BJPwSkppAc#X|zL|9Y<2p9UjcnWS8h ! !P;*#n)kst3Ѐ7^jq2}HI][+)xz?dz BP:GTsǷ+6ej#2 2IsHwx#ȥ1$āi 7_*)ELQ2TR@PHEEK̥:?#Yez@L@=b[J4Y56]Ӵthxؑd8XﵟGIGIwFu (~?m2 胄ufҏe)*qP;̀"'|DQ~Go}.63*(?>L?ş}!ǭxy|)ΟpO'Y0=8)w)[ (<΋}'F<|6Խ%p#n1i)[V AN뀖$7#YЗ]{#XRgq^ï>NLb #e1HV/7 K/j)pzD$?"(H5R) #<== diff --git a/waf.bat b/waf.bat index dac6143c..db5e1d46 100644 --- a/waf.bat +++ b/waf.bat @@ -1,24 +1,20 @@ @echo off rem try fix py2 build -chcp 1252 +chcp 65001 set PYTHONIOENCODING=UTF-8 rem from issue #964 Setlocal EnableDelayedExpansion rem Check Windows Version -set TOKEN=tokens=3* +set TOKEN=tokens=2* ver | findstr /i "5\.0\." > nul if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* ver | findstr /i "5\.1\." > nul if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* ver | findstr /i "5\.2\." > nul if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* -ver | findstr /i "6\.0\." > nul -if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2* -ver | findstr /i "6\.1\." > nul -if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2* rem Start calculating PYTHON and PYTHON_DIR set PYTHON= @@ -29,7 +25,7 @@ Setlocal EnableDelayedExpansion set PYTHON_DIR_OK=FALSE set REGPATH= -for %%i in (3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5) do ( +for %%i in (3.10 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5) do ( for %%j in (HKCU HKLM) do ( for %%k in (SOFTWARE\Wow6432Node SOFTWARE) do ( for %%l in (Python\PythonCore IronPython) do ( @@ -88,7 +84,7 @@ rem @echo %PYTHON_DIR% if "%PYTHON%" == "" ( rem @echo No Python -set PYTHON=python +set PYTHON=py goto running ) diff --git a/wscript b/wscript index 4f98f500..353f9016 100644 --- a/wscript +++ b/wscript @@ -2,16 +2,16 @@ # encoding: utf-8 # a1batross, mittorn, 2018 -from __future__ import print_function -from waflib import Logs, Context, Configure +from waflib import Build, Configure, Context, Logs import sys import os +import re VERSION = '2.4' -APPNAME = 'hlsdk-xash3d' +APPNAME = 'hlsdk-portable' top = '.' -Context.Context.line_just = 55 # should fit for everything on 80x26 +Context.Context.line_just = 60 # should fit for everything on 80x26 @Configure.conf def get_taskgen_count(self): @@ -20,50 +20,30 @@ def get_taskgen_count(self): return idx def options(opt): + opt.load('reconfigure compiler_optimizations xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install msdev msvs msvc subproject') + grp = opt.add_option_group('Common options') grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False, help = 'allow targetting 64-bit engine(Linux/Windows/OSX x86 only) [default: %default]') + grp.add_option('--disable-werror', action = 'store_true', dest = 'DISABLE_WERROR', default = False, + help = 'disable compilation abort on warning') + grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'USE_VOICEMGR', default = False, + help = 'Enable VOICE MANAGER') - grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'VOICEMGR', default = False, - help = 'enable voice manager [default: %default]') - - grp.add_option('--disable-goldsrc-support', action = 'store_false', dest = 'GOLDSRC', default = True, - help = 'disable GoldSource engine support [default: %default]') - - grp.add_option('--enable-simple-mod-hacks', action = 'store_true', dest = 'SIMPLE_MOD_HACKS', default = False, - help = 'enable hacks for simple mods that mostly compatible with Half-Life but has little changes. Enforced for Android. [default: %default]') - - opt.load('compiler_optimizations subproject') - - opt.add_subproject(['cl_dll', 'dlls']) - - opt.load('xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install msdev msvs') - if sys.platform == 'win32': - opt.load('msvc') - opt.load('reconfigure') + opt.add_subproject('dlls') + opt.add_subproject('cl_dll') def configure(conf): - # Configuration - conf.env.GAMEDIR = 'valve' - conf.env.CLIENT_DIR = 'cl_dlls' - conf.env.SERVER_DIR = 'dlls' - conf.env.SERVER_NAME = 'hl' - conf.env.PREFIX = '' - - conf.load('fwgslib reconfigure compiler_optimizations enforce_pic') - - enforce_pic = True # modern defaults - - conf.env.VOICEMGR = conf.options.VOICEMGR - conf.env.GOLDSRC = conf.options.GOLDSRC - - # Force XP compability, all build targets should add - # subsystem=bld.env.MSVC_SUBSYSTEM - # TODO: wrapper around bld.stlib, bld.shlib and so on? - conf.env.MSVC_SUBSYSTEM = 'WINDOWS,5.01' + conf.load('fwgslib reconfigure compiler_optimizations') conf.env.MSVC_TARGETS = ['x86' if not conf.options.ALLOW64 else 'x64'] + # Force XP compatibility, all build targets should add subsystem=bld.env.MSVC_SUBSYSTEM + if conf.env.MSVC_TARGETS[0] == 'x86': + conf.env.MSVC_SUBSYSTEM = 'WINDOWS,5.01' + else: + conf.env.MSVC_SUBSYSTEM = 'WINDOWS' + # Load compilers early conf.load('xcompile compiler_c compiler_cxx') @@ -74,108 +54,138 @@ def configure(conf): if conf.env.COMPILER_CC == 'msvc': conf.load('msvc_pdb') - conf.load('msvs msdev strip_on_install') - - if conf.env.DEST_OS == 'android': - conf.options.GOLDSRC = conf.env.GOLDSRC = False - conf.env.SERVER_NAME = 'server' # can't be any other name, until specified - elif conf.env.DEST_OS in ['nswitch', 'psvita']: - conf.options.GOLDSRC = conf.env.GOLDSRC = False - - if conf.env.MAGX: - enforce_pic = False + conf.load('msvs msdev subproject clang_compilation_database strip_on_install enforce_pic') + enforce_pic = True # modern defaults conf.check_pic(enforce_pic) # We restrict 64-bit builds ONLY for Win/Linux/OSX running on Intel architecture # Because compatibility with original GoldSrc - if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU in ['x86_64']: - conf.env.BIT32_ALLOW64 = conf.options.ALLOW64 - if not conf.env.BIT32_ALLOW64: - Logs.info('WARNING: will build engine for 32-bit target') + if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU == 'x86_64': + conf.env.BIT32_MANDATORY = not conf.options.ALLOW64 + if conf.env.BIT32_MANDATORY: + Logs.info('WARNING: will build game for 32-bit target') else: - conf.env.BIT32_ALLOW64 = True - conf.env.BIT32_MANDATORY = not conf.env.BIT32_ALLOW64 - conf.load('force_32bit library_naming') - - compiler_optional_flags = [ - '-fdiagnostics-color=always', - '-Werror=return-type', - '-Werror=parentheses', - '-Werror=vla', - '-Werror=tautological-compare', - '-Werror=duplicated-cond', - '-Werror=bool-compare', - '-Werror=bool-operation', - '-Wstrict-aliasing', - ] - - c_compiler_optional_flags = [ - '-Werror=implicit-function-declaration', - '-Werror=int-conversion', - '-Werror=implicit-int', - '-Werror=declaration-after-statement' - ] + conf.env.BIT32_MANDATORY = False + + conf.load('force_32bit') cflags, linkflags = conf.get_optimization_flags() + cxxflags = list(cflags) # optimization flags are common between C and C++ but we need a copy - # Here we don't differentiate C or C++ flags - if conf.options.LTO: - lto_cflags = { - 'msvc': ['/GL'], - 'gcc': ['-flto'], - 'clang': ['-flto'] - } - - lto_linkflags = { - 'msvc': ['/LTCG'], - 'gcc': ['-flto'], - 'clang': ['-flto'] - } - cflags += conf.get_flags_by_compiler(lto_cflags, conf.env.COMPILER_CC) - linkflags += conf.get_flags_by_compiler(lto_linkflags, conf.env.COMPILER_CC) - - if conf.options.POLLY: - polly_cflags = { - 'gcc': ['-fgraphite-identity'], - 'clang': ['-mllvm', '-polly'] - # msvc sosat :( - } - - cflags += conf.get_flags_by_compiler(polly_cflags, conf.env.COMPILER_CC) - - # And here C++ flags starts to be treated separately - cxxflags = list(cflags) - if conf.env.COMPILER_CC != 'msvc': - conf.check_cc(cflags=cflags, msg= 'Checking for required C flags') - conf.check_cxx(cxxflags=cflags, msg= 'Checking for required C++ flags') - - cflags += conf.filter_cflags(compiler_optional_flags + c_compiler_optional_flags, cflags) - cxxflags += conf.filter_cxxflags(compiler_optional_flags, cflags) - - # on the Switch and the PSVita, allow undefined symbols by default, - # which is needed for the dynamic loaders to work - # additionally, shared libs are linked without libc + # on the Switch, allow undefined symbols by default, which is needed for libsolder to work + # we'll specifically disallow them for the engine executable + # additionally, shared libs are linked without standard libs, we'll add those back in the engine wscript if conf.env.DEST_OS == 'nswitch': linkflags.remove('-Wl,--no-undefined') conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-nostartfiles']) conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-nostartfiles']) + # same on the vita elif conf.env.DEST_OS == 'psvita': - linkflags.remove('-Wl,--no-undefined') conf.env.append_unique('CFLAGS_cshlib', ['-fPIC']) conf.env.append_unique('CXXFLAGS_cxxshlib', ['-fPIC', '-fno-use-cxa-atexit']) conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-Wl,--unresolved-symbols=ignore-all']) conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-Wl,--unresolved-symbols=ignore-all']) + # check if we need to use irix linkflags + elif conf.env.DEST_OS == 'irix' and conf.env.COMPILER_CC == 'gcc': + linkflags.remove('-Wl,--no-undefined') + linkflags.append('-Wl,--unresolved-symbols=ignore-all') + # check if we're in a sgug environment + if 'sgug' in os.environ['LD_LIBRARYN32_PATH']: + linkflags.append('-lc') + + conf.check_cc(cflags=cflags, linkflags=linkflags, msg='Checking for required C flags') + conf.check_cxx(cxxflags=cxxflags, linkflags=linkflags, msg='Checking for required C++ flags') conf.env.append_unique('CFLAGS', cflags) conf.env.append_unique('CXXFLAGS', cxxflags) conf.env.append_unique('LINKFLAGS', linkflags) + if conf.env.COMPILER_CC != 'msvc' and not conf.options.DISABLE_WERROR: + opt_flags = [ + # '-Wall', '-Wextra', '-Wpedantic', + '-fdiagnostics-color=always', + + # stable diagnostics, forced to error, sorted + '-Werror=bool-compare', + '-Werror=bool-operation', + '-Werror=cast-align=strict', + '-Werror=duplicated-cond', + # '-Werror=format=2', + '-Werror=implicit-fallthrough=2', + # '-Werror=logical-op', + '-Werror=packed', + '-Werror=packed-not-aligned', + '-Werror=parentheses', + '-Werror=return-type', + '-Werror=sequence-point', + '-Werror=sizeof-pointer-memaccess', + '-Werror=sizeof-array-div', + '-Werror=sizeof-pointer-div', + # '-Werror=strict-aliasing', + '-Werror=string-compare', + '-Werror=tautological-compare', + '-Werror=use-after-free=3', + '-Werror=vla', + '-Werror=write-strings', + + # unstable diagnostics, may cause false positives + '-Winit-self', + '-Wmisleading-indentation', + '-Wunintialized', + + # disabled, flood + # '-Wdouble-promotion', + ] + + opt_cflags = [ + '-Werror=declaration-after-statement', + '-Werror=enum-conversion', + '-Werror=implicit-int', + '-Werror=implicit-function-declaration', + '-Werror=incompatible-pointer-types', + '-Werror=int-conversion', + '-Werror=jump-misses-init', + # '-Werror=old-style-declaration', + # '-Werror=old-style-definition', + # '-Werror=strict-prototypes', + '-fnonconst-initializers' # owcc + ] + + opt_cxxflags = [] # TODO: + + cflags = conf.filter_cflags(opt_flags + opt_cflags, cflags) + cxxflags = conf.filter_cxxflags(opt_flags + opt_cxxflags, cxxflags) + + conf.env.append_unique('CFLAGS', cflags) + conf.env.append_unique('CXXFLAGS', cxxflags) + + if conf.env.DEST_OS == 'android': + # LIB_M added in xcompile! + pass + elif conf.env.DEST_OS == 'win32': + a = [ 'user32', 'winmm' ] + if conf.env.COMPILER_CC == 'msvc': + for i in a: + conf.start_msg('Checking for MSVC library') + conf.check_lib_msvc(i) + conf.end_msg(i) + else: + for i in a: + conf.check_cc(lib = i) + else: + if conf.env.GOLDSOURCE_SUPPORT: + conf.check_cc(lib='dl') + conf.check_cc(lib='m') + # check if we can use C99 tgmath if conf.check_cc(header_name='tgmath.h', mandatory=False): + if conf.env.COMPILER_CC == 'msvc': + conf.define('_CRT_SILENCE_NONCONFORMING_TGMATH_H', 1) tgmath_usable = conf.check_cc(fragment='''#include - int main(void){ return (int)sin(2.0f); }''', - msg='Checking if tgmath.h is usable', mandatory=False) + const float val = 2, val2 = 3; + int main(void){ return (int)(-asin(val) + cos(val2)); }''', + msg='Checking if tgmath.h is usable', mandatory=False, use='M') conf.define_cond('HAVE_TGMATH_H', tgmath_usable) else: conf.undefine('HAVE_TGMATH_H') @@ -190,32 +200,48 @@ def configure(conf): elif conf.env.COMPILER_CC == 'owcc': pass else: - conf.env.append_unique('DEFINES', ['stricmp=strcasecmp', 'strnicmp=strncasecmp', '_snprintf=snprintf', '_vsnprintf=vsnprintf', '_LINUX', 'LINUX']) - conf.env.append_unique('CXXFLAGS', ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions']) + conf.env.append_unique('CXXFLAGS', ['-Wno-invalid-offsetof', '-fno-exceptions']) + conf.define('stricmp', 'strcasecmp', quote=False) + conf.define('strnicmp', 'strncasecmp', quote=False) + conf.define('_snprintf', 'snprintf', quote=False) + conf.define('_vsnprintf', 'vsnprintf', quote=False) + conf.define('_LINUX', True) + conf.define('LINUX', True) + + conf.msg(msg='-> processing mod options', result='...', color='BLUE') + regex = re.compile('^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$') + with open('mod_options.txt') as fd: + lines = fd.readlines() + for line in lines: + p = regex.match(line.strip()) + if p: + conf.start_msg("* " + p[3]) + if p[2] == 'ON': + conf.env[p[1]] = True + conf.define(p[1], 1) + elif p[2] == 'OFF': + conf.env[p[1]] = False + conf.undefine(p[1]) + else: + conf.env[p[1]] = p[2] + conf.end_msg(p[2]) + if conf.env.HLDEMO_BUILD and conf.env.OEM_BUILD: + conf.fatal('Don\'t mix Demo and OEM builds!') # strip lib from pattern if conf.env.DEST_OS not in ['android']: - if conf.env.cshlib_PATTERN.startswith('lib'): - conf.env.cshlib_PATTERN = conf.env.cshlib_PATTERN[3:] if conf.env.cxxshlib_PATTERN.startswith('lib'): conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:] - conf.define('BARNACLE_FIX_VISIBILITY', False) - conf.define('CLIENT_WEAPONS', True) - conf.define('CROWBAR_IDLE_ANIM', False) - conf.define('CROWBAR_DELAY_FIX', False) - conf.define('CROWBAR_FIX_RAPID_CROWBAR', False) - conf.define('GAUSS_OVERCHARGE_FIX', False) - conf.define('OEM_BUILD', False) - conf.define('HLDEMO_BUILD', False) - - if conf.env.DEST_OS == 'android' or conf.options.SIMPLE_MOD_HACKS: - conf.define('MOBILE_HACKS', '1') - - conf.add_subproject(["cl_dll", "dlls"]) + conf.load('library_naming') + conf.add_subproject('dlls') + conf.add_subproject('cl_dll') def build(bld): - bld.add_subproject(["cl_dll", "dlls"]) - - + # don't clean QtCreator files and reconfigure saved options + bld.clean_files = bld.bldnode.ant_glob('**', + excl='*.user configuration.py .lock* *conf_check_*/** config.log %s/*' % Build.CACHE_DIR, + quiet=True, generator=True) + bld.add_subproject('dlls') + bld.add_subproject('cl_dll')